LINUX.ORG.RU
ФорумAdmin

iptables - запретить всё, кроме списка разрешённых, всем, кроме списка разрешённых

 , ,


0

1

Доброго времени суток уважаемому сообществу.
Дано:
Debian NetInstall + iptables
В списке правил iptables, настроен NAT и блокировка сайтов по стрингам. Однако число сайтов для запрета растёт вместе с грамотностью юзеров и настал день, когда начальство дало команду «закрыть доступ всем, кроме нас! Мы сами скажем к каким сайтам открывать доступ». То есть, подразумевается, что iptables (squid я ещё не достаточно хорошо освоил) нужно настроить для работы с двумя списками: 1 - список vip-адресов локальных компов, 2 - список разрешённых сайтов.
Погуглил я вопрос - нашёл множество примеров скриптов (большей частью нерабочих) которые либо блокируют сайты по списку, либо пускают в обход правил локальные компы по списку.
В общем по моему вопросу я ни инструкций, ни примеров не нашёл.
Заранее благодарен за любую помощь.


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

это по http, а по https стринги вообще не должны никак работать. по идее.

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

По хттпс - стринги работают. Проверено. К тому же, если решится заданный мною в шапке вопрос, то стринги отпадут за ненадобностью.

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

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

leader32
()

squid я ещё не достаточно хорошо освоил

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

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

плюсую

сначала копать в сторону squid и dns а уж потом фильтровать/дать доступ к тому чего не хватает с помошью iptables, ipset итд...

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

Решить.

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

Просто для этого есть куда более подходящие средства, где это можно сделать проще.

Так же плюсую за сквид.

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

Возможно я ошибаюсь, но по-моему CONNECT обычно используется в случае явного хождения через прокси. В случае прямого коннекта TLS стартует сразу без тунелей.

Поскольку у ОПа прокси нет, то предполагаю что https у него скорее все блочится по стрингам из сертификата сервера.

N-N
()
Ответ на: комментарий от Nehtez

Просто открой начальству всё, а остальным только белый список. Всё-равно движется к этому. С этим справится кто угодно. Но, лучше осилить один мануал к squid и его прекрасно задокументированный конфик.

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

А можно наглядный пример правила iptables где сперва всё разрешается только локальным компам с айпишниками из белого списка, а потом блочится всё, кроме адресов из второго белого списка?

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

Вы путаете что-то. Сертификат не может быть зашифрован по определению ибо он содержит публичный ключ, иначе как клиент прочитает его? Откройте wireshark если интересно.

Кстати поправлю себя самого - нужный стринг проскакивает даже раньше - на этапе client hello.

По теме - не пробовал вайтлистить домены фаерволом, но пока не вижу проблемы. Сейчас не вспомню синтаксис iptables, но по аналогии с ipfw должно же быть что то вроде:

allow all from ${vip} to any 80,443
allow all from ${vse_ostalnie} to any 80,443 -m string etc.
deny all from any to any
Перечисляем нужные стринги через -m string в правиле для остальных. Хотя я не знаю может ли iptables в списки стрингов. Скорей всего их нужно указывать последовательно в одном правиле, либо что вероятнее делать отдельное правило под каждый стринг.

Ну и конечно лучше сквидом это все делать.

N-N
()
Ответ на: комментарий от Nehtez

Оно разрешит site1.ru и добавить по правилу для каждого адреса. Если там же хостится и запрещенный сайт, то его тоже пропустит.

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

При добавлении всё разрешается ip-адрес.

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

пояснить в этом случае = написать весь блок правил...

ноги растут отсюда https://www.frozentux.net/documents/iptables-tutorial/ (много букв)

суть простая - используй ipset

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

Не, весь блок у меня уже есть. Мне бы теперь только синтаксис правила, которое полностью открывает доступ в инэт конкретному локальному IP

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

