与此参考相关http://lartc.org/howto/lartc.netfilter.html
我想标记发送到某个端口的数据包(为简单起见,80)并将它们路由到tun0(由openvpn创build)。
将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
Annndd它什么都不做
一些值得一提的事情
1)当我启动openvpn时,它添加了一堆路由到表主,这导致每个数据包通过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并自己创build路由,但对于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
请注意,39M的数据包被iptables捕获,但是没有一个匹配端口80,443或22的规则,即使我访问了所有这些端口上的服务。 很奇怪。
Iptables开始标记数据包时,我切换到 – 运输,但仍然没有发生。 我知道ip规则是按顺序应用的,所以如果mytable中的路由不工作,那么数据包将被table main路由。 我以为DNS查找可能会有问题,但我将resolv.conf名称服务器设置为Google DNS,没有任何更改。
有没有办法看到我的外部IP使用命令行,没有一个DNS查找? 我正在使用
$ curl 141.101.127.36 | grep "Your IP address"
从cloudflare的dns错误页面获取数据,但可能有一个更正式的方式。