策略路由设置

2015 年 11 月 18 日

服务器有两个外网连接,eth0上的PPPOE是一个,wlan0是一个。从服务器出的时候默认走的ppp0,这个不用设置就好了。但从wlan0进来的入口就不通,于是学习了一下策略路由的配置,简单记录一下。

  1. 策略路由要处理本机的路由表,不是route -n看到的那种,而是在/etc/iproute2/rt_tables中可以看到的,从1到255最多255个,默认已经有4个了,local/main/default/unspec,这些都不能动
  2. 用nginx在80端口监听,通过
tcpdump -i ppp0 tcp port 80
tcpdump -i wlan0 tcp port 80

同时分析从ppp0和wlan0两个interface的数据包,可以发现:当外网请求走ppp0时,tcp连接很明确的建立了。但从wlan0进入时,出站的数据包走的是ppp0,这就是问题根源

  1. 找到问题根源后,就需要对相应的数据包做处理:
  • /etc/iproute2/rt_tables中增加一个表,我这里叫miroute,注意id不要重复,也不要超过255
  • 在miroute表中增加一个默认出口,走wlan0的路由
ip route add default via 192.168.31.1 table miroute

可以看出,192.168.31.1就是路由IP。此时可以通过

ip route list table miroute

看到新增的这个路由表。

  • 再增加一条内网路由,命令是
ip route add 192.168.31.0/24 via 192.168.31.6 table miroute

意思是所有内网请求都从wlan0网卡出。这句话不加,内网连接是不通的。

  • 将要从wlan0出的数据包都导向miroute这个表,命令是
ip rule add from 192.168.31.6 table miroute

很明显,192.168.31.6就是wlan0口的IP。此时可以通过

ip rule list

看到这次的改动。

  • 试验OK之后,将这三句脚本加到/etc/network/interfaces中启动wlan0的地方,也就是说写成up …… 的形式

按照这样修改之后,服务器就能正确响应来自wlan0的请求了。


本来以为已经搞定了,结果还有后续。在服务器上架了一个vpn,这样服务器上就有eth0/wlan0/ppp0/ppp1等多个interface了,只好又研究了一下iptables。

#添加vpn过来的ip包访问192.168.31.0网段的路由,vpn网段是192.168.10.0
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -d 192.168.31.0/24 -j MASQUERADE -o wlan0

#添加vpn过来的ip包访问internet的路由,走ppp0出口
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -d 0.0.0.0/0 -j MASQUERADE -o ppp0

#添加SS VPS的直通出口,$SERVER_IP是VPS的IP
iptables -t nat -A PREROUTING -s 192.168.10.0/24 -d $SERVER_IP -j RETURN

#添加vpn过来的ip包走透明代理的端口,$LOCAL_PORT是本地ss-redir透明代理端口
iptables -t nat -A PREROUTING -s 192.168.10.0/24 -p tcp -j REDIRECT –to-ports $LOCAL_PORT

至于dns,用chinadns

Top