LINUX.ORG.RU
решено ФорумAdmin

Разъяснение работы Iptables для VPN

 , ,


2

3

Здравствуйте! Настраиваю VPN на VPS в Ubuntu v20, взял готовенькие настройки iptables, чтобы долго не мучаться, возможно это не лучший путь... Остались сомнения и вопросы, подскажите пожалуйста, если что неправильно понял в них:

1. # iptables -I INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
2. # iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source IP_АДРЕС_ВАШЕГО СЕРВЕРА
3. # iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT
4. # iptables -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
5. # firewall-cmd --zone=public --permanent --add-port=443/tcp
6. # firewall-cmd --zone=public --permanent --add-masquerade

1. Этой строчкой задумано, что трафик может пропускаться на 443 порт при условии, что будет установлено соединение VPN (подойдут логин и пароль)? Почему в начале проставлена -I, а не -A?

2. Преобразование ip адреса выходного пакета, выданным dhcp сервером, в ip адрес сервера. Только -to-source это переводится как к источнику, а не от него? Или наоборот должно быть?

3 и 4. лишнии, так как первым пунктом трафик уже будет заходить и ничем не ограничиваться до выхода?

5 и 6. лишнии, так как повторяют 1 и 2 пункты?

И ещё дополнительный вопрос, влияют ли настройки iptables на использование VNC client через панель управления VPS?


взял готовенькие настройки iptables

«готовенькие» для чего?

чтобы долго не мучаться

Ну потом помучаетесь, с таким подходом

возможно это не лучший путь...

А вы догадливый

Остались сомнения

Только сомнения?

Этой строчкой задумано, что трафик может пропускаться на 443 порт при условии, что будет установлено соединение VPN (подойдут логин и пароль)?

Ну в вашей вселенной и не такое может быть задумано.

2. Преобразование ip адреса выходного пакета, выданным dhcp сервером, в ip адрес сервера. Только -to-source это переводится как к источнику, а не от него? Или наоборот должно быть?
Преобразование ip адреса выходного пакета, выданным dhcp сервером, в ip адрес сервера.

Сильно завернули.

И ещё дополнительный вопрос, влияют ли настройки iptables на использование VNC client через панель управления VPS?

Убит.

anc ★★★★★
()
Ответ на: комментарий от Anoxemian

Уж, скорее правило 1 может относится к VPN-серверу, если он слушает на tcp 443 порту. А правила 2-4 — это обычный шлюз в инет для локальной сети, не важно, физическая она или виртуальная...

mky ★★★★★
()
Ответ на: комментарий от mky

Вас только правила iptables смутили ? А то что ниже идет firewall-cmd нет? Ну и про первое правило "-I INPUT" это тоже зачетно (я не к вам, а к копипасте ТС)

anc ★★★★★
()
Ответ на: комментарий от Kisliy

Ок.

  1. iptables -I INPUT -p tcp –dport 443 -m state –state NEW -j ACCEPT

Разрешить установку входящей tcp/ip сессии на порт 443. Условие по-умолчанию POLICY ACCEPT. Полностью перечеркивает смысл данной команды. VPN опять же каким боком?

  1. iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT –to-source IP_АДРЕС_ВАШЕГО СЕРВЕРА

Включить НАТ для исходящего трафика, пришедшего из диапазона 192.168.10.0/24

  1. iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT

Разрешить сквозной трафик из подсети 192.168.10.0/24. Политика по умолчанию ACCEPT перечеркивает смысл команды. VPN опять же каким боком?

  1. iptables -A FORWARD -p all -m state –state ESTABLISHED,RELATED -j ACCEPT

Разрешить сквозной трафик всем для уже установленных соединений. Политика по умолчанию ACCEPT перечеркивает смысл команды. VPN опять же каким боком?

  1. firewall-cmd –zone=public –permanent –add-port=443/tcp

Бабуйня-обертка над iptables для сохранения правила 1 в постоянном режиме. Какой отношение вообще к теме - непонятно.

  1. firewall-cmd –zone=public –permanent –add-masquerade

Бабуйня обертка над iptables. Даже разбирать не буду, бессмысленная шляпа.

Anoxemian ★★★★★
()

1 добавляет в цепочку Input правило, разрешающее подключение на 443 порт. «-I» значит, что это правило будет добавлено в самое начало цепочки Input. В цепочку Input попадают пакеты, адресованные хосту (этому хосту).

  1. Для пакетов с адресом источника из VPN сети подменяет адрес источника (отправителя пакета) на адрес внешнего интерфейса VPN сервера. Это правило будет применяться только для пакетов, с адресами назначения во внешнем мире, т.е. не в VPN сети и не адресованные самому VPN серверу.

  2. Разрешает продвижение пакетов из VPN сети между сетевыми интерфейсами. В зависимости от политик по умолчанию или назначенных явно может быть запрет продвижения пакетов из одного адресного пространства (сети) в другое. В данном случае это правило разрешает продвижение пакетов из VPN сетевого интерфейса во внешний сетевой интерфейс (внешнюю сеть), т.е. в Internet. Если политика для цепочки Forward стоит ACCEPT, то это правило не нужно.

  3. Разрешает продвижение пакетов по всем протоколам между всеми интерфейсами для уже установленных соединений.

5,6 - с firewall-cmd я не работал, но по сути они дублируют 1 и второе правило. Только 6 строчка по смыслу делает маскарадинг, вместо явного SNAT.

anonymous
()
Ответ на: комментарий от Anoxemian

Вы исходите из того, что правила написаны под дистрибутив, где по умолчанию политика ACCEPT. Но были дистрибутивы, где по умолчанию DROP.

бабуйня же.

Примитивный скрипт, который на достаточно большом кол-ве дистрибвутивов (до распространения nft) выполнит задачу — разрешит сервер на 443 порту и SNAT исходящих пакетов. Криво-косо, но выполнит. Понятно, что в таком скрипте лучше все правила через ″iptables -I″, лучше проверять, есть firewall-cmd...

mky ★★★★★
()
Ответ на: комментарий от Anoxemian

А, не, это не скрипт. Вот отсюда ТС взял https://aeb-blog.ru/linux/ustanovka-openconnect-servera-v-sentos-7/ и в комментариях написано, что либо iptables, либо firewalld.

А скрипт - говно.

Как 90% исходного кода, но как-то всё работает.

давай не додумывать

Тут исходная задача — додумывать какой смысл был вложен:

Наверняка автор какой-то смысл в них вкладывал, не зря же он пыхтел.

mky ★★★★★
()
Ответ на: комментарий от Anoxemian

Так там закончилось всё хорошо, поэтому и не стал ничего писать. Может и не хорошо, но ТС сказал, что ему хорошо. :)

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)

взял готовенькие настройки iptables, чтобы долго не мучаться

Читай iptables guide у тебя «детские» вопросы, сам себя закопаешь готовыми скриптами

Почему в начале проставлена -I, а не -A?

-A добавляет в конец списка правил, -I в указанную позицию (если позиция не указано то в начало)

что трафик может пропускаться на 443 порт при условии, что будет установлено соединение VPN (подойдут логин и пароль)?

нет, это просто пускает на 443 порт сервера ВСЕХ

Только -to-source это переводится как к источнику, а не от него?

нормально тут все. можно вообще -j MASQUERADE без указания адреса использовать, если у тебя один ip на выходном интерфейсе. Но тут стоит добавить -o <out_interface>

3 и 4. лишнии, так как первым пунктом трафик уже будет заходить и ничем не ограничиваться до выхода?

нет, тут цепочка FORWARD для проходящего трафика, а в 1 была INPUT для предназначеного процессм сервера (см. тут)

5 и 6. лишнии, так как повторяют 1 и 2 пункты?

Это вообще порнография мешать вместе iptables и firewalld (набор костылей над iptables/nftables), сноси firewalld и делай все через iptables

Kolins ★★★
()
Ответ на: комментарий от anonymous

Спасибо всем что отозвались! Пришлось ещё читать про эти коварные таблицы, и вот теперь составил свои. Но так ли они будут работать как я их задумал? Подправьте пожалуйста, если что не очень получилось или пропущено! Собственно, мой «неподступный бастион»:

интерфейсы системы: lo - 127.0.0.1/8; eth0 - айпи сервера/27; tap_tap_virtual - 192.168.10.1/24

iptables -P PREROUTING ACCEPT

iptables -P INPUT DROP
1. iptables -A INPUT -i lo -j ACCEPT
2. iptables -A INPUT -i eth0 -s айпи сервера -m conntrack --ctstate NEW,INVALID,ESTABLISHED,RELATED,SNAT,DNAT -j ACCEPT
3. iptables -A INPUT -i tap_tap_virtual -s 192.168.10.0/24 -j ACCEPT
4. iptables -A INPUT -i eth0 -s айпи домашнего компа -m conntrack --ctstate NEW,INVALID,ESTABLISHED,RELATED,SNAT,DNAT -j ACCEPT

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P POSTROUTING ACCEPT
iptables -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

