iptables 配合 ipet nethash 不工作的情况求解?

2014-07-12 12:28:03 +08:00
 neroanelli
最近研究智能路由,在路由器上连接pptp,然后在路由器中执行了以下脚本:
ipset -N vpn iphash
ipset -A vpn 8.8.8.8 #这个是需要走pptp的ip
接着在mangle表中添加了以下规则:
iptables -t mangle -A PREROUTING -m set --match-set vpn dst -j MARK --set-mark 8
最后添加:
ip rule add fwmark 8 table vpn_rt
智能路由匹配工作妥妥的。

但是:
如果我使用以下脚本:
ipset -N whitelist nethash
ipset -A whitelist 150.121.0.0/16 #这个是国内白名单的net
接着在mangle表中添加了以下规则:
iptables -t mangle -A PREROUTING -m set ! --match-set whitelist dst -j MARK --set-mark 8
最后添加:
ip rule add fwmark 8 table vpn_rt #vpn_rt为vpn的路由表
智能路由就工作不成功了。

现在就是不知道是不是应该第一种情况使用的是ipset的iphash,而第二种情况使用的是nethash的原因;也不知道是不是 ! --macth-set的原因。
6141 次点击
所在节点    问与答
21 条回复
pheyx
2014-07-12 12:58:33 +08:00
正好我跟你的做法类似,以下是我的脚本,有些地方如接口名称等等还需你改成和你的设置一样。
/etc/firewall.user:


iptables -A PREROUTING -t mangle -m set ! --match-set whitelist dst -j MARK --set-mark 8
iptables -A OUTPUT -t mangle -m set ! --match-set $set dst -j MARK --set-mark 8

ip rule add fwmark 8 table vpn


这是/etc/hotplug.d/iface/30-routes:(系统在接口状态发生生变化时执行该脚本)

#!/bin/sh

if [ "$ACTION" = "ifdown" -a "$INTERFACE" = "vpn" ]
then
ip route replace default dev pppoe-wan
fi

if [ "$ACTION" = "ifup" -a "$INTERFACE" = "vpn" ]
then
ip route replace default dev pptp-vpn table vpn
ip route replace default dev pppoe-wan

fi
pheyx
2014-07-12 13:13:53 +08:00
另外还需将你的lan网段加到whitelist里
tywtyw2002
2014-07-12 13:27:14 +08:00
ip rule里面有优先级吧,我偏向于用ip rule
neroanelli
2014-07-12 14:11:43 +08:00
@pheyx
好的谢谢,我等一下测试一下。
我没有添加lan的网段在whitelist中,也没有iptables -A OUTPUT -t mangle -m set ! --match-set $set dst -j MARK --set-mark 8这句,不知道是不是问题的原因所在。
neroanelli
2014-07-12 14:14:30 +08:00
@tywtyw2002
我的ip rule list当中,from all fwmark 0x8 lookup VPN_rt 这个是最高优先级。所以应该不是这个问题。
pheyx
2014-07-12 14:28:32 +08:00
@neroanelli
-A OUTPUT 那句是路由器本身翻墙用的,$set是我粘贴没改过来,应该是whitelist。
tywtyw2002
2014-07-12 14:30:55 +08:00
ip rule show 一下看看
neroanelli
2014-07-12 15:09:09 +08:00
@tywtyw2002
0: from all lookup local
32758: from all fwmark 0x8 lookup GFWVPN_rt
32759: from xx.xx.xxx.xx lookup GFWVPN_rt
32760: from all fwmark 0x1e lookup wan2_rt
32761: from xx.xx.xx.xx lookup wan2_rt
32762: from all fwmark 0x14 lookup wan1_rt
32763: from xx.xx.xx.xx lookup wan1_rt
32764: from all fwmark 0xa lookup wan_rt
32765: from xx.xx.xx.xx lookup wan_rt
32766: from all lookup main
32767: from all lookup default
neroanelli
2014-07-12 16:02:49 +08:00
@pheyx
我刚刚测试了一下,不知道为什么我路由器本身可以直接翻,但是路由下的机器没办法翻。
在mangle表中,我的规则如下:
iptables -t mangle -A PREROUTING -m set ! --match-set whitelist dst -j MARK --set-mark 8
iptables -t mangle -A OUTPUT -m set ! --match-set whitelist dst -j MARK --set-mark 8
同时我也将我的lan网段添加到了whitelist中。
感谢!
jasontse
2014-07-12 18:45:18 +08:00
@neroanelli 有做 NAT 吗
jasontse
2014-07-12 18:48:55 +08:00
@neroanelli
iptables -t nat -A POSTROUTING -o pppX -j MASQUERADE
neroanelli
2014-07-12 19:08:19 +08:00
@jasontse
做了,以下是NAT表中的两条
-A delegate_postrouting -o pptp-GFWVPN -j zone_wan_postrouting
-A zone_wan_postrouting -j MASQUERADE

