Вкратце: как получить трафик от хоста во внутренней сети, используя NAT за маршрутизатором, чтобы использовать VPN-соединение, установленное на маршрутизаторе?
У меня есть роутер FreeBSD 9 с 4 сетевыми интерфейсами. Один внешний подключен к моему интернет-провайдеру, а другие - к внутренним подсетям. Внутренние интерфейсы используют NAT (по pf) для подключения к внешнему миру.
Теперь я хотел бы, чтобы весь трафик с хоста в одной из подсетей использовал соединение PPTP VPN, установленное на машине FreeBSD. Конечным результатом будет то, что хост во внутренней сети будет использовать VPN без необходимости использовать VPN-клиент на самом хосте.
Мне удалось настроить VPN-клиент с помощью mpd5. Подключаясь с роутера к VPN-серверу с помощью mpd5, я получаю новый сетевой интерфейс - ng0 - с IP-адресом.
Моя проблема в том, что я не знаю, что делать дальше. Там просто интерфейс (ng0) с IP-адресом. Как сделать так, чтобы трафик из внутренней сети, подключенной через NAT, использовал VPN-соединение?
Если вы пытаетесь ответить или указать мне правильное направление, вы можете начать с предположения, что я ничего не знаю и не понимаю о VPN, маршрутизации, NAT или pf - чего я явно почти не знаю. (Добавление маршрута откуда-куда? Добавление правил pf, которые делают что для входящих и исходящих пакетов? И т. Д.)
Это сразу после подключения к VPN-серверу с роутера.
Мой /etc/pf.conf:
ext_if = "em0"
local_if = "em1"
wifi_if = "em2"
misc_if = "em3"
localnet = "{" $local_if:network $wifi_if:network $misc_if:network "}"
nat on $ext_if from $localnet to any -> ($ext_if)
pass in all
pass out all keep state
Таблица маршрутизации:
Destination Gateway Flags Refs Use Netif Expire
default 188.60.52.1 UGS 0 998893 em0
10.0.1.0/24 link#10 U 0 159240 em1
10.0.1.1 link#10 UHS 0 358 lo0
10.0.2.0/24 link#11 U 0 503719 em2
10.0.2.1 link#11 UHS 0 0 lo0
10.0.3.0/24 link#12 U 0 3773731 em3
10.0.3.1 link#12 UHS 0 0 lo0
98.158.118.1 link#15 UH 0 0 ng0
98.158.118.63 link#15 UHS 0 0 lo0
127.0.0.1 link#13 UH 0 0 lo0
188.60.52.0/22 link#9 U 0 0 em0
188.60.55.17 link#9 UHS 0 0 lo0
Для подключения к VPN-серверу у меня есть это в /usr/local/etc/mpd/mpd.conf:
strongvpn:
create bundle static B1
set bundle yes compression
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set ccp yes mppc
set mppc yes e128
set mppc yes stateless
# Not using these yet, as I don't know what to put in them ...
#set iface up-script /usr/local/etc/mpd5/ip-up.sh
#set iface down-script /usr/local/etc/mpd5/ip-down.sh
create link static L1 pptp
set link action bundle B1
set auth authname XXXXXXXXX
set auth password XXXXXXXXX
set link max-redial 0
set link mtu 1460
set link keep-alive 20 75
set pptp peer 98.158.112.17
set pptp disable windowing
open
Ключевой вопрос здесь: «Вы уже пробовали VPN?» Вроде все нормально. Если ваш FreeBSD-сервер уже может выполнять маршрутизацию к удаленной стороне VPN, ваша работа почти завершена. Это означает, что соединение действительное, и ему известен маршрут к удаленной сети.
Хост за маршрутизатором не должен требовать никаких изменений для связи «через VPN». Если маршрутизатор установлен в качестве шлюза по умолчанию, то весь трафик в удаленные сети (включая другую сторону VPN) должен проходить через маршрутизатор, который, как мы заявили, уже знает соответствующий маршрут. Если вы хотите быть очень точным, добавьте статический маршрут в таблицу маршрутизации рассматриваемого хоста, чтобы убедиться, что он знает правильный маршрут к удаленной стороне VPN.
Я не знаю, есть ли во FreeBSD ip
команда, но больше всего похоже на то, чтобы выполнить это.
# create special routing table
echo 7 special >> /etc/iproute2/rt_tables
# add default route for special table
ip route add table special default via 98.158.118.1
# see special table
ip route show table special
# add source based routing rule
ip rule add from 10.0.1.10/32 table special
# + add your nat rules unless the other end knows how to route back
# to your 10.0.1.0/24 network
Чтобы убедиться, что ваша VPN работает должным образом, вы можете начать с проверки связи с другой стороны вашего VPN-туннеля из вашего компьютера FreeBSD.
ping 98.158.118.1
Основная проблема, когда вы уверены, что ваш VPN в порядке, - это «маршрутизация» всего трафика, поступающего из ваших внутренних интерфейсов, на интерфейс gn0, а также выполнение NAT на этом интерфейсе. Вы не можете сделать это, просто изменив маршрутизатор по умолчанию, иначе вы выстрелите себе в ногу, поскольку VPN требует, чтобы его пакеты маршрутизировались через вашего интернет-провайдера;)
Слово здесь "отвлечь", но насколько мне известно (см." Поддерживает ли PF переадресацию, как IPFW? "), это не поддерживается текущим портом FreeBSD" pf "(этот порт всегда старше, чем OpenBSD" pf ", поскольку является оригиналом). Может быть, в будущем ...
Вот некоторые подсказки для решения, которое подразумевает изменение с "pf" на "ipfw"которые поддерживают"отвлечь":
включите "ipfw" и установите выходной интерфейс "natd" из вашего файла "/etc/rc.conf":
firewall_enable="YES"
firewall_script="/etc/rc.firewall-myown"
natd_enable="YES"
natd_flags="-f /etc/natd.conf"
natd_interface="ng0"
напишите свой собственный "/etc/rc.firewall-myown" (вы можете использовать "/etc/rc.firewall" по умолчанию в качестве отправной точки):
ipfw -f flush
ipfw add 10002 divert natd all from any to any via em2
ipfw add 10003 divert natd all from any to any via em3
ipfw add 10004 divert natd all from any to any via em4
Конфигурация демона "natd" довольно проста и в основном используется для настройки переадресации портов.
Я не проверял все, особенно тот факт, что у вас есть 3 интерфейса для NAT, но я использую "ipfw" для своего собственного модуля маршрутизации FreeBSD, и в прошлом я делал некоторые переадресации VPN.
Наслаждайтесь !