1

Я запускаю несколько 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 . Таким образом, окончательный маршрут непредсказуем.

Как я могу преодолеть эту проблему?

У меня есть две идеи, но я не знаю, как их реализовать, и могут ли они работать:

  1. Создать фиктивный интерфейс для каждого VPN-соединения с уникальным IP-адресом и использовать iptables чтобы каким-то образом редактировать исходный адрес исходящих пакетов и отправлять их через соответствующий интерфейс VPN?
  2. или, может быть, есть способ создать виртуальный маршрутизатор 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

У тебя есть идея почему?

2 ответа2

1

Я обнаружил, что решение было довольно простым:

Сначала мы создаем достаточно пустых интерфейсов:

modprobe numdummies=254

Чем мы делаем три вещи:

  • Настройте фиктивный интерфейс, чтобы иметь возможность привязываться к уникальному IP-адресу фиктивного интерфейса
  • Avctivate IP маскарад на каждом интерфейсе VPN
  • Установите правило, которое говорит использовать таблицу маршрутизации, связанную с интерфейсом VPN, для пакетов, приходящих с IP-адреса фиктивного интерфейса.

Это может быть реализовано с помощью следующего сценария оболочки:

for n in {0..253}
do
  n1=`expr $n + 1`
  ifconfig dummy$n 192.168.42.$n1/32 up
  iptables -t nat -A POSTROUTING -o tun$n -j MASQUERADE
  ip rule add from 192.168.42.$n1 lookup tun$n
done

Мои таблицы маршрутизации выглядят так, пример для tun0:

default via 10.200.0.1 dev tun0
10.200.0.0/22 dev tun3  scope link  src 10.200.1.31

Работа сделана!

0

Я считаю, что суть вашей проблемы заключается в утверждении:

как-то отредактировать адрес источника исходящих пакетов

Я знаю, что мне никогда не удавалось установить IP-адрес исходящих пакетов на что-либо кроме базового IP-адреса интерфейса. Я полагаю, что сетевой код ядра предназначен для такой работы из-за накладных расходов на отслеживание того, на каком интерфейсе должен выходить этот пакет.

Возможно, вам придется посмотреть на сетевые драйверы и, возможно, сделать там некоторые моды.

Если вам действительно удастся изменить IP-адрес вне ядра, остерегайтесь снижения производительности, которое вы заплатите за логику.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .