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

Странная задачка по iptables

 


0

0

Суть в том что на персональной машине надо сделать глухой файервол. Такой чтобы всё ходило только через ВПН и ни как иначе. При неработающем ВПН машина должна только уметь получить DHCP и подключиться к ВПН. Для решения взят openvpn на нем настроены сервера и доступ к нему сделан по портам 443 tcp и udp. Это чтобы из всяких вебкафе и аэропортов подключаться, попадаются такие что не дают по стандартному порту работать, а 443 открыт везде.

Таблицу маршрутизации система строит сама. Специально не правил. Там по дефолту все вроде красиво заворачивается и смысла править нет.

Вывод iptables -n -L -v

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2667  229K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 114K   33M ACCEPT     all  --  tun0   *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    2    80 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:443
 116K   40M ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:443

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 250 packets, 19762 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2667  229K ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:68 dpt:67
   30  6414 ACCEPT     all  --  *      tun0    0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
 118K   31M ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:443
В общем всё настроено просто и незатейливо. А главное работает и функции свои в общем-то выполняет. Но в голове вдруг возникла мысль от которой чет не выходит избавиться. Если вдруг, произойдет что-то с таблицей маршрутов, например вдруг рухнет ВПН, то выйдет так что файервол будет выпускать пакеты https на вольные хлеба интернета по 443 порту. А это есть не хорошо.

Пропиши адрес и не мучь мозг, скажут мне, но проблема еще немного шире, фиксированного сервера ВПН нет. По адресу его прописать нет возможности. И конфигурация такая используется на нескольких машинах которые работают с разными серверами ВПН. Причем бывает даже так что пользователю надо по быстрому отрубить один ВПН и тут-же врубить другой. А некоторые пользователи на столько пользователи что мышь от клавы отличают пересчитывая кнопки.

В общем может кто-то подсказать куда копать в направлении решения этой проблемы? В первую голову нужна идея. Но если есть еще и готовое решение, вообще буду рад.

На всякий случай: система Mint 18.2 Cinnamon 64bit

P.S. За (ACCEPT all  — * tun0 0.0.0.0/0 0.0.0.0/0) не ругайте. На реальной конфигурации длинная портянка с фиксированными портами, но для вопроса она как-бэ не важна.

Вроде, -m owner (модуль iptables) ещё живой, так что делайте запуск openvpn от отдельного пользователя и как-то разрешайте ему ходить.

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

Спасибо. подумаю в этом направлении. То есть Вы намекаете что правила ACCEPT tcp/udp dpt:443 и ACCEPT tcp/udp spt:443 разрешить только тому из под кого работает openvpn?

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

А зачем в INPUT разрешено ходить пакетам с src 443? Когда нужно (ответы на уст. соединения) ESTABLISHED по этим портам разрешить. И в output spt:68 dpt:67 можно убрать, ip получит сетевуха.

Пропиши адрес и не мучь мозг

А в таблицу на клиенте n количество маршрутов (до разных VPN серверов) добавить не вариант?

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

А зачем в INPUT разрешено ходить пакетам с src 443? Когда нужно (ответы на уст. соединения) ESTABLISHED по этим портам разрешить.

Разумно. Писалось так давно что об этом не подумал. С тех пор только копипастилось. :)

И в output spt:68 dpt:67 можно убрать, ip получит сетевуха.

Не вариант. Не везде работает.

А в таблицу на клиенте n количество маршрутов (до разных VPN серверов) добавить не вариант?

Не вариант. Неизвестны все сервера. Пишется универсальный конфиг под те сервера что могут в том числе еще и не существовать. Адрес могу узнать только из конфига клиента.

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

Да.

Или второй вариант, указывать openvpn коннектиться на другой порт, допустим 55555, в filter/OUTPUT запретить 443, а nat/OUTPUT -j DNAT перенаправить 55555 на 443.

Хотя решение с запуском openvpn из под отдельного пользователя и разрешие только ему 443 порт кажется более правильным. Но там нужно смотреть, все ли действия по установлению соединения openvpn выполняет от пользователя, а не от root'а ( https://community.openvpn.net/openvpn/wiki/UnprivilegedUser ).

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

Не вариант. Не везде работает.

а я сколько помню, не приходилось с dhcp возиться.

Адрес могу узнать только из конфига клиента.

И как это мешает добавить маршруты? У клиента есть конфиг в котором, есть адрес нужного сервера, при подключении к openvpn добавляется маршрут до нужного сервера.

ving2
()
Последнее исправление: ving2 (всего исправлений: 2)
Ответ на: комментарий от system-root

засунь openvpn в docker и всё.

А как это сделать, всмысле как трафик с хоста заставить ходить через этот контейнер, из которого будет происходить впн подключение?

ving2
()
Ответ на: комментарий от system-root

наоборот же.

Создаём сеетвое пространство имён с доступом наружу только через VPN и всё стрёмное запускаем там.

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

Или второй вариант, указывать openvpn коннектиться на другой порт, допустим 55555, в filter/OUTPUT запретить 443, а nat/OUTPUT -j DNAT перенаправить 55555 на 443.

Спасибо. Как-то не допер сам. А может еще проще? Разрешить 443 порт только для openvpn? тоже надо глянуть.

Хотя решение с запуском openvpn из под отдельного пользователя и разрешие только ему 443 порт кажется более правильным. Но там нужно смотреть, все ли действия по установлению соединения openvpn выполняет от пользователя, а не от root'а

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

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

а я сколько помню, не приходилось с dhcp возиться.

А я столкнулся как раз с этим. :) Причем еще только когда городил fw. Удивительно прям как-то.

