V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
neroanelli
V2EX  ›  问与答

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

  •  
  •   neroanelli · 2014-07-12 12:28:03 +08:00 · 6143 次点击
    这是一个创建于 3792 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近研究智能路由,在路由器上连接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的原因。
    第 1 条附言  ·  2014-07-12 21:22:41 +08:00
    感谢回帖的网友,现在已经找到原因。
    因为我使用了nwan,同时也对nwan脚本做了修改,所有iptables规则和ip route的情况稍显复杂。
    最终原因是在vpn的路由表中没有添加本地设备的路由,只需在vpn的路由表中添加:
    ip route replace $lan_subnet dev $lan_dev table vpn
    比如:
    ip route replace 192.168.1.0/24 dev br-lan table GFWVPN_rt
    感谢大家,感谢@pheyx
    21 条回复    2014-07-12 21:20:54 +08:00
    pheyx
        1
    pheyx  
       2014-07-12 12:58:33 +08:00   ❤️ 1
    正好我跟你的做法类似,以下是我的脚本,有些地方如接口名称等等还需你改成和你的设置一样。
    /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
        2
    pheyx  
       2014-07-12 13:13:53 +08:00
    另外还需将你的lan网段加到whitelist里
    tywtyw2002
        3
    tywtyw2002  
       2014-07-12 13:27:14 +08:00 via iPhone
    ip rule里面有优先级吧,我偏向于用ip rule
    neroanelli
        4
    neroanelli  
    OP
       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
        5
    neroanelli  
    OP
       2014-07-12 14:14:30 +08:00
    @tywtyw2002
    我的ip rule list当中,from all fwmark 0x8 lookup VPN_rt 这个是最高优先级。所以应该不是这个问题。
    pheyx
        6
    pheyx  
       2014-07-12 14:28:32 +08:00
    @neroanelli
    -A OUTPUT 那句是路由器本身翻墙用的,$set是我粘贴没改过来,应该是whitelist。
    tywtyw2002
        7
    tywtyw2002  
       2014-07-12 14:30:55 +08:00 via iPhone
    ip rule show 一下看看
    neroanelli
        8
    neroanelli  
    OP
       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
        9
    neroanelli  
    OP
       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
        10
    jasontse  
       2014-07-12 18:45:18 +08:00 via iPad
    @neroanelli 有做 NAT 吗
    jasontse
        11
    jasontse  
       2014-07-12 18:48:55 +08:00 via iPad
    @neroanelli
    iptables -t nat -A POSTROUTING -o pppX -j MASQUERADE
    neroanelli
        12
    neroanelli  
    OP
       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
        13
    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
        14
    jasontse  
       2014-07-12 19:23:20 +08:00 via iPad   ❤️ 1
    @neroanelli
    无法翻是什么意思,不通还是不生效?
    neroanelli
        15
    neroanelli  
    OP
       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
        16
    pheyx  
       2014-07-12 20:25:16 +08:00
    @neroanelli
    请你列一下这个命令的输出:
    ip route list table GFWVPN_rt
    neroanelli
        17
    neroanelli  
    OP
       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
        18
    pheyx  
       2014-07-12 20:45:18 +08:00   ❤️ 1
    @neroanelli
    这样的话就清楚了,应该照我上面那个回复在GFWVPN_rt这个路由表添加一条路由:
    ip route replace 192.168.1.0/24 dev br-lan table GFWVPN_rt
    (其中192.168.1.0 是lan网段,参照你自己的修改。)
    没这条路由的话在这个路由表里访问不了lan里的机器的。
    neroanelli
        19
    neroanelli  
    OP
       2014-07-12 20:52:36 +08:00
    @pheyx
    哇哈。非常感谢,果然是这个原因,现在妥妥的了。我对ip route 不是很熟悉。请教一下这个是为什么会这样呢?而为什么白名单模式能正常?
    感谢!!!
    pheyx
        20
    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的设置里头是否是默认路由有些关系。
    neroanelli
        21
    neroanelli  
    OP
       2014-07-12 21:20:54 +08:00
    @pheyx
    恩,说错了,是黑名单模式有效。我题目中所说的第一种情况。
    由于我是多拨,使用了自己修改的nwan。
    感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.