Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Iptables netfilter数据包与策略路由_Linux_Networking_Iptables_Netfilter_Iproute - Fatal编程技术网

Linux Iptables netfilter数据包与策略路由

Linux Iptables netfilter数据包与策略路由,linux,networking,iptables,netfilter,iproute,Linux,Networking,Iptables,Netfilter,Iproute,我对路由/iptables管道中的事件顺序有疑问。我首先解释我的设置。问题在这篇文章的末尾 我在Linux 4.4上使用策略路由和iptables 我有两个接口:wan0(指向我的ISP)和vpn加密(指向vpn提供商的tun设备) 我想有选择地将一些流量路由到vpn,其他一切都通过wan0 我实现策略路由如下: 在mangle输出表中,我为新流量设置了一个标记0xC 匹配一些模式。出于测试目的,我标记指向的流量 特定IP地址(37.9.239.33)。当然,我还有其他iptables的东西,

我对路由/iptables管道中的事件顺序有疑问。我首先解释我的设置。问题在这篇文章的末尾

我在Linux 4.4上使用策略路由和iptables

我有两个接口:wan0(指向我的ISP)和vpn加密(指向vpn提供商的tun设备)

我想有选择地将一些流量路由到vpn,其他一切都通过wan0

我实现策略路由如下:

  • 在mangle输出表中,我为新流量设置了一个标记0xC 匹配一些模式。出于测试目的,我标记指向的流量 特定IP地址(37.9.239.33)。当然,我还有其他iptables的东西,比如MASQUEARADE,但这与这个问题无关

    我有一个iproute2规则,它将所有“标记”的数据包发送到 vpn:

    0:从所有本地查找
    190:从所有fwmark 0x4/0x4查找vpn
    400:从所有fwmark 0x8/0x8 oif wan0无法访问
    32766:从所有查找主目录
    32767:从所有查找默认值

    vpn表仅包含一条规则,并通过vpn发送所有内容:

    默认通过10.33.0.1 dev vpn加密原型src 10.33.148.125

我使用命令
ping-c337.9.239.33
进行测试,其中37.9.239.33是标记为vpn的IP地址。连接到wan0和vpn crypto的两个tcpdump会话表明,数据包有效地通过vpn crypto传出和返回,正如预期的那样!到目前为止一切正常

然而,当记录数据包在iptables中流动时,我观察到了一个我不理解的奇怪行为:我在FILTER.OUTPUT表和MANGLE.POSTROUTING表中插入日志跟踪

我观察到这一系列事件:


FILTER.OUTPUT:IN=OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=26960 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=1 MARK=0xc
MANGLE.POSTROUTING:IN=OUT=vpn加密SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=26960 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=1 MARK=0xc
MANGLE.POSTROUTING:IN=OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27049 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2
FILTER.OUTPUT:IN=OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27100 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2 MARK=0xc
MANGLE.POSTROUTING:IN=OUT=vpn加密SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27100 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=2 MARK=0xc
MANGLE.POSTROUTING:IN=OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27193 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3
FILTER.OUTPUT:IN=OUT=wan0 SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27237 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3 MARK=0xc
MANGLE.POSTROUTING:IN=OUT=vpn加密SRC=59.189.21.112 DST=37.9.239.33 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27237 DF PROTO=ICMP TYPE=8 CODE=0 ID=9649 SEQ=3 MARK=0xc

  • 由于MANGLE.OUTPUT中的标记,我期望重新路由决定 发生在FILTER.OUTPUT之前,但似乎发生在FILTER.OUTPUT之后!事实上,所有FILTER.OUTPUT数据包仍然通过wan0路由,这表明尚未做出任何重新路由决定。关于这一点,网络上可用的文档分为50/50。 例如:

    • ,, 第6章表6-2说明了在filter.output之前发生的重路由决策

    • ,表示重新路由决定在filter.output之后发生

    哪一个是正确的?有人能解释一下吗

  • 在3次ping的上下文中,在MANGLE.POSTROUTING表中,我看到2个通过wan0路由的意外数据包,它们是“未标记”的,似乎是 通过vpn加密路由的副本。为什么会这样?此外,根据tcpdump,这些数据包永远不会到达接口(这是正确的)

    有人能解释一下这种行为吗


  • 据我所知,绿色的
    OUTPUT
    链说明了
    mangle
    表位于
    filter
    表之前。是的,我同意mangle.OUTPUT先于filter。我的第一个问题是,重新路由决定是在filter.output之前还是之后发生的?我一直在搜索整个互联网,我也找不到你问题的答案。我非常有兴趣了解在过滤器的输出链之后是否会发生任何路由决策。据我所知,绿色的
    Output
    链将
    mangle
    表说明为
    Filter
    表之前。是的,我同意mangle.Output先于Filter。我的第一个问题是,重新路由决定是在filter.output之前还是之后发生的?我一直在搜索整个互联网,我也找不到你问题的答案。我非常有兴趣了解在过滤器的输出链之后是否发生任何路由决策。