我想让某个用户拥有一个特定的源 IP 地址。为此,我向网络接口添加了一个辅助 IP 地址,并尝试使用 ip6tables 和策略路由来强制执行源 IP。摘要:
- 所有 IPv6 流量都通过 IPv4 OpenVPN 接口(tap0)路由,网关是
2001:db8::1
。 - 如果用户是
someuser
,则源地址必须是2001:db8::3
- 否则,源地址为
2001:db8::2
。
默认路由和地址设置如下:
ip -6 addr add 2001:db8::2/112 dev tap0
ip -6 route add default via 2001:db8::1 src 2001:db8::2 dev tap0
对于someuser
路由器,我标记所有传出的数据包,并尝试使用单独的路由表将这些数据包路由到不同的源地址。这些设置如下:
ip6tables -t mangle -A OUTPUT -m owner --uid-owner someuser -j MARK --set-mark 123
ip -6 rule add fwmark 123 table 1002
ip -6 addr add 2001:db8::3/112 dev tap0
ip -6 route add default via 2001:db8::1 src 2001:db8::3 dev tap0 table 1002
由于某种原因,所有流量仍然具有2001:db8::2
源地址。我可以看到规则ip6tables
被命中,但源 IP 仍然错误。使用 NFLOG 目标 + Wireshark 和 进行了验证curl ip.appspot.com
。
知道我做错了什么吗?
答案1
编辑:一开始误解了你的帖子,重写了答案。
当你进行路由时,你不会改变数据包内容,你只需选择正确的接口将其转发到。所以这不会改变你得到的源 IP 地址。它会转到正确的路由表和正确的接口,但仅此而已。要做到这一点,你需要NAT。
因此,您需要在 POSTROUTING 中进行伪装,例如:
/sbin/ip6tables -A POSTROUTING -t nat -m mark --mark 123 -j SNAT --to-source 2001:db8::3