Я хотел бы направить трафик на некоторые конкретные адреса через VPN. Достаточно просто, можно просто добавить маршрут:
ip route add <destination ip> dev tun0 scope link
Здесь возникает загвоздка: я не хочу маршрутизировать весь трафик через VPN, только некоторые. В идеале я хотел бы "сопоставить" IP-адрес (например, адрес 10.xxx), который "указывает" на реальный IP-адрес назначения, но маршрутизируется через VPN. Насколько я понимаю, это означает добавление маршрута (как выше), а затем выполнение эквивалента DNAT в цепочке POSTROUTING.
По сути, я хотел бы сделать трюк Dirty NAT в обратном порядке (т.е. на клиенте, а не на сервере).
(Я хотел бы создать простой HTTP-прокси, который направляет трафик через VPN только в том случае, если URL соответствует заданному шаблону. Конечным решением было бы повлиять на маршрутизацию данного соединения непосредственно из программы пользовательского пространства, но я думаю, что это невозможно.)
Допустим, я хотел бы направить некоторый трафик, скажем, с 8.8.8.8
через tun0
, но я все еще хочу, чтобы некоторый трафик на 8.8.8.8
проходил через eth0
. Например, изображение 8.8.8.8
несколько сайтов, и я хочу туннелировать трафик, идущий только на некоторые сайты.
Я хотел бы установить "поддельный" адрес, скажем, 10.1.2.3
. Любой трафик, направленный с моего компьютера на 10.1.2.3
, пойдет на 8.8.8.8
, но будет маршрутизироваться через tun0
вместо основной таблицы маршрутизации.
Мне частично удалось настроить: сначала я выбрал диапазон IP, скажем, 10.1.0.0/16
. Чем я помечаю пакеты в цепочке OUTPUT goind в этот диапазон, скажем, 0x40
:
sudo iptables -A OUTPUT -t mangle --dst 10.1.0.0/16 -j MARK --set-mark 64
Затем я добавляю правила DNAT для сопоставления "поддельных" IP-адресов из этого диапазона с реальным назначением. Это может быть возможно автоматизировано:
sudo iptables -A OUTPUT -t nat --dst 10.1.2.3 -j DNAT --to 8.8.8.8
Основываясь на отметке, я маршрутизирую пакеты по другой таблице маршрутизации:
sudo ip rule add fwmark 64 lookup vpn
sudo ip route add default dev tun0 scope global proto static table vpn
К сожалению, я все еще не могу пинговать 10.1.2.3
. Если я удаляю правило MARK, я получаю ответ, поэтому часть DNAT работает как положено.