现在就是找不到原因啊,应该是iptables的什么规则没有设置好,因为我使用了nwan,我也把nwan的很多脚本代码都修改了。现在的情况就是使用黑名单模式工作很正常,但是使用白名单模式就无法正常工作。
pheyx
2014-07-12 19:13:58 +08:00
@neroanelli
试着运行这一句,再看看:
ip route replace $lan_subnet dev $lan_dev table vpn

其中lan_subnet是lan网段,lan_dev是lan 口设备名称,一般是br-lan
jasontse
2014-07-12 19:23:20 +08:00
@neroanelli
无法翻是什么意思,不通还是不生效?
neroanelli
2014-07-12 20:13:09 +08:00
@jasontse
不通。我举个例子吧,由于我添加了OUTPUT的iptables规则,所以我在路由的ssh中,可以直接wget youtube.com,也可以traceroute youtube.com,都能正确下载或者走我vpn的路由。而我使用了whitelist的iptables规则(iptables -A PREROUTING -t mangle -m set ! --match-set whitelist dst -j MARK --set-mark 8),在路由下面的机器都无法访问youtube,同时traceroute直接超时。

但是,最郁闷的是,我使用白名单模式,就是
iptables -A PREROUTING -t mangle -m set --match-set blacklist dst -j MARK --set-mark 8
所有一切都非常正常。
pheyx
2014-07-12 20:25:16 +08:00
@neroanelli
请你列一下这个命令的输出:
ip route list table GFWVPN_rt
neroanelli
2014-07-12 20:33:44 +08:00
@pheyx
root@OpenWRT /root [#] ip route list table GFWVPN_rt
default via 198.18.133.24 dev pptp-GFWVPN
pheyx
2014-07-12 20:45:18 +08:00
@neroanelli
这样的话就清楚了,应该照我上面那个回复在GFWVPN_rt这个路由表添加一条路由:
ip route replace 192.168.1.0/24 dev br-lan table GFWVPN_rt
(其中192.168.1.0 是lan网段,参照你自己的修改。)
没这条路由的话在这个路由表里访问不了lan里的机器的。
neroanelli
2014-07-12 20:52:36 +08:00
@pheyx
哇哈。非常感谢,果然是这个原因,现在妥妥的了。我对ip route 不是很熟悉。请教一下这个是为什么会这样呢?而为什么白名单模式能正常?
感谢!!!
pheyx
2014-07-12 21:12:51 +08:00
@neroanelli
因为一旦ip rule 强制那些源或目地ip符合规则的包进入某个路由表,在你的情况是GFWVPN_rt这张表,这些包的命运只决定于这张表而不是main表。虽然main 表里有指向192.168.1.0/24的路由,但它对这些包不起作用。所以GFWVPN_rt里必须有跟main表里的192.168.1.0网段路由一致的那条路由。
你的白名单模式有效,具体原因不太清楚,可以ip route list table ?? 看看,另外可能和你的pptp
vpn的设置里头是否是默认路由有些关系。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/122286

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX