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
() автор топика
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.