Вот что задумано в таблице INPUT:

  1. Обеспечение работы виртуального сервера от физического.
  2. Разрешаю входящие пакеты на физический интерфейс от самого виртуального сервера (удалённое использование браузера, установка обновлений системы и приложений).
  3. Разрешаю входящие пакеты на виртуальный интерфейс от удалённых компьютеров локальной сети.
  4. Разрешаю входящие пакеты на физический интерфейс только от моего домашнего компа (администрирование, любые протоколы и т. д.).

Помимо ещё остались вопросы:

  1. VNC через браузерную панель управления VPS по каким сетевым правилам будет работать?
  2. Протоколы и порты я не указывал, сойдёт такой подход?
  3. Возможен ли брутфорс или другие ddos атаки на мой сервер с таким настойками?
  4. Можно ли получить от моего сервера какую-нибудь информацию, например с помощью Active Probing?

PS. Я обратил внимание на отсутствие рекламы и возможности донатов на сайте, т. е. прямых стимулов консультаций. Возможно, просто это всё вам очень интересно, но намекните, если что-то ожидаете от пользователей.

Kisliy
() автор топика
Ответ на: комментарий от Kisliy

Обеспечение работы виртуального сервера от физического.

нет, lo это loopback интерфейс системы он не имеет отношения к физическому серверу, но правило нужно т.к. иначе некоторые локальные службы могут не работать

Разрешаю входящие пакеты на физический интерфейс от самого виртуального сервера (удалённое использование браузера, установка обновлений системы и приложений).

не имеет смысла, процессы внутри системы через lo интерфейс работают а он у тебя разрешен правилом выше

Разрешаю входящие пакеты на виртуальный интерфейс от удалённых компьютеров локальной сети.

В целом да, но зависит от типа vpn если у тебя на основе ppp (pptp, l2tp)то имя интерфейса у каждого клиента будет свое и тогда используют -i ppp+, если что-то другое (ipsec ikev2, openwpn, wireguard, ...) то смотреть надо я на память не помню как там происходит

Разрешаю входящие пакеты на физический интерфейс только от моего домашнего компа (администрирование, любые протоколы и т. д.).

В целом да, но нет смысл все возможные состояния conntrack указывать

iptables -P PREROUTING ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P POSTROUTING ACCEPT

не имеет смысла (если у тебя не hardened ядро где все DROP по дефолту)

VNC через браузерную панель управления VPS по каким сетевым правилам будет работать?

Ни по каким, VNC на VPS это IP-KVM, просто трансляция монитора в VNC, смотри в настройках VPS может там можно настроить ограничение доступа к VNC

Протоколы и порты я не указывал, сойдёт такой подход?

Да. это опционально. Единствееное я у тебя не увидел разрешающих правил для подключения к vpn, но если задача только с домашнего компа коннектиться то сойдет

Возможен ли брутфорс или другие ddos атаки на мой сервер с таким настойками?

iptables -P FORWARD ACCEPT - не очень хорошо весь FORWARD разрешать, тобой могут пользоваться как шлюзом (но только те кто с твоим vps в одной l2 сети)

Можно ли получить от моего сервера какую-нибудь информацию, например с помощью Active Probing?

Возьми nmap и посмотри


Базовый fw для твоих хотелок, дальше уже по желанию можешь дорабатывать

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s <домашний_ip> -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -i <vpn_интерфейсы> -s <vpn_подсеть>  -m conntrack --ctstate NEW -j ACCEPT
iptables -P INPUT DROP

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i <vpn_интерфейсы> -o eth0 -m conntrack --ctstate NEW -j ACCEPT
iptables -P FORWARD DROP

iptables -t nat -A POSTROUTING -s <vpn_подсеть> -o eth0 -j MASQUERADE

ip6tables -A -i lo -j ACCEPT
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP

Kolins ★★★
()
Ответ на: комментарий от Kolins

Спасибо, вроде бы всё понятно, работает, но что-то пошло не так: если прописать мой домашний ip, в iptables он преобразуется в сеть:

-A INPUT -s 81.13.109.166/32 -m conntrack --ctstate NEW -j ACCEPT

