
Я пытаюсь запустить VPN. Я бы хотел, чтобы программы явно запрашивали интерфейс, а не маршрутизировали ВЕСЬ трафик, как с curl --interface
.
curl --interface ppp0 ip.bsd-unix.net
следует отправлять через VPN, но каким-то образом, используя tcpdump
или iftop
,Я вижу, что трафик проходит через eth0, даже если исходный IP-адрес — 10.10.1.2. Вот мой ip route show
:
default via 149.x.y.z dev eth0
10.10.1.1 dev ppp0 proto kernel scope link src 10.10.1.2
149.x.y.128/25 dev eth0 proto kernel scope link src 149.x.y.172
Некоторые IP-адреса скрыты. Второй добавляется xl2tp при запуске и создании интерфейса ppp0. 149.etc — это моя локальная сеть, а 10.etc — это мой VPN.
Кроме того, когда я ping -I ppp0 8.8.8.8
вижу активность ppp0, я получаю ответы с более высоким значением мс, что говорит о том, что они проходят через VPN.
решение1
Я как бы предположил, что если исходный IP пакета совпадает с IP интерфейса, он будет использовать этот интерфейс. И если это не было неотъемлемым поведением IP, то мой второй маршрут сделал бы это возможным: часть src
маршрута была для меня отвлекающим маневром.
Итак, мои программы привязываются к адресу ppp0, который устанавливает их исходный IP, верно? Я сделал то, что сказал @davidgo, и создал отдельную таблицу маршрутизации...
echo 200 custom | sudo tee -a /etc/iproute2/rt_tables
...затем добавил правило использования пользовательской таблицы для пакетов с этим исходным IP-адресом...
sudo ip rule add from 10.10.1.2 lookup custom
...и добавил правило в пользовательскую таблицу, чтобы использовать ppp0 для любого трафика, проходящего через шлюз ppp0.
sudo ip route add default via 10.10.1.1 dev ppp0 table custom
curl ip.bsd-unix.net
дает мне мой домашний IP и curl --interface ppp0 ip.bsd-unix.net
дает мне удаленный IP моего VPN. Это работает!
И все же мне интересно, почему ping все это время проходил через ppp0 корректно.