Я хочу, чтобы у определенного пользователя был определенный исходный IP-адрес. Для этой цели я добавил вторичный IP-адрес к сетевому интерфейсу и попытался принудительно применить исходный IP-адрес с помощью ip6tables и маршрутизации политики. Резюме:
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
router, я помечаю все исходящие пакеты и пытаюсь маршрутизировать эти пакеты с другим адресом источника, используя отдельную таблицу маршрутизации. Они созданы с помощью:
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 target + Wireshark и с curl ip.appspot.com
.
Есть идеи, что я сделал не так?
Edit: сначала неправильно понял ваш пост, переписал ответ.
Когда вы выполняете маршрутизацию, вы не меняете содержимое пакета, вы просто выбираете правильный интерфейс для его перенаправления. Таким образом, это не изменит полученный вами исходный IP-адрес. Он перейдет к правильной таблице маршрутизации и правильному интерфейсу, но это все. Для этого вам нужно NAT.
Итак, вам нужно замаскироваться в POSTROUTING, например, с помощью:
/sbin/ip6tables -A POSTROUTING -t nat -m mark --mark 123 -j SNAT --to-source 2001:db8::3