Причём это не исправляется путём правки самого текстового документа, как тут выкрутиться?

Ещё, если подключиться через мобильный интернет с помощью клиента VPN, соединение устанавливается! Но правило input -P DROP, кроме ip домашнего компа, не срабатывает :(

Вот рабочая таблица: 

*nat
:PREROUTING ACCEPT [19930:2043427]
:INPUT ACCEPT [71:4916]
:OUTPUT ACCEPT [7070:488737]
:POSTROUTING ACCEPT [7070:488737]
-A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

*filter
:INPUT DROP [10082:655698]
:FORWARD DROP [31:1240]
:OUTPUT ACCEPT [83474:52060993]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.10.0/24 -i tap_tap_virtual -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -s 81.13.109.166/32 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tap_tap_virtual -o eth0 -m conntrack --ctstate NEW -j ACCEPT

*mangle
:PREROUTING ACCEPT [205162:70653036]
:INPUT ACCEPT [80972:18457042]
:FORWARD ACCEPT [123318:52073900]
:OUTPUT ACCEPT [84963:52179591]
:POSTROUTING ACCEPT [208295:104256049]
Kisliy
() автор топика
Ответ на: комментарий от Kisliy

Ты молодец, не боишься всем показать свой IP. Ты некоторый IP адрес, как адрес источника, в адресе IPv4 32 бита, есть общепринятые диапазоны (размерности сетей).

К примеру сеть с адресом 192.168.1.0/24, маска 24 указывает, что 8 битов относятся под бита узлов этой сети.

И допустим тебе нужно в правилах iptables заблокировать доступ с адреса 192.168.1.128, в этом случае правильно указать 192.168.1.128/32. В другой ситуации тебе нужно заблокировать доступ для диапазона IP адресов 192.168.1.129-192.168.1.191, в этом случае ты укажешь 192.1668.1.128/26, а в случае, если до 255 адреса, то /25.

Аналогично и в белых IP адресах, твой адрес мог бы быть 81.13.109.164 и он соответствует сети 81.13.109.164/30, поэтому полная запись с указанием маски всегда.

anonymous
()
Ответ на: комментарий от anonymous

Ты молодец, не боишься всем показать свой IP.

( ̄_, ̄ )

И допустим тебе нужно в правилах iptables заблокировать доступ с адреса 192.168.1.128, в этом случае правильно указать 192.168.1.128/32. В другой ситуации тебе нужно заблокировать доступ для диапазона IP адресов 192.168.1.129-192.168.1.191, в этом случае ты укажешь 192.1668.1.128/26, а в случае, если до 255 адреса, то /25. Аналогично и в белых IP адресах, твой адрес мог бы быть 81.13.109.164 и он соответствует сети 81.13.109.164/30, поэтому полная запись с указанием маски всегда.

Если честно, совсем не понятно… возможно ответ с подвохом :) Мне же конкретный ай пи и маску выдал провайдер, а я просто должен посмотреть по таблице скольки битам соответствует моя маска и вбить в iptables? А тогда зачем нужно повышать или понижать битовый префикс, если одинаковых публичных ай пи адресов не бывает?

Kisliy
() автор топика
Ответ на: комментарий от Kisliy

если одинаковых публичных ай пи адресов не бывает?

это кто тебе такое сказал? первый же одинаковый публичный ип находится намного ближе чем ты думаешь. им пользуются миллиарды каждый день ) но в силу того что разные ип адреса одинаковые заметить ты это никак не можешь.

antech
()
Ответ на: комментарий от anonymous

К примеру сеть с адресом 192.168.1.0/24, маска 24 указывает, что 8 битов относятся под бита узлов этой сети.

Вот скажи мне, почему ты говоришь это так как будто думаешь нижней головой а не верхней. Как может 24 указывать на 8? 24 это ни разу не 8. /24 это буквально 24 бита выделеные под адрес сети. И вообще есть причина по которой говорят про биты сети а не хостов. Из-за бкаста под хосты выделено 7.5 бит )))))

antech
()
Ответ на: комментарий от Kisliy

Ты так и скажи, что не понимаешь, что такое ip адрес и что такое маска, что означает маска /32.

И думаешь только про себя. Это тебе провайдер выдал один ip адрес, а кому-то выдает целые сети, например /27 на 30 адресов. И при написании правил он укажет адрес сети 81.13.109.96/30.

Маска /32 вмещает «сеть» с одним ip адресом.

