Правила iptables для разрешения устройствам на VPN доступа в интернет

Вопрос или проблема

У меня есть настройка 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, теперь смогут без проблем получать доступ к интернету. Если проблемы сохраняются, проверьте сетевые подключения и ведите журналы для более детального анализа.

Оцените материал
Добавить комментарий

Капча загружается...