Трындец... Дайте мне это развидеть! Модераторы Pinkbyte, уберите это с лора. Я даже немного послушал, бред сивой кобылы и 4.2 присутствуют.
ЗЫ а автора(Hi) за провокацию в бан.

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

Уже предложил, такой чуши не место на лоре, тут же дети бывают

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

Я все-таки ради интереса осилил полностью... лютая чушня

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

а ведь я просто спросил синтаксис правила :-(

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

Накидал тут списочек правил. Проверьте, плиз, - всё ли правильно выстроил:
# Разрешаем трафик на loopback-интерфейсе
iptables -A INPUT -i lo -j ACCEPT

# Разрешаем доступ из внутренней сети наружу
iptables -A FORWARD -i enp1s0 -o enp2s0 -j ACCEPT

# Включаем NAT
iptables -t nat -A POSTROUTING -o enp2s0 -s 192.168.0.0/24 -j MASQUERADE

# Разрешаем ответы из внешней сети
iptables -A FORWARD -i enp2s0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Открываем полный доступ VIP`ам
iptables -A FORWARD -s 192.168.0.6 -j ACCEPT

# Открываем доступ для всех к разрешённым сайтам

iptables -A FORWARD -m string --string «google» -j ACCEPT

# Запрещаем доступ из внешней сети

iptables -A FORWARD -i enp2s0 -o enp1s0 -j REJECT

# Блочим интернет
iptables -P INPUT -j DROP
iptables -P OUTPUT -j DROP
iptables -P FORWARD -j DROP

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

Не, не правильно
1. FORWARD все закончиться на
iptables -A FORWARD -i enp2s0 -m state --state ESTABLISHED,RELATED -j ACCEPT
2. output вообще в drop, вам на роутере на output вообще ничего не нужно? Даже с lo ? Админим с консоли?

Убрать

# Разрешаем доступ из внутренней сети наружу
iptables -A FORWARD -i enp1s0 -o enp2s0 -j ACCEPT

Принципиально REJECT ? При учете полиси DROP ?

# Запрещаем доступ из внешней сети
iptables -A FORWARD -i enp2s0 -o enp1s0 -j REJECT

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

а если так?
# Разрешаем трафик на loopback-интерфейсе
iptables -A INPUT -i lo -j ACCEPT

# Включаем NAT
iptables -t nat -A POSTROUTING -o enp2s0 -s 192.168.0.0/24 -j MASQUERADE

# Разрешаем ssh
iptables -A INPUT -i enp2s0 -p tcp --dport 22 -j ACCEPT

# Разрешаем пинги
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Блокируем нулевые пакеты
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Открываем полный доступ VIP`ам
iptables -A FORWARD -i 192.168.0.6 -o enp2s0 -j ACCEPT

# Открываем доступ для всех к разрешённым сайтам
iptables -A FORWARD -m string --string «google» -j ACCEPT

# Блочим всё остальное

iptables -P INPUT -j DROP iptables -P OUTPUT -j DROP iptables -P FORWARD -j DROP

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

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

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

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

значит я не понял указаний на ошибки :-(

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

а в работающем сейчас конфиге, всего три правила. И, поскольку на этом шлюзе сидят люди и работают, мне бы хотелось исправить конфиг под требования руководства без нарушений в работе сети. Поэтому я пришёл сюда с вопросами. Мне негде экспериментировать с правилами.

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

iptables -A FORWARD -m string --string «google» -j ACCEPT

здесь синтаксис не верный. Там еще --algo пример:

iptables -A OUTPUT -m string --string "vk" --algo kmp --to 65535 -j DROP

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

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

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

В общем пришёл я к вот такому конфигу: тут
Конфиг работает. То есть блочит всё, кроме списка разрешённых сайтов. Каждому сайту пишется отдельное правило. Ссылки с разрешённых сайтов, так же разрешаются. То есть, к примеру, найдя инфу в гугле, можно перейти по ссылке на сторонний сайт. Но теперь надо добавить правило, которое будет пропускать определённые локальные компы (определяются по IP) мимо ограничений. То есть нескольким компам должен быть разрешён полный доступ. Кто-нибудь может подсказать правило?

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

В общем пришёл я к вот такому конфигу

А где dns,http,https в состоянии NEW на шлюзе в output? Не нужно? SSH сервер жопой к верху висит на 22 порту, боты не долбят? Или сам сервер где нить за NAT-ом сидит. И как клиенты ходят в интернет с таким конфигом, как у них при этом днс резолвинг работает? Если в цепочке FORWARD в состоянии NEW разрешен только адрес назначения -d google.ru.

нескольким компам должен быть разрешён полный доступ

-A FORWARD -s IP_HOST/32 -j ACCEPT

#отдельному хосту с адресом IP_HOST/32

-A FORWARD -s IP_Вся_сеть -j ACCEPT
#всей сети доступ

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

Про OUTPUT вам уже несколько раз намекнули. Вообще говоря в большинстве случаев его не надо в полиси DROP, если нет каких-то на то причин. OUTPUT это цепочка локальных процессов.

iptables -A FORWARD -p tcp -d google.ru -j ACCEPT
Ну так тоже можно и по идее работать будет быстрее чем с strings, но для профилактики прийдется хотя бы раз в сутки перезагружать правила, т.к. ip у разрешенных сайтов могут и поменяться. И если разрешенных сайтов овер много, то загрузка скрипта может занять приличное время.

По остальному вам уже ving2 ответил.

ЗЫ 1. Вообще вы тыкаетесь как «слепой котенок», вместо того что бы осилить iptables tutorial. Оно не только для данного случая пригодиться. 2. Вам уже писали, для вашей задачи используйте сквид. Вы же пытаетесь использовать то чего не знаете (iptables) который меньше подходит для задачи. Так какая разница что изучить сквид или iptables? имхо сквид будет проще.

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

Я работаю в стране, где интернет заходит по одному-единственному оптическому кабелю. Есессно, на входе стоит целый эшелон государственных шлюзов, кои снифят трафик, блочат нежелательные Государству сайты и т.д. Вирусы к нам не попадают никогда. Хакеры и прочие представители кибер-панк-сообщества, переловлены и перевоспитаны ещё в 90е. Кто избежал этой «процедуры» - уехал. Так что у нас вполне спокойно можно открыть на сервере 22й порт и не думать о ботах и иже с ними.
dns,http,https в состоянии NEW в цепочке OUTPUT... Зачем? Конфиг работает. Осталось только «обкатать» правила для отдельных компов, у которых есть полный доступ. Кстати, почему в примере правила, который вы привели, IP-адрес записан с /32, а не /24?

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

dns,http,https в состоянии NEW в цепочке OUTPUT... Зачем?

К примеру для того чтобы можно было, обновить, установить пакеты на самом шлюзе. Для этого ему нужно, послать исх. запрос по 80, (если apt-https то 443) порту на сервера дебиана или чего у вас там. Про 53 порт сами додумаете.

IP-адрес записан с /32, а не /24?

Потому что маска /32 - это один хост.

Address:   178.248.233.6        10110010.11111000.11101001.00000110 
Netmask:   255.255.255.255 = 32 11111111.11111111.11111111.11111111 
Wildcard:  0.0.0.0              00000000.00000000.00000000.00000000 
=>
Hostroute: 178.248.233.6        10110010.11111000.11101001.00000110 
Hosts/Net: 1                     Class B
Можно маску не писать, iptables сам ее нарисует.

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

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

Про OUTPUT вам уже несколько раз намекнули. Вообще говоря в большинстве случаев его не надо в полиси DROP, если нет каких-то на то причин. OUTPUT это цепочка локальных процессов.

Возможно я не понял намёков. И это не сарказм. Я ни в коем случае не претендую на повышенную сообразительность или что-либо подобное.
Вы полагаете, что в моём случае, для блокировки всех не разрешённых явно, исходящих соединений, будет достаточно «скинуть» в DROP только FORWARD?

Ну так тоже можно и по идее работать будет быстрее чем с strings, но для профилактики прийдется хотя бы раз в сутки перезагружать правила, т.к. ip у разрешенных сайтов могут и поменяться. И если разрешенных сайтов овер много, то загрузка скрипта может занять приличное время.

В моём конфиге, google в разрешённых сайтах указан для примера. Вообще же, в нашей конторе, в списке разрешённых будут исключительно «внутренние», Государственные сайты, а также почта, Телеграм и специальные сайты нескольких бирж. Адреса этих ресурсов не меняются уже много лет. Но я благодарен вам за предупреждение. Учту.

ЗЫ 1. Вообще вы тыкаетесь как «слепой котенок», вместо того что бы осилить iptables tutorial. Оно не только для данного случая пригодиться. 2. Вам уже писали, для вашей задачи используйте сквид. Вы же пытаетесь использовать то чего не знаете (iptables) который меньше подходит для задачи. Так какая разница что изучить сквид или iptables? имхо сквид будет проще.

Вы правы, iptables я начал «трогать» сравнительно недавно. Тем не менее, уже успел оценить сколь велик потенциал этого «инструмента».
Касательно изучения сквида - тоже согласен с вами. И я изучаю сквид. У меня даже есть уже один шлюз, на котором успешно работает связка Debian - NAT - ClamAV - SQUID (http+https) - Dansguardian - Webmin. Но это первый и, пока, единственный мой успех на поприще изучения SQUID`a и иже с ним.
Конкретно в случае, ради которого открыт этот топик, я поставил сквида. По той же самой инструкции, что и в связке. Но сразу после запуска, ещё до первичной настройки, сквид сходу блочит всю связь. Только ssh остаётся.
Я провозился с ним 10 дней. Читал мануалы, общался со знающими людьми... Даже написал автору мануала и дал ему параметры доступа по shh, чтобы он мог сам заглянуть и проверить что не так. Однако автор так и не нашёл времени. Мануалы давали противоречивые рекомендации, ни одна из которых не решила проблему. А общение со знающими свелось, в итоге, к тому же самому - учите, товарищ, матчасть.

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

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

К порту можно подключиться из интернета, однако никакого увеличения запросов на этот порт - нет.

Про 53 порт сами додумаете.

А можете задать хотя бы направление домыслов?

К примеру для того чтобы можно было, обновить, установить пакеты на самом шлюзе. Для этого ему нужно, послать исх. запрос по 80, (если apt-https то 443) порту на сервера дебиана или чего у вас там.

У меня Debian на шлюзе. То есть для открытия доступа в инэт самому шлюзу, нужно правило навроде:
iptables -A OUTPUT -o $WAN_CARD -j ACCEPT
Так?

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

Вы полагаете, что в моём случае, для блокировки всех не разрешённых явно, исходящих соединений, будет достаточно «скинуть» в DROP только FORWARD?

Только OUTPUT в ACCEPT

В моём конфиге, google в разрешённых сайтах указан для примера. Вообще же, в нашей конторе, в списке разрешённых будут исключительно «внутренние», Государственные сайты, а также почта, Телеграм и специальные сайты нескольких бирж. Адреса этих ресурсов не меняются уже много лет. Но я благодарен вам за предупреждение. Учту.

Вы не поняли, меняются ip адреса получаемые с днс. Например сайт site.ru сегодня резолвиться в адреса 1.1.1.1, 1.2.2.2, 3.3.3.3 но завтра это может быть по другому. Когда вы пишите правило в iptables с указанием hostname, то по факту резовяться все адреса и добавляется кол-во правил по соответствующим ip.

Но сразу после запуска, ещё до первичной настройки, сквид сходу блочит всю связь.

Вот это врядли.

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

Любопытно, наверное да. Но к сожалению мое любопытство на текущий момент ограниченно временем, если вспомните через месяц посмотрим вместе. Сейчас никак.

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