爱折腾的孩纸

iptables+fwmark 策略路由要点

  1. 策略分流一般以一个接口作为默认接口,例如 eno1,该接口正常配置即可,例如从 DHCP 获取;另一个接口在匹配策略时被使用,例如 eno2,该接口建议使用手动配置,只配置 IP 地址和子网掩码即可,网关不需配置。如不采用手动配置,需注意 metric 值,以免默认路由规则被 eno2 取代。

  2. 配置内核转发功能,配置 iptables 相应接口的 FORWARD 策略以及 SNAT

    sysctl net.ipv4.ip_forward=1
    iptables -A FORWARD -i wg0 -o eno1 -j ACCEPT
    iptables -A FORWARD -i wg0 -o eno2 -j ACCEPT
    iptables -A FORWARD -i eno1 -o wg0 -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -i eno2 -o wg0 -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
    iptables -t nat -A POSTROUTING -o eno2 -j MASQUERADE
    
  3. 建立分流策略,此处以 ipset 为例

    ipset -N telecom hash:net maxelem 65536
    iptables -t mangle -A PREROUTING -m set --match-set telecom dst -j MARK --set-mark 100
    iptables -t mangle -A OUTPUT -m set --match-set telecom dst -j MARK --set-mark 100
    

    注意策略需建立在 PREROUTINGOUTPUT 上,有文章写的是建立在 POSTROUTING 上,我没有验证。
    此处使用 iptables 匹配策略,符合策略的数据包将被打上标记,进入内核路由过程时将根据标记作为策略进行路由。

  4. 建立路由策略

    ip route flush table 100
    ip rule add from 192.168.11.2 lookup 100
    ip rule add fwmark 100 lookup 100
    ip route add default via 192.168.11.1 dev eno2 proto static table 100
    ip route flush cache
    

    代码中 192.168.11.1 为接口 eno2 的网关地址。
    此时默认表中 default 路由指向 eno1,我们新建的 100 号表中,default 路由指向 eno2。通过 ip rule,符合 fwmark=100 的数据包走 100 号表,达到分流的目的。
    ip rule add from 192.168.11.2 lookup 100 这句中的 192.168.11.2 是 eno2 的 IP,不写这句的话从 11 段进来的链接会因默认路由的关系导致回包错误地发到 eno1 接口而无法连接,副作用未知。

  5. 修改接口 eno2 的源地址校验策略

    sysctl net.ipv4.conf.eno2.rp_filter=2
    

    rp_filter 参数有三个值,0、1、2,具体含义:
    0:不开启源地址校验。
    1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
    2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。

    系统默认为 1,但由于系统默认路由并非从 eno2 出发,会造成返回数据包被内核丢弃,实际表现为 ping 不通,但 tcpdump 可以看到回包

评论