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-трафик проходил через 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 на сервер) все еще отправляется из eth0 (который брандмауэр блокирует без этих последних трех строк).
Нужно ли как-то настраивать адрес источника в pppd? Или изменить маршрут по умолчанию для интерфейсов ppp?
1 ответ
Я решил это.
Когда клиент подключается к 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.