kostik87 ★★★★★
()
Ответ на: комментарий от antech

Как может 24 указывать на 8?

Молча.

24 это ни разу не 8. /24 это буквально 24 бита выделеные под адрес сети.

32-24=8. 24 бита для кодирования адреса сети, 8 битов для кодирования диапазона хостов.

Автор топика не понимает, что такое маска, что такое IP адрес, какая между ними связь и зачем нужна маска. Что будет результатом операции логического и между IP адресом и маской.

anonymous
()
Ответ на: комментарий от anonymous

32-24=8. 24 бита для кодирования адреса сети, 8 битов для кодирования диапазона хостов.

88-24=64 мбита скорости соединения.

это все фантазии. а написано про 24бита адреса сети. количество бит никак не объясняет зачем нужна маска. более того ни в одном поле ип пакета не указано сколько там бит в маске. выходит оно прекрасно работает вообще не зная ни о какой маске.

antech
()
Ответ на: комментарий от antech

Ты просто упёрся рогом и не пытаешься понять что написано, а доказываешь, что так, как написано тебе не понятно и не имеет смысла. Это не мои проблемы.

более того ни в одном поле ип пакета не указано сколько там бит в маске.

Маска применяется на маршрутизаторах при просмотре таблицы маршрутизации, собственно в ней она и фигурирует, а так же используется в правилах пакетных фильтров (файрволлов) для указания диапазона IP адресов (адресов сетей).

anonymous
()
Ответ на: комментарий от Kisliy

если прописать мой домашний ip, в iptables он преобразуется в сеть:

/32 это сеть из одного адреса, да iptables так делает и в этом нет ничего страшного

Но правило input -P DROP, кроме ip домашнего компа, не срабатывает :(

Ну тут илли рпзрешать подключаться к vpn вообще всем (сомневаюсь что у тебя на мобильном статичный ip) или port-knocking делать и перед подключением с мобильника «простукивать» сервер чтобы он ip в разрешенные добавлял на определенное время

Kolins ★★★
()

iptables надо изучать капитально. Включая базовые знания сети и отладки проблем. Без этого лучше фаервол вообще не трогать. Большой необходимости в нем нет.

У некоторых хостеров бывает внешний фаервол. Если такое есть, лучше его использовать.

PS сейчас надо использовать nftables. Или обертку типа ufw.

vbr ★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от antech

Как может 24 указывать на 8?

24+8=32 не?

/24 это буквально 24 бита выделеные под адрес сети.

Это префикс сети.

Из-за бкаста под хосты выделено 7.5 бит
7.5 бит

Это простите сколько? Нарисуйте плиз. 0.5 литра в меня укладывается, но вот 0.5 бита не очень заходит.

anc ★★★★★
()
Ответ на: комментарий от antech

это кто тебе такое сказал? первый же одинаковый публичный ип находится намного ближе чем ты думаешь. им пользуются миллиарды каждый день ) но в силу того что разные ип адреса одинаковые заметить ты это никак не можешь.

Никто, просто загуглил… и я согласился с вот этим занимательным рассказом: Как функционирует публичный IP-адрес? Публичные IP-адреса маршрутизируются, и каждый из них уникален. Двух одинаковых публичных IP-адресов не существует. Свой публичный IP-адрес вы получаете от интернет-провайдера. Основное отличие заключается в том, что публичный IP-адрес может связывать вас со всем виртуальным миром, а частный IP-адрес — только с маршрутизатором или сервером, за которым он закреплен и который, в свою очередь, имеет свой публичный IP-адрес для связи с Интернетом. https://surfshark.com/ru/what-is-my-ip

Kisliy
() автор топика
Ответ на: комментарий от kostik87

Ты так и скажи, что не понимаешь, что такое ip адрес и что такое маска, что означает маска /32. И думаешь только про себя. Это тебе провайдер выдал один ip адрес, а кому-то выдает целые сети, например /27 на 30 адресов. И при написании правил он укажет адрес сети 81.13.109.96/30. Маска /32 вмещает «сеть» с одним ip адресом.

Я в общем-то и написал: «Если честно, совсем не понятно…» Т. е. это намёк на то что мой ip адрес не «железный» и может располагаться в любой сетевой маске, а не только в той которую выдал провайдер, соответственно iptables не сумеет этого понять? Видимо… все участники хотят чтобы я диплом защитил в этом топике 🤓

Kisliy
() автор топика