iptables——标记和路由某些数据包

iptables——标记和路由某些数据包

与此参考相关http://lartc.org/howto/lartc.netfilter.html

我想标记发送到某个端口(为简单起见,为 80)的数据包并将它们路由到 tun0(由 openvpn 创建)。

将wlan0发送到80端口的数据包标记为1

$ iptables -A PREROUTING -i wlan0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1

添加我的表

$ echo 201 mytable >> /etc/iproute2/rt_tables

添加规则,所有标记为 1 的数据包都由 mytable 路由

$ ip rule add fwmark 1 table mytable

添加规则,规定发送到整个互联网的任何数据包都由 tun0 路由

$ ip route add 128.0.0.0/1 via 10.8.0.13 dev tun0 table mytable
$ ip route add 0.0.0.0/1 via 10.8.0.13 dev tun0 table mytable

而且它什么也没做

值得一提的是

1) 当我启动 openvpn 时,它会向表 main 添加一堆路由,这会导致每个数据包都通过 tun0 路由。Ifconfig 显示 tun0 的 inet 为 10.8.0.14,但 OpenVPN 添加的所有路由都是针对 10.8.0.13。OpenVPN 还会添加以下路由

10.8.0.13 dev tun0  proto kernel  scope link  src 10.8.0.14

如果我使用 --route-nopull 运行 OpenVPN 并自己创建路由,但对于 10.8.0.14,它具有完全相同的效果,我不知道 OpenVPN 何时对 10.8.0.13 执行此操作。

2) 我添加到主表的任何路由都运行正常。问题肯定是 iptables 没有标记数据包,或者 ip 规则没有将市场数据包发送到正确的表。很奇怪。

我的当前设置的输出:

$ ip route list table mytable
0.0.0.0/1 via 10.8.0.13 dev tun0 
10.8.0.13 dev tun0  proto kernel  scope link  src 10.8.0.14 
128.0.0.0/1 via 10.8.0.13 dev tun0 

$ ip rule ls
0:  from all lookup local 
32765:  from all fwmark 0x1 lookup mytable 
32766:  from all lookup main 
32767:  from all lookup default 

$ sudo iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       tcp  --  anywhere             anywhere             tcp dpt:http MARK set 0x1

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

显然没有数据包被标记。

之前我使用 iptables 过滤 wlan0 数据包到端口 80。我将其更改为端口 80、全部、443、22 的任何接口

$ sudo iptables -L -v -t mangle
Chain PREROUTING (policy ACCEPT 10341 packets, 15M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       tcp  --  any    any     anywhere             anywhere             tcp dpt:http MARK set 0x1
27110   39M MARK       tcp  --  any    any     anywhere             anywhere             MARK set 0x1
    0     0 MARK       tcp  --  any    any     anywhere             anywhere             tcp dpt:https MARK set 0x1
    0     0 MARK       tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh MARK set 0x1

请注意,iptables 捕获了 39M 的数据包,但没有一个符合端口 80、443 或 22 的规则,尽管我访问了所有这些端口上的服务。非常奇怪。

当我将 --dport 切换为 --sport 时,iptables 开始标记数据包,但仍然没有发生任何事情。我知道 IP 规则是按顺序应用的,因此如果 mytable 中的路由不起作用,则数据包将由表 main 路由。我以为 DNS 查找可能存在问题,但我将 resolv.conf 名称服务器设置为 Google DNS,但没有任何变化。

有没有办法使用命令行查看我的外部 IP,而无需进行 DNS 查找?我使用的是

$ curl 141.101.127.36 | grep "Your IP address"

并从 cloudflare dns 错误页面获取数据,但可能有更官方的方法。

相关内容