И как это мешает добавить маршруты? У клиента есть конфиг в котором, есть адрес нужного сервера, при подключении к openvpn добавляется маршрут до нужного сервера.

Да никак не мешает, кроме того что надо городить скрипт который полезет в настройки wf при каждом старте openvpn. Причем до старта. Вообще предпочитаю чтобы в fw никто никогда не лазил динамически из скриптов. Чем меньше всякие криворукие админы, вроде меня, своими скриптами копаются в fw, тем надежнее fw работает.

AfterWork
() автор топика
Ответ на: комментарий от system-root

засунь openvpn в docker и всё.

при падении чего-либо, весь трафик будет уходить в никуда Решение конечно, но IMHO огород. городить докер только для того чтобы через него траф гонять и только на локальной машине? по моему всё-таки огород. Хотя как решение всё-же может иметь место быть.

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

wf fw

WTF? у тебя же на клиентах соединение через NM? Я не правильно написал, заранее добавляется маршрут в настройках, а дефолтный шлюз убирается (в NM это называется дословно не помню - «использовать соединение только для локальной сети», как то так.). Единственное каждый раз придется добавить строчку в настройках соединения, при появлении нового конфига у клиента.

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

У меня для firewalld сделано следующее:

<?xml version="1.0" encoding="utf-8"?>
<direct>
  <chain table="filter" chain="killswitch" ipv="ipv6"/>
  <chain table="filter" chain="killswitch" ipv="ipv4"/>
  <rule table="filter" chain="OUTPUT_direct" priority="0" ipv="ipv4">-j killswitch</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o w+ -p udp -m owner --gid-owner 1000 -m udp --dport 53 -m comment --comment 'Reject DNS over UDP' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o e+ -p udp -m owner --gid-owner 1000 -m udp --dport 53 -m comment --comment 'Reject DNS over UDP' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o b+ -p udp -m owner --gid-owner 1000 -m udp --dport 53 -m comment --comment 'Reject DNS over UDP' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o w+ -p tcp -m owner --gid-owner 1000 -m tcp --dport 53 -m comment --comment 'Reject DNS over TCP' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o e+ -p tcp -m owner --gid-owner 1000 -m tcp --dport 53 -m comment --comment 'Reject DNS over TCP' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o b+ -p tcp -m owner --gid-owner 1000 -m tcp --dport 53 -m comment --comment 'Reject DNS over TCP' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-d 192.168.0.0/16 -m owner --gid-owner 1000 -m comment --comment 'Allow local network' -j ACCEPT</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-d 169.254.0.0/16 -m owner --gid-owner 1000 -m comment --comment 'Allow local network' -j ACCEPT</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-d 172.16.0.0/12 -m owner --gid-owner 1000 -m comment --comment 'Allow local network' -j ACCEPT</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-d 10.0.0.0/8 -m owner --gid-owner 1000 -m comment --comment 'Allow local network' -j ACCEPT</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o e+ -m owner --gid-owner 1000 -m comment --comment 'Reject no-VPN Ethernet' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o w+ -m owner --gid-owner 1000 -m comment --comment 'Reject no-VPN WLAN' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o b+ -m owner --gid-owner 1000 -m comment --comment 'Reject no-VPN Bluetooth' -j REJECT --reject-with icmp-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-o teredo -m owner --gid-owner 1000 -m comment --comment 'Allow teredo' -j ACCEPT</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv4">-i teredo -m owner --gid-owner 1000 -m comment --comment 'Allow teredo' -j ACCEPT</rule>

  <rule table="filter" chain="OUTPUT_direct" priority="0" ipv="ipv6">-j killswitch</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o w+ -p udp -m owner --gid-owner 1000 -m udp --dport 53 -m comment --comment 'Reject DNS over UDP' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o e+ -p udp -m owner --gid-owner 1000 -m udp --dport 53 -m comment --comment 'Reject DNS over UDP' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o b+ -p udp -m owner --gid-owner 1000 -m udp --dport 53 -m comment --comment 'Reject DNS over UDP' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o w+ -p tcp -m owner --gid-owner 1000 -m tcp --dport 53 -m comment --comment 'Reject DNS over TCP' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o e+ -p tcp -m owner --gid-owner 1000 -m tcp --dport 53 -m comment --comment 'Reject DNS over TCP' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o b+ -p tcp -m owner --gid-owner 1000 -m tcp --dport 53 -m comment --comment 'Reject DNS over TCP' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-d fe80::/10 -m owner --gid-owner 1000 -m comment --comment 'Allow local network' -j ACCEPT</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-d fd00::/8 -m owner --gid-owner 1000 -m comment --comment 'Allow local network' -j ACCEPT</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o e+ -m owner --gid-owner 1000 -m comment --comment 'Reject no-VPN Ethernet' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o w+ -m owner --gid-owner 1000 -m comment --comment 'Reject no-VPN WLAN' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o b+ -m owner --gid-owner 1000 -m comment --comment 'Reject no-VPN Bluetooth' -j REJECT --reject-with icmp6-port-unreachable</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-o teredo -m owner --gid-owner 1000 -m comment --comment 'Allow teredo' -j ACCEPT</rule>
  <rule table="filter" chain="killswitch" priority="0" ipv="ipv6">-i teredo -m owner --gid-owner 1000 -m comment --comment 'Allow teredo' -j ACCEPT</rule>

</direct>
Это запрещающие правила для моего пользователя, а OpenVPN через NetworkManager запускается из-под специального пользователя nm-ovpn.

ValdikSS ★★★★★
()
3 декабря 2017 г.
Ответ на: комментарий от ValdikSS

Спасибко. Только что руки дошли до разбора этого вопроса.

AfterWork
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.