Назад | Перейти на главную страницу

VPN с xl2tpd и racoon - как NAT-трафик из нестандартного IP-адреса

У меня есть сервер под управлением Debian с такой сетью:

eth0 - has public IP address 1.2.3.4
eth1 - has public IP address 1.2.3.5

Я пытаюсь настроить VPN на сервере, к которому я могу подключиться со своего телефона Android. Я следовал инструкциям на http://wiki.debian.org/HowTo/AndroidVPNServer для установки и настройки xl2tpd и racoon. Все работает, но у меня есть последняя корректировка, которую я хочу сделать: когда я подключаю свой телефон к VPN, мой общедоступный IP-адрес, с которого маршрутизируется трафик с телефона, совпадает с адресом eth0, то есть 1.2.3.4. Я хочу, чтобы VPN-трафик передавался через NAT за IP-адресом eth1, то есть 1.2.3.5 (в идеале, когда VPN-клиенты продолжают подключаться к 1.2.3.4).

Мои правила брандмауэра выглядят так:

VPN_CLIENT_RANGE=192.168.200.0/24
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
# Enable VPN traffic on the ppp+ adapters (only active when a call is established)
# to go through the machine using SNAT/masquerading.
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s $VPN_CLIENT_RANGE -j MASQUERADE

Я надеялся, что изменение eth0 на eth1 в последних трех строках приведет к нужному эффекту, но это не так - VPN-клиент может подключиться, но больше не видит Интернет, а журналы показывают трафик от VPN-клиентов (интерфейсы pppX на server) все еще отправляется из eth0 (который брандмауэр блокирует без этих последних трех строк).

Мне нужно как-то настроить адрес источника в pppd? Или изменить маршрут по умолчанию для интерфейсов ppp?

Я решил это.

Когда клиент подключается к VPN, устанавливается соединение PPP.

Пакеты проходят от клиента к интерфейсу pppN на сервере. Причина, по которой они перетекают оттуда в Интернет через «неправильный» IP-адрес, - это таблица маршрутизации сервера по умолчанию:

$ ip route show
default dev eth0 scope link

т.е. весь исходящий трафик идет через eth0.

Предполагая, что мы не хотим изменять маршрут по умолчанию, нам нужно создать отдельную таблицу маршрутизации с маршрутом по умолчанию через eth1 и заставить VPN использовать его.

Добавьте запись для новой таблицы в / etc / iproute2 / rt_tables:

101 vpn

Номер может быть любым уникальным в файле; имя является описательным для выполняемой работы.

Теперь добавьте в эту таблицу маршрут по умолчанию через eth1:

# ip route add table vpn default dev eth1 scope link

Наконец, принудительно маршрутизируйте входящий трафик VPN (на интерфейсах pppN) в соответствии с нашей новой таблицей. Самый простой способ - использовать механизмы /etc/ppp/ip-up.d и ip-down.d для добавления и удаления правил по мере того, как интерфейсы ppp перемещаются вверх и вниз.

/etc/ppp/ip-up.d/vpn-routing:

#!/bin/sh
IF=$1
ip rule add dev $IF table vpn

/etc/ppp/ip-down.d/vpn-routing:

#!/bin/sh
IF=$1
ip rule delete dev $IF table vpn

Чтобы все это пережило перезагрузку, вам нужно поместить строку ip route add во что-то, выполняемое при запуске - например, ваш скрипт брандмауэра - или как строка «вверх» в / etc / network / interfaces на eth0.