LINUX.ORG.RU
Форум — Admin  

Постичь магию iptables

 ,


1

3

Как правильно написать правила для iptables?

Задача следующая: сделать белый список сайтов, которые можно посещать, например: англоязычная википедия и, видимо, викимедия, чтобы грузились иллюстрации к статьям. Что делать с сайтами a la gen.lib.rus.ec, где должна быть возможность доступа к зеркалам (для скачивания книг)?

Так же надо оставить возможность обновляться: если с репозиториями для pacman'а понятно, что нужно сделать (разрешить адреса из mirrorlist), то как поступить с AUR? (добавить сервер AUR и github в белый список?)

Как оставить возможность пользоваться торрентами, IM (Telegram, jabber) и «прочим»?

Железо следующее: ноутбук с Arch Linux и win в дуалбуте (хорошо, если проблема разрешима и для него с минимальными изменениями) и роутер ZyXEL. К сожалению, создание правил на роутере не подходят, т.к. закрыть доступ нужно только для ноутбука.

P.S. Нужно ли добавлять DNS сервера, чтобы не вводить ip адреса вручную?

★

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

Средствами одного iptables задача нерешаема, потому что iptables работает на 3 уровне модели OSI и не может знать о всех протоколах более высокого уровня(HTTP, IM и т.д.).

То есть, для того чтобы «англоязычная википедия и, видимо, викимедия, чтобы грузились иллюстрации к статьям.» - данная задача уже подразумевает как минимум знания о DNS(ну или регулярное ручное слежение за обновлением IP-адресов вышеуказанных ресурсов = костыль).

Конкретно эта задача(доступ только по определенным доменным именам по HTTP) решается с помощью прокси-сервера(можно - в прозрачном режиме), например Squid.

Как оставить возможность пользоваться торрентами, IM (Telegram, jabber) и «прочим»?

Определись что такое «прочим» и если устраивает открытие определенных портов - открой их. Но только ты учти, что, например, если есть служба на 80 порту - то это не значит что там будет 100% HTTP. Кстати, обход файрволов, которые полагаются на это правило именно так и делается.

P.S. Нужно ли добавлять DNS сервера, чтобы не вводить ip адреса вручную?

Если ты укажешь DNS-имя в правиле iptables, то оно будет разрешено в первый доступный IP при загрузке правил. Если у ресурса несколько IP - это никак не будет отражено в правилах. Как я уже сказал - iptables ничего не знает о структуре DNS и оперирует именно IP-адресами.

В общем случае твоя задача решается через DPI, но это - совсем не «домашний» уровень.

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

Вот оно как. Я думал всё проще.

Определись что такое «прочим» и если устраивает открытие определенных портов - открой их. Но только ты учти, что, например, если есть служба на 80 порту - то это не значит что там будет 100% HTTP. Кстати, обход файрволов, которые полагаются на это правило именно так и делается.

Немного не понял. Служба на чьей стороне: у меня или сервера, к которому я обращаюсь?

Под прочим подразумеваю различный софт, который ходит в интернет: mpdscribble, git и прочие консольные утилиты.

Можете рассказать что-нибудь про DPI? Из живых нашёл только nDPI.

vanzef ★
() автор топика

Наверное можно написать скрипт на баше, который будет через каждые 10 минут перегенерировать список правил, которые потом будут загружаться через iptables-restore.

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

А что он должен будет генерировать? Вроде у всех сайтов ip статические (или нет?), могу привести список, если это очень важно.

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

Немного не понял. Служба на чьей стороне: у меня или сервера, к которому я обращаюсь?

У сервера. То есть ты, например, разрешаешь людям ходить на 80 порт по TCP везде, думая что дал им доступ по HTTP. Остальной траффик людям режешь.

Хитрожопый товарищ поднимает у себя на серваке OpenVPN на 80 порту, пробрасывает туннель туда из твоей локалки - и ты хрен увидишь куда он на самом деле ходит и на какие порты стучится.

Можете рассказать что-нибудь про DPI? Из живых нашёл только nDPI.

Серьезные коммерческие реализации стоят сотни нефти. А с nDPI - много траха, тут на ЛОРе есть тред, где люди раскладывают всё по полочкам - enjoy

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

Вроде у всех сайтов ip статические

Вот к примеру ya.ru:

pinkbyte@phantom ~ $ nslookup ya.ru
Server:         192.168.1.10
Address:        192.168.1.10#53

Non-authoritative answer:
Name:   ya.ru
Address: 93.158.134.3
Name:   ya.ru
Address: 213.180.204.3
Name:   ya.ru
Address: 213.180.193.3

Уже 3 адреса. Далее - завтра они могут поменяться - как ты об этом узнаешь? Squid в этом плане хорош для HTTP потому что он берет на себя работу по HTTP-протоколу, DNS-резолвингу и прочему, а ты чисто пилишь в правила домены которые тебе нравятся/не нравятся.

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

А что насчет polipo? Вроде то же самое, но более лёгкое.

Если я буду использовать squid/polipo у меня torrent работать же будет?

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

Если я буду использовать squid/polipo у меня torrent работать же будет?

Общение с трекером - да, как правило трекеры работают по tcp(но есть и те, что работают по udp). Сами торренты работать не будут - там абсолютный рандом по номерам портов.

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

