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