根据系统用户更改源 IP 地址

根据系统用户更改源 IP 地址

我想让某个用户拥有一个特定的源 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

相关内容