- Вопрос или проблема
- ———————————————
- **ИЗМЕНЕНИЕ** Я надеюсь, что на этот раз я удовлетворил вашу просьбу.
- **Политика IPTABLES для СБРОСА**
- Ответ или решение
- Решение проблемы: Как настроить iptables для доступа устройств VPN в интернет
- 1. Проверьте маршрутизацию и настройки IP
- 2. Общие правила iptables
- 3. Проверка блокировок и состояния подключения
- 4. Обновление конфигурации OpenVPN
- Заключение
Вопрос или проблема
У меня есть настройка linux-файрволла в качестве шлюза домашней сети, который правильно выдает IP-адреса устройствам в моей сети, и эти устройства имеют доступ в интернет.
Я также настроил OpenVPN на том же компьютере, он работает и раздает IP-адреса, и я могу получить доступ к VPN со своего телефона. Однако устройства в VPN не имеют доступа в интернет, и я не понимаю, почему.
Вот правила iptables, которые я использую:
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# enp2s0 - WAN интерфейс, enp1s0 - LAN интерфейс, tun0 - vpn интерфейс
-A POSTROUTING -o enp2s0 -j MASQUERADE
-A POSTROUTING -s 10.8.0.0/8 -o enp2s0 -j MASQUERADE
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# блокировать недопустимые пакеты
-A PREROUTING -m conntrack --ctstate INVALID -j DROP
# блокировать фрагментированные пакеты (может быть не нужно)
#-A PREROUTING -f -j DROP
# блокировать новые пакеты, которые не являются SYN
-A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
# блокировать необычные значения MSS
-A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
# блокировать пакеты с недопустимыми TCP-флагами
-A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
-A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
-A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
-A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
-A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
-A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
-A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
-A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
-A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
-A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# блокировать пакеты из частных подсетей (спуфинг)
-A PREROUTING -s 224.0.0.0/3 -j DROP
-A PREROUTING -s 169.254.0.0/16 -j DROP
-A PREROUTING -s 172.16.0.0/12 -j DROP
-A PREROUTING -s 192.0.2.0/24 -j DROP
#-A PREROUTING -s 192.168.0.0/16 -j DROP
-A PREROUTING -s 10.0.0.0/8 -j DROP
-A PREROUTING -s 0.0.0.0/8 -j DROP
-A PREROUTING -s 240.0.0.0/5 -j DROP
-A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
# Правила сервиса
# Логировать все входящие и пересылаемые соединения
-A INPUT -j LOG
-A FORWARD -j LOG
# базовые глобальные правила для приема - ICMP, петлевой интерфейс, трассировка, все установленное принимается
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
#-A OUTPUT -o lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
# следующее правило может потребовать RELATED, если что-то не работает, например OpenVPN
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#-A INPUT -m conntrack --ctstate RELATED -j ACCEPT
#-A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
# включить отклонение трассировки, чтобы пакеты отправлялись
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with icmp-port-unreachable
# DNS - принимать от LAN и VPN
-A INPUT -i enp1s0 -p tcp --dport 53 -j ACCEPT
-A INPUT -i enp1s0 -p udp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p tcp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p udp --dport 53 -j ACCEPT
# SSH - принимать от LAN и VPN; обратите внимание, что SSH на этом компьютере использует нестандартный порт
-A INPUT -i enp1s0 -p tcp --dport 123 -j ACCEPT
-A INPUT -i tun0 -p tcp --dport 123 -j ACCEPT
# OpenVPN - принимать от WAN; обратите внимание, что OpenVPN на этом компьютере использует порт 443, чтобы попытаться обойти фильтрацию сети клиента
-A INPUT -i enp2s0 -p tcp --dport 443 -j ACCEPT
#-I INPUT -i tun0 -j ACCEPT
-I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Запросы клиента DHCP - принимать от LAN и VPN
-A INPUT -i enp1s0 -p udp --dport 67:68 -j ACCEPT
-A INPUT -i tun0 -p udp --dport 67:68 -j ACCEPT
# сбросить недопустимые пакеты
-A INPUT -m conntrack --ctstate INVALID -j DROP
# сбросить соединения от хостов, у которых есть более 80 установленных соединений (предотвращает атаки на соединения)
-A INPUT -p tcp -m connlimit --connlimit-above 80 -j REJECT --reject-with tcp-reset
# ограничить новые TCP соединения, которые клиент может установить в секунду, уменьшая атаки на соединения
-A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -j DROP
# блокировать сканирование портов
-N port-scanning
-A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
-A port-scanning -j DROP
# блокировать HTTPS-рекламу
#-A INPUT -p udp --dport 80 -j REJECT --reject-with icmp-port-unreachable
#-A INPUT -p tcp --dport 443 -j REJECT --reject-with tcp-reset
#-A INPUT -p udp --dport 443 -j REJECT --reject-with icmp-port-unreachable
# сбросить весь другой входящий трафик
-A INPUT -j DROP
# Правила пересылки
# пересылать пакеты по установленным/сопутствующим соединениям
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# пересылать от LAN (enp1s0) к WAN (enp2s0)
-A FORWARD -i enp1s0 -o enp2s0 -j ACCEPT
# пересылать от VPN (tun0) к WAN (enp2s0)
-A FORWARD -i tun0 -o enp2s0 -j ACCEPT
# сбросить весь другой пересылаемый трафик
-A FORWARD -j DROP
COMMIT
Что мне не хватает, чтобы устройства в VPN имели доступ в интернет?
Похоже, что у ваших клиентов (если это Android/iOS) включена опция Seamless Tunnel, или команда iptables для включения NAT мешает туннелю (что маловероятно). Проверьте свои блокировочные правила, чтобы убедиться, что они не блокируют неверную подсеть.
Также (если ваш сервер работает на версии Linux) убедитесь, что пересылка IP включена в ядре. Для этого (выполните от имени администратора):
echo 1 > /proc/sys/net/ipv4/ip_forward
В Windows другой способ включения пересылки IP. Эта статья должна помочь вам в этом.
Я сделал – то, что вы пытаетесь – в виртуальной машине. Я создал две машины, машину A с двумя сетевыми устройствами. Одно устройство подключено к интернету, другое подключено ко второй виртуальной машине B.
Следующие строки – это все, что мне нужно, чтобы сделать машину B способной использовать интернет или VPN соединение из машины A.
vm1@vm1:~$ cat firewall01.sh #!/bin/bash #sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE #sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -m state --state RELATED,ESTABLISHED -j ACCEPT #sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE sudo iptables -A FORWARD -i tun0 -o enp0s8 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i enp0s8 -o tun0 -j ACCEPT
Также я отредактировал /etc/sysctl.conf
# Убедитесь, что следующая строка разкомментирована для включения пересылки пакетов для IPv4 net.ipv4.ip_forward=1
После этого выполните sudo sysctl -p
, чтобы изменения вступили в силу немедленно.
enp0s3
– это сетевое устройство, подключенное к интернету.enp0s8
– это сетевое устройство, подключенное к локальной машине B.tun0
– это сетевое устройство, созданное из openvpn
Для тестирования я установил свою политику по умолчанию на прием.
vm1@vm1:~$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination
Скрипт клиента openvpn выглядит следующим образом, кстати:
client dev tun proto udp remote server-ip server-port nobind resolv-retry infinite auth SHA512 cipher AES-256-CBC keysize 256 comp-lzo verb 2 mute-replay-warnings ns-cert-type server persist-key persist-tun key-direction 1 ca /path/to/file.crt tls-auth /path/to/file.key 1 auth-user-pass /path/to/file auth-nocache script-security 2 up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf
———————————————
**ИЗМЕНЕНИЕ** Я надеюсь, что на этот раз я удовлетворил вашу просьбу.
Я только что создал следующую настройку:
- один openvpn-сервер на компьютере A
- один openvpn-клиент на моем ноутбуке B
- создал соединение VPN с моего ноутбука B через umts к моему компьютеру A дома, что позволило мне просматривать веб на моем ноутбуке B с IP-адресом компьютера A
Я создал свой openvpn-сервер с помощью следующего скрипта:
cat /etc/openvpn/server.conf port 11194 proto udp dev tun10 tun-mtu 1500 mssfix 1450 ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/ca.crt key /etc/openvpn/easy-rsa/keys/ca.key dh /etc/openvpn/easy-rsa/keys/dh2048.pem server 10.9.0.0 255.255.255.0 push "redirect-gateway def1 bypass-dhcp" client-to-client keepalive 5 60 comp-lzo persist-key persist-tun #user openvpn #group openvpn status openvpn-SERVER-status.log verb 6 cipher AES-256-CBC
Самая важная настройка для достижения редиректа DNS через вашу VPN должна быть: push “redirect-gateway def1 bypass-dhcp”
После этого отредактируйте следующую строку в /etc/sysctl.conf
# Убедитесь, что следующая строка разкомментирована для включения пересылки пакетов для IPv4 net.ipv4.ip_forward=1
и выполните sudo sysctl -p
Затем создайте правила iptables:
Пока каждая политика была установлена на ACCEPT, следующая команда была всем, что мне нужно было выполнить: iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
- enp0s3 – это карта Ethernet компьютера A, подключенная к интернету.
скрипт vpn-клиента
Следующий скрипт использовался с клиентского ноутбука B для подключения к vpn-серверу на компьютере A
client #tls-client #key-direction 1 proto udp port 11194 remote some.dyndns.org dev tun #persist-key #persist-tun #tun-mtu 1500 #mssfix 1450 #nobind #resolv-retry infinite keepalive 5 60 comp-lzo cipher AES-256-CBC ca /home/alex/Downloads/dellvpn/ca.crt cert /home/alex/Downloads/dellvpn/dell-inspirion.crt key /home/alex/Downloads/dellvpn/dell-inspirion.key verb 2 script-security 2 up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf
Самые важные строки для меня – это последние три строки. Они предотвращают утечку DNS на системах Linux. https://dnsleaktest.com/what-is-a-dns-leak.html
На этом этапе я смог просматривать с моего ноутбука B с IP-адресом компьютера A.
**Политика IPTABLES для СБРОСА**
После того как я изменил политику iptables по умолчанию на сброс, все стало сложнее. В конечном итоге я успешно использовал следующий скрипт:
#!/bin/bash ##СНиППЕТ-СКРИПТА взят из https://wiki.debianforum.de/Einfaches_Firewall-Script IPTABLES="/sbin/iptables" # Установите порты для сервиса #------------------------------------------------------------------------------ pSSH="22" pDNS="53" pHTTP="80" pHTTPS="443" pOPENVPN="-p UDP --dport 11194" pNTP="123" # Установите сети #------------------------------------------------------------------------------ LOCALNET="192.168.178.0/24" VPNNET="10.9.0.0/24" # Политики по умолчанию. #------------------------------------------------------------------------------ # Сбрасывайте все по умолчанию. $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP # Установите цепочки nat/mangle/raw таблиц в ACCEPT $IPTABLES -t nat -P PREROUTING ACCEPT $IPTABLES -t nat -P OUTPUT ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t mangle -P PREROUTING ACCEPT $IPTABLES -t mangle -P INPUT ACCEPT $IPTABLES -t mangle -P FORWARD ACCEPT $IPTABLES -t mangle -P OUTPUT ACCEPT $IPTABLES -t mangle -P POSTROUTING ACCEPT # Очистка. #------------------------------------------------------------------------------ # Удалите все $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F # Удалите все $IPTABLES -X $IPTABLES -t nat -X $IPTABLES -t mangle -X # Обнулить все пакеты и счетчики. $IPTABLES -Z $IPTABLES -t nat -Z $IPTABLES -t mangle -Z # Разрешить интерфейсу обратной связи делать все. $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT # Разрешить входящие соединения, связанные с существующими разрешенными соединениями. $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить исходящие соединения, КРОМЕ недопустимых $IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Пересылка OpenVPN #------------------------------------------------------------------------------ ### Взято из installscript на https://github.com/Nyr/openvpn-install/blob/master/openvpn-install.sh IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) $IPTABLES -t nat -A POSTROUTING -s $VPNNET -j SNAT --to $IP $IPTABLES -I FORWARD -s $VPNNET -j ACCEPT $IPTABLES -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT # Выборочно разрешить определенные исходящие соединения, заблокировать остальные. #------------------------------------------------------------------------------ # Разрешить DNS. Без этого многие вещи не будут работать. $IPTABLES -A OUTPUT -m state --state NEW -p udp --dport $pDNS -j ACCEPT $IPTABLES -A OUTPUT -m state --state NEW -p tcp --dport $pDNS -j ACCEPT # Разрешить HTTP. $IPTABLES -A OUTPUT -m state --state NEW -p tcp --dport $pHTTP -j ACCEPT # Разрешить HTTPS. $IPTABLES -A OUTPUT -m state --state NEW -p tcp --dport $pHTTPS -j ACCEPT # Разрешить NTP. $IPTABLES -A OUTPUT -m state --state NEW -p udp --dport $pNTP -j ACCEPT # Выборочно разрешить определенные входящие соединения, заблокировать остальные. #------------------------------------------------------------------------------ # Разрешить входящие запросы OPENVPN. $IPTABLES -A INPUT -m state --state NEW $OPENVPN -j ACCEPT # Разрешить входящие запросы SSH из указанного диапазона IP. $IPTABLES -A INPUT -m state --state NEW -s $LOCALNET -p tcp --dport $pSSH -j ACCEPT $IPTABLES -A INPUT -m state --state NEW -s $VPNNET -p tcp --dport $pSSH -j ACCEPT # Завершить с успешным завершением. #------------------------------------------------------------------------------ exit 0
Самые важные маршрутизационные строки должны быть:
# Пересылка OpenVPN #------------------------------------------------------------------------------ ### Взято из installscript на https://github.com/Nyr/openvpn-install/blob/master/openvpn-install.sh IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) $IPTABLES -t nat -A POSTROUTING -s $VPNNET -j SNAT --to $IP $IPTABLES -I FORWARD -s $VPNNET -j ACCEPT $IPTABLES -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
Убедитесь, что $VPNNET установлен на соответствующий IP в openvpn-server.conf
В качестве альтернативы правилам пересылки выше, я также смог успешно создать туннель и просматривать веб с помощью этих строк вместо:
# Пересылка OpenVPN #------------------------------------------------------------------------------ $IPTABLES -t nat -A POSTROUTING -o tun10 -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE $IPTABLES -I FORWARD -o enp0s3 -i tun10 -j ACCEPT $IPTABLES -I FORWARD -i enp0s3 -o tun10 -j ACCEPT
- enp0s3 была сетевой картой, подключенной к интернету
- tun10 была сетевым устройством, созданным из моего openvpn-сервера
Ответ или решение
Решение проблемы: Как настроить iptables для доступа устройств VPN в интернет
Если у вас уже настроен OpenVPN-сервер на вашем Linux-маршрутизаторе и вам нужно обеспечить доступ устройств, подключенных к VPN, в интернет, вам нужно внести изменения в ваши правила iptables и проверить несколько сетевых настроек. Давайте рассмотрим последовательные шаги, которые помогут решить вашу проблему.
1. Проверьте маршрутизацию и настройки IP
Первым шагом у вас должно быть включение IP-маршрутизации. Это можно сделать, выполнив:
echo 1 > /proc/sys/net/ipv4/ip_forward
Для того чтобы это изменение сохранялось после перезагрузки, добавьте следующую строчку в /etc/sysctl.conf
:
net.ipv4.ip_forward=1
После изменения файла выполните команду:
sudo sysctl -p
2. Общие правила iptables
Основные правила NAT необходимо настроить, чтобы трафик от ваших VPN-клиентов мог выходить в интернет. В вашем случае сложитесь из следующих правил:
Файл правил iptables:
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Для ваших WAN и VPN интерфейсов
-A POSTROUTING -o enp2s0 -j MASQUERADE
-A POSTROUTING -s 10.8.0.0/24 -o enp2s0 -j MASQUERADE # Исправьте маску на ту, которая соответствует вашей VPN подсети
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# Разрешаем трафик, связанный с существующими подключениями
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Разрешаем трафик от VPN в интернет
-A FORWARD -i tun0 -o enp2s0 -j ACCEPT
# Запретите все остальное
-A FORWARD -j DROP
COMMIT
Обратите внимание, что 10.8.0.0/24
является примером интерфейса вашей VPN. Убедитесь, что вы используете правильную подсеть, выдаваемую вашим OpenVPN-сервером.
3. Проверка блокировок и состояния подключения
Убедитесь, что ваши правила не блокируют необходимые пакеты. Проверьте журналы для анализа возможных блокировок:
iptables -L -v
Проверьте, что ваш OpenVPN сервер работает и все связанные службы запущены. Вы также можете использовать команды вроде ip a
и route -n
для диагностики сетевых интерфейсов и маршрутов.
4. Обновление конфигурации OpenVPN
Важно убедиться, что ваш server.conf
файл OpenVPN включает опцию направляющей трафик по умолчанию, воспользуйтесь следующей строкой:
push "redirect-gateway def1 bypass-dhcp"
Это означает, что весь трафик будет направляться через VPN.
Заключение
Подводя итог, вы выполнили следующие этапы:
- Включили IP-маршрутизацию.
- На Iptables создали необходимые правила для NAT и разрешили трафик от VPN.
- Убедились, что OpenVPN настроен для пропуска трафика.
Следуя вышеуказанным рекомендациям, ваши устройства, подключенные к VPN, теперь смогут без проблем получать доступ к интернету. Если проблемы сохраняются, проверьте сетевые подключения и ведите журналы для более детального анализа.