使用防火墙标记和 IP 规则针对特定用户制定不同的路由规则

使用防火墙标记和 IP 规则针对特定用户制定不同的路由规则

在 amd64 上运行 Ubuntu 12.10。

我正在尝试为特定用户设置不同的路由规则。我知道正确的方法是创建一个防火墙规则来标记该用户的数据包,并为该标记添加路由规则。为了进行测试,我添加了一条将所有数据包视为不可访问而丢弃的规则:

# ip rule
0:  from all lookup local
32765:  from all fwmark 0x1 unreachable
32766:  from all lookup main
32767:  from all lookup default

有了这条规则,所有表中的所有防火墙链都为空,并且策略为 ACCEPT,我仍然可以像任何用户一样 ping 远程主机。

如果我添加一条规则来标记所有数据包并尝试 ping Google,它会按预期失败

# iptables -t mangle -F OUTPUT
# iptables -t mangle -A OUTPUT -j MARK --set-mark 0x01
# ping www.google.com
ping: unknown host www.google.com

如果我将此规则限制给VPN用户,似乎没有效果。

# iptables -t mangle -F OUTPUT
# iptables -t mangle -A OUTPUT -j MARK --set-mark 0x01 -m owner --uid-owner vpn
# sudo -u vpn ping www.google.com
PING www.google.com (173.194.78.103) 56(84) bytes of data.
64 bytes from wg-in-f103.1e100.net (173.194.78.103): icmp_req=1 ttl=50 time=36.6 ms

但看起来标记正在被设置,因为如果我添加一条规则在防火墙中删除这些数据包,它就会起作用:

# iptables -t mangle -A OUTPUT -j DROP -m mark --mark 0x01
# sudo -u vpn ping www.google.com
ping: unknown host www.google.com

我遗漏了什么?谢谢!

答案1

Ping 是 setuid,因此它有权构造 ICMP 数据包 - 大概这也阻止它拾取防火墙标记。如果我在测试箱上尝试此操作,并在测试用例中使用 dig 或 telnet,策略路由似乎可以正常启动。

相关内容