最近无聊在家,又因为疫情不能回到学校,但是时不时需要使用校园网内网资源查文献。鉴于使用VPN连接到校内跳板机后就相当于“完完全全”地连接到校园网了,理论上可用,但是!校内跳板机的上传带宽只有3Mbps!这个速度也就只能查查文献了。如果设备的所有流量都走校园网不仅延迟大而且速度慢,想同时听听音乐就显得不可能了。所以,决心研究一下策略路由,校园网流量才走VPN,其他流量走默认网关!
网络环境
目前局域网设备有:
(局域网:10.0.0.0/8)
10.0.0.1:电信出口网关(默认网关为电信外网网关)
10.0.0.2:校园网出口网关(默认网关为校园网网关)
10.0.0.172:策略路由虚拟机(已经配置好根据数据包的destination进行分流)
10.0.8.1:子网网关,(子网为192.168.200.0/24,默认网关为10.0.0.1,因为有端口映射,所以不能更改,10.0.0.1必须和本机直接连通,中间不能路由)
10.1.1.1:Samba服务器(默认网关10.0.0.1)
解决方案
方案1:NAT(失败)
192.168.200.0/24子网的数据包,通过子网网关进行NAT,再通过路由表发出。
失败原因:因为子网网关的默认网关为10.0.0.1(电信出口),而数据包的NAT过程发生在iptables的POSTROUTING链,此时数据包已经通过路由表了。也就是说,NAT后数据包就通过默认路由直接发出了,即发到电信出口了,并没有通过策略路由的路由器。
还试过NAT+标记数据包的方法,即在一条自定义链中,数据包NAT后即标记它。但是同样的,因为NAT发生在路由后,所以再怎么标记,也没机会根据标记路由了。
方案2:策略+NAT(成功)
源地址为192.168.200.0/24的数据包发到子网网关时,即进入路由表,路由到10.0.0.172,然后10.0.0.172和两个网关分别再配置指向192.168.200.0/24的路由即可。子网网关具体配置如下:
ip route add default via 10.0.0.172 table 100
ip rule add from 192.168.200.0/24 table 100 pref 1002
但是问题也随之而来。这样配置,子网能正常进行分流,但是无法访问10.0.0.0/8的资源!如无法连接上10.1.1.1的Samba服务器。为什么呢:
因为防火墙的原因,10.0.0.1对SYN Flood的防护会使得不会允许大量的SYN包“单向”通过,导致数据包的丢弃。
当然解决办法也是有的,即再子网网关再加一个NAT规则即可。所有来自192.168.200.0/24且发往10.0.0.0/8的数据包,走路由表main,进行NAT。
最终配置
子网网关10.0.8.1:
# 路由表100的默认路由为10.0.0.172:
ip route add default via 10.0.0.172 table 100
# 来自子网,发往10.0.0.0/8的走默认路由,优先级为1000:
ip rule add from 192.168.200.0/24 to 10.0.0.0/8 table main pref 1000
# 来自子网的其他流量走路由表100:
ip rule add from 192.168.200.0/24 table 100 pref 1001
# 去往10.0.0.0/8进行NAT
iptables -t nat -I POSTROUTING -s 192.168.200.0/24 -d 10.0.0.0/8 -j MASQUERADE
策略路由10.0.0.172:
# 配置指向192.168.200.0/24的路由:
ip route add 192.168.200.0/24 via 10.0.8.1
电信网关10.0.0.1:
# 配置指向192.168.200.0/24的路由:
ip route add 192.168.200.0/24 via 10.0.0.172
校园网网关10.0.0.2:
# 配置指向192.168.200.0/24的路由:
ip route add 192.168.200.0/24 via 10.0.0.172