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

我想让某个用户有一个特定的源IP地址。 为此,我向networking接口添加了辅助IP地址,并试图使用ip6tables和策略路由来强制使用源IP。 概要:

  • 所有IPv6stream量都通过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 

由于某些原因,所有stream量仍然有2001:db8::2源地址。 我可以看到, ip6tables规则被击中,但源IP仍然是错误的。 使用NFLOG目标+ Wireshark和curl ip.appspot.com

任何想法我做错了什么?

编辑:首先误解了你的post,重写了答案。

在进行路由时,不要更改数据包内容,只需select正确的界面即可。 所以这不会改变你得到的源IP地址。 它会去正确的路由表和正确的界面,但是这一切。 要做到这一点,你需要NAT

所以你需要伪装POSTROUTING,例如:

 /sbin/ip6tables -A POSTROUTING -t nat -m mark --mark 123 -j SNAT --to-source 2001:db8::3