Я настраиваю шлюз OpenVPN, чтобы разрешить доступ локальной сети к интернету через туннель. Шлюз работает под управлением OpenBSD 5.5-stable amd64 на платформе PC Engines APU.
Локальная сеть содержит интерфейсы re1
, re2
и ral0
. Она также содержит vether0
, который размещает локальную 192.168.2.0/24
сеть. Эти интерфейсы связаны под bridge0
, чтобы обеспечить общий шлюз, подсеть и DHCP через dhcpd
.
VPN установлен и tun0
открыт. Сам шлюз может получить доступ к VPN без проблем.
Проблема в том, что по умолчанию хосты получают доступ к VPN со своими собственными 192.168.2.0/24
адресами. NAT необходим для перевода локальной сети в сеть VPN по адресу 10.0.1.0/24
.
Я пробовал следующие pf.conf
конфигурации:
# pf.conf -- 10.0.1.10 is my tun0 gateway
set skip on lo
block return
pass in quick on { vether0 re1 re2 ral0 } from 192.168.2.0/24 to !10.0.0.0/8 nat-to 10.0.1.10
pass
У меня были похожие результаты с этими правилами:
# pf.conf
...
pass in from any nat-to 10.0.1.10
pass out from tun0 to any
Это позволяет трафику локальной сети проходить tun0
с исходным адресом 10.0.1.10
, а обратный трафик передается обратно на соответствующий хост. Новая проблема заключается в том, что обратный трафик по-прежнему, по-видимому, не маршрутизируется правильно.
Например, я могу пинговать 8.8.8.8
и google.com
с любого хоста локальной сети, однако первый ответ ВСЕГДА теряется между tun0
и обратным интерфейсом. Такие инструменты, как dig
, nslookup
, traceroute
, и ping
обычно медлительны и работают гораздо дольше, чем должны. Несмотря на то, что некоторый трафик все еще проходит, браузеры и другие приложения не могут использоваться.
tcpdump
демонстрируя потерю:
# 192.168.2.103 is a LAN host
# 74.125.131.139 is google.com
# on ral0
20:59:35.668251 192.168.2.103 > 74.125.131.139: icmp: echo request <-- no reply
20:59:40.651184 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:40.736748 74.125.131.139 > 192.168.2.103: icmp: echo reply
20:59:41.656101 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:41.741251 74.125.131.139 > 192.168.2.103: icmp: echo reply
20:59:42.661071 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:42.802410 74.125.131.139 > 192.168.2.103: icmp: echo reply
# on tun0
20:59:35.668359 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:35.764052 74.125.131.139 > 10.0.1.10: icmp: echo reply <-- here's the missing reply, it didn't get to ral0
20:59:40.651221 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:40.736721 74.125.131.139 > 10.0.1.10: icmp: echo reply <-- but the of the replies rest did
20:59:41.656138 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:41.741226 74.125.131.139 > 10.0.1.10: icmp: echo reply
20:59:42.661107 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:42.802372 74.125.131.139 > 10.0.1.10: icmp: echo reply
Я знаю, что это почти наверняка проблема NAT, pf.conf
но после стольких попыток настройки у меня возникли проблемы с поиском правильного способа передачи трафика.
Когда я использовал DD-WRT и iptables
, моя конфигурация была такой:
iptables -D FORWARD -i tun1 -j logaccept
iptables -D FORWARD -o tun1 -j logaccept
Я не уверен, как "портировать" это на pf
, хотя. Любые предложения были бы очень признательны!
решение1
Это оказалось проблемой pf.conf
. Дополнительное время, потраченное на изучениеOpenBSD ПФ NATстраница привела меня к следующему правилу, которое позволило трафику корректно проходить через tun0
интерфейс:
# /etc/pf.conf
pass out on tun0 inet from 192.168.2.0/24 to any flags S/SA nat-to (tun0) round-robin
По сути, это означает: передавать трафик из локальной сети, предназначенный для любого адреса tun0
, на , в частности IPv4, только смотреть на syn
флаги ack
и и выполнять исходящий NAT с помощью tun0
. Скобки вокруг (tun0)
говорят pf
об автоматическом обновлении правила при изменении адреса интерфейса. Это может произойти, если ваш VPN поддерживает несколько одноранговых узлов и вы выполняете отказоустойчивость, и, таким образом, ручная перезагрузка набора правил становится ненужной.
Некоторое время наФильтрация OpenBSD PFстраница помогла мне уточнить правило:
# /etc/pf.conf
pass out on $vpn_if inet proto { $protos } from $lan_net to any flags S/SA modulate state nat-to ($vpn_if) round-robin
pass in on $vpn_if inet proto { $protos } from $vpn_gw to any flags S/SA modulate state
Флаг modulate state
позволяет pf
заменить начальный порядковый номер на более сильный, что может помочь защитить некоторые операционные системы в сети.
Теперь шлюз работает отлично, и я перехожу к более сложным pf.conf
конфигурациям.