Ээээ, что? Ты выбираешь ВХОДЯЩИЙ порт(или диапазон порта, или вообще UPnP). Для подключений к ТЕБЕ. То есть ты можешь предсказать какие порты надо открыть чтобы могли качать с тебя. А вот гарантировать, что у Васи Пупкина из соседнего подъезда будет открыт тот же порт - ты не можешь.

Поэтому, ок, я неточно выразился. Если ты прикроешь все порты на исходящие коннекты, кроме HTTP - торренты работать будут, но местами: раздавать ты сможешь(при условии что входящий порт будет открыт, конечно же), скачивать - нет.

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

Смотри, тебе нужно будет:

  • поднять squid в прозрачном режиме(так проще для клиентов)
  • написать разрешающие правила
  • на iptables завернуть трафик REDIRECT/DNAT в таблице nat с tcp dport 80 на свой squid

НО ты не сможешь так фильтровать HTTPS.

Если нужно фильтровать HTTPS трафик:

  • пишешь свои правила(по имени домена, не URL)
  • запускаешь squid
  • рубишь FORWARD для tcp по dstport 80, 443
  • настраиваешь клиенты на использование прокси

Таким образом нельзя будет фильтровать по URL при https соединении, но можно по dstdomain и dstdom_regex

Вариант с прозрачным проксиорванием HTTPS реализуем только при наличии развернутого PKI, сложно, но можно. Из коробки(более или менее) работает только у M$ в виде AD + ADCS + TMG.

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

Вы, похоже, описали промышленное решение, а мне для дома нужно. Для своего ноутбука)

Можно ли это сделать проще? И что с torrent'ами?

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

А что Zyxel не умеет фильтрацию трафика? Не верю(с)

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

Может и умеет, хотя роутеру лет 6, но разве он не будет фильтровать весь трафик?

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

в случае с локальной машиной так просто не получится. в linux, к сожалению(а может к счастью) нет application firewall. Есть(был, по крайней мере) только матчер по uid процесса. Принцип работы будет состоять в том, чтобы запустить прокси от другого пользователя, в случае со squid - это будет squid. Нужно создать такие постоянные правила для iptables:

-A OUTPUT -m owner --uid-owner <uid пользователя от которого будет запущен прокси> -j ACCEPT
-A OUTPUT -j permit_proxy
-A OUTPUT -p tcp --dport 80 -j DROP
-A OUTPUT -p tcp --dport 443 -j DROP

И потом настроить систему на использование прокcи в profile(или где там он настраивается в твоем дистре)

http_proxy=http://127.0.0.1:3128
https_proxy=http://127.0.0.1:3128
торренты как ходили, так и будут ходить, просто с http-трекерами будут связываться через proxy. Если используется torrent-клиент, который умеет работать демоном(deluge,transmission,rtorrent), то ему, как и squid, можно будет разрешить работать напрямую, добавив правило в начало списка с его uid.

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

кстати, подумал немного насчет проще - можно попробовать поднять у себя DNS сервер, который будет форвардить разрешенные запросы дальше, а в resolv.conf записать namserver 127.0.0.1. Но тут придется попотеть над созданием белого списка для всего(сайты+хостнеймы трекеров+почта+чтотамещенужно). Правда, такая фильтрация обходится очень легко - прописать альтернативный DNS в браузере, если можно или воспользоваться прокси по IP или TOR.

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

application firewall.

Есть Mandatory Access Control, через который можно его реализовать, но да, это будет сложнее всего того, что тут уже упомянули ;)

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

Похоже, что это решение моей проблемы, спасибо!

Загуглил «application firewall linux» и нашёл Douane. Слышали что-нибудь про него?

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

Нет, про сей продукт не слышал - никогда не вставало такой задачи.

TOXA ★★
()

Вполне в меру решаемая задача. Если ты сам конечно свои же запреты не собрался обходить. А так обычно достаточно достаточно закрыть дефолтный порт приложения или/и заблокировать все ip адресса серверов аунтефикации которое оно использует. А так тебе первым сообщением все правильно ответили. Да ты собрался неправильно решать задачу изначально, тебе просто DMZ на роутере нужна, или проброс портов на нем же.
На счет iptables можешь в том числе воспользоваться этим скриптом, он достаточно неплохо прокомментирован, и поможет тебе разобраться.

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

Я нисколько не сомневаюсь, что внешними модулями можно добиться чего угодно - есть тот же QUEUE/NFQUEUE.

И прикинь, я даже гонял l7 filter в своё время. Так что можешь мне не рассказывать.

Но это никак не отменяет того факта, что критерии отбора в стандартных модулях, идущих в поставке iptables - не прикладного уровня и работают с IP-пакетами(ВНЕЗАПНО!), а не с пакетами данных конкретных протоколов.

Да, такие вещи как conntrack-модули для FTP/SIP/H.323 вынуждены лезть глубже, но при этом факт остается фактом - основа для построения правил - IP-пакеты.

Так же и у ebtables, который условно работает на уровень ниже.

Pinkbyte ★★★★★
()

Можешь написать скриптец, который тебе в ipset будет загонять не угодников. :) Через какое-то время - точно всё побанишь, добьёшься того, чего нужно.

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