-
策略分流一般以一个接口作为默认接口,例如 eno1,该接口正常配置即可,例如从 DHCP 获取;另一个接口在匹配策略时被使用,例如 eno2,该接口建议使用手动配置,只配置 IP 地址和子网掩码即可,网关不需配置。如不采用手动配置,需注意
metric
值,以免默认路由规则被 eno2 取代。 -
配置内核转发功能,配置 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
-
建立分流策略,此处以 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
注意策略需建立在
PREROUTING
和OUTPUT
上,有文章写的是建立在POSTROUTING
上,我没有验证。
此处使用 iptables 匹配策略,符合策略的数据包将被打上标记,进入内核路由过程时将根据标记作为策略进行路由。 -
建立路由策略
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 接口而无法连接,副作用未知。 -
修改接口 eno2 的源地址校验策略
sysctl net.ipv4.conf.eno2.rp_filter=2
rp_filter
参数有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。系统默认为 1,但由于系统默认路由并非从 eno2 出发,会造成返回数据包被内核丢弃,实际表现为 ping 不通,但 tcpdump 可以看到回包