我的家庭服务器有两个主要接口,eth1
(标准Internet连接)和tun0
(OpenVPN隧道)。我想iptables
强制UID 1002拥有的本地进程生成的所有数据包都通过退出tun0
,而所有其他数据包都通过退出eth1
。
我可以轻松标记匹配的数据包:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
现在,我想在POSTROUTING链(可能是mangle表)中放置一些规则,以匹配标记为11的数据包并将其发送到tun0
,然后是匹配所有数据包并将其发送到的规则eth1
。
我找到了ROUTE目标,但这似乎只重写了源接口(除非我读错了它)。
iptables有能力做到这一点吗?我是否必须弄乱路由表(通过ip route
或仅通过旧route
命令)?
编辑:我认为也许我应该提供更多信息。我目前没有其他iptables规则(尽管我将来可能会创建一些规则来执行无关的任务)。同样,输出ip route
为:
default via 192.168.1.254 dev eth1 metric 203
10.32.0.49 dev tun0 proto kernel scope link src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.73 metric 203
我没有碰过路由表-这就是目前的样子(尽管看起来很脏)。抱歉,route
这台计算机上没有安装旧命令。
并且ip addr
(当然,可以忽略eth0和eth2 的输出-它们是目前不使用的NIC):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/none
inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0
编辑:我已经有点工作,但它不转发标记的数据包到tun0。基本上,我添加了一个表(11),并使用了:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
当我刚sudo -u user1000 wget -qO- whatismyip.org
获得时,我获得了我家的外部IP地址,但是如果sudo -u user1002 wget -qO- whatismyip.org
获得了,我也获得了我家的IP地址(但我应该在OpenVPN隧道的另一端获得IP)。
运行iptables -vL
确认数据包已被标记规则匹配,但它们似乎未遵循路由规则。
编辑:我已经花了很长时间了,尽管它仍然无法正常工作,但我想我离这儿还很近。
iptables规则必须在mangle
表的OUTPUT链中。我想我还需要nat
表的POSTROUTING链中的MASQUERADE规则来设置源地址。但是,OUTPUT的混乱之后发生的重新路由不能正常工作。
我现在已经花了5个小时了,所以我要休息一下,可能会在今晚晚些时候或明天的某个时候返回。