Я запускаю несколько VPN-подключений, которые дают мне разные внешние IP-адреса. Но эти VPN-серверы часто дают мне один и тот же локальный IP-адрес.
Таким образом, я могу получить следующую конфигурацию:
eth0 [main ip address]
tun0 10.200.1.31
tun1 10.200.1.32
tun2 10.200.1.31
где eth0
- мой основной сетевой адаптер, а tunX
- виртуальные сетевые интерфейсы, созданные OpenVPN.
Когда я хочу сделать запросы от определенного VPN-соединения, я могу привязать сокет к IP-адресу (например, 10.200.1.31
). Но я не могу привязать его к определенному интерфейсу (я не могу вручную выбрать tun2
).
Как только я привязываю его к определенному локальному IP-адресу, у меня появляется дополнительная таблица маршрутизации (с использованием iproute2
), которая сообщает системе отправлять пакеты с локального IP-адреса для прохождения через соответствующий сетевой интерфейс.
Это прекрасно работает, когда каждый интерфейс VPN имеет свой локальный IP-адрес.
Но для tun0
и tun2
меня будут две таблицы маршрутизации, одна из которых будет указывать маршрутизацию пакетов с 10.200.1.31
по tun0
, а другая - маршрутизировать их через tun2
. Таким образом, окончательный маршрут непредсказуем.
Как я могу преодолеть эту проблему?
У меня есть две идеи, но я не знаю, как их реализовать, и могут ли они работать:
- Создать фиктивный интерфейс для каждого VPN-соединения с уникальным IP-адресом и использовать
iptables
чтобы каким-то образом редактировать исходный адрес исходящих пакетов и отправлять их через соответствующий интерфейс VPN? - или, может быть, есть способ создать виртуальный маршрутизатор NAT, который будет выполнять аналогичную работу? Какое программное обеспечение я должен искать?
РЕДАКТИРОВАТЬ:
Я исследую первую идею. Я пытаюсь создать фиктивный интерфейс dummy0
(с уникальным локальным IP-адресом), который будет перенаправлять все пакеты на интерфейс VPN tun0
.
Создание фиктивного интерфейса:
modprobe dummy
ifconfig dummy0 192.168.1.1 up
Перенаправление трафика с фиктивного интерфейса на VPN:
iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to 10.200.1.31 -o tun0
Перенаправьте трафик с интерфейса VPN обратно на фиктивный:
iptables -t nat -A PREROUTING -d 10.200.1.31 -j DNAT --to-destination 192.168.1.1
К сожалению, это не работает:
ping -I 192.168.1.1 google.com
PING google.com (173.194.40.132) from 192.168.1.1 : 56(84) bytes of data.
--- google.com ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1009ms
У тебя есть идея почему?