LINUX.ORG.RU
ФорумAdmin

Простой вопрос по iptables

 


0

1

У меня есть такие правила:

*raw
:PREROUTING ACCEPT
:OUTPUT ACCEPT
COMMIT
*filter
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

-A INPUT -i enp0s31f6 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -o enp0s31f6 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p tcp -m tcp --dport 33335 -m state --state NEW -j ACCEPT
-A INPUT -s 192.168.100.0/24 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -j ACCEPT
-A INPUT -s 172.20.1.0/12 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 33335 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 26656 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 26657 -j ACCEPT
-A FORWARD -s 192.168.100.3 -j ACCEPT
-A FORWARD -s 192.168.1.38 -j ACCEPT
-A FORWARD -s 172.20.1.0/12 -j ACCEPT
#ip с интернета
-A INPUT -s 173.249.42.34 -j ACCEPT
-A INPUT -s 194.163.131.86 -j ACCEPT
-A INPUT -s 144.76.219.187 -j ACCEPT

-A FORWARD -p tcp -m tcp --dport 33331 -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 33333 -j ACCEPT
-A FORWARD -s 192.168.100.0/24 -j ACCEPT
-A FORWARD -s 172.20.1.0/24 -o vmbr4000 -j ACCEPT
-A FORWARD -s 192.168.1.0/24 -j ACCEPT

#закрыть
-A INPUT -p tcp -m tcp --dport 33333 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 33331 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8006 -m state --state NEW -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
#-A FORWARD -s 192.168.1.39 -j ACCEPT

#на DROP
:INPUT DROP
:FORWARD DROP

#ACCEPT
:OUTPUT ACCEPT
COMMIT

*nat

-A PREROUTING -i enp0s31f6 -p tcp --dport 33331 -j DNAT --to 192.168.1.38:22
-A PREROUTING -i enp0s31f6 -p tcp --dport 26656 -j DNAT --to 192.168.1.38:26656
-A PREROUTING -i enp0s31f6 -p tcp --dport 26657 -j DNAT --to 192.168.1.38:26657

-A PREROUTING -i enp0s31f6 -p tcp --dport 33333 -j DNAT --to 192.168.1.39:22

-A PREROUTING -i vmbr4000 -s 192.168.100.3 -m tcp -p tcp --dport 33335 -j DNAT --to 192.168.100.2:33335
-A PREROUTING -i vmbr4000 -s 192.168.100.3 -j DNAT --to 192.168.1.38
-A POSTROUTING -s 172.20.1.0/24 -o vmbr4000 -j MASQUERADE
-A POSTROUTING -s 192.168.1.38/24 -o enp0s31f6 -j MASQUERADE
COMMIT

По таблице iptables видно, что очередь фильтрации такой mangle, nat, filter

То получается пакеты указанные в нат 26656, 26657 они не будут тронуты правилами в filter*? Т.е. все адреса будут проходить через указанные порты? Если я хочу заблокировать все кроме указанных ip т.е. 173.249.42.34,194.163.131.86,144.76.219.187 для портов (33331, 33333, 26656, 26657), то мне нужно их заблокировать на хосте 192.168.1.38? Или можно заблокировать в mangle?

Короче говоря, мне нужно 33331,33333,33335 разрешить для всех ip, а порты 26656, 26657 которые будут перенаправлены в хост 192.168.1.38 разрешить только для 173.249.42.34,194.163.131.86,144.76.219.187

И что за raw, это mangle? Она появилась при сохранении правил (iptables-save)

Картинка https://www.frozentux.net/iptables-tutorial/images/tables_traverse.jpg
А вообще читаем https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
Отвечая на ваши вопросы про фильтрацию. Фильтрация осуществляется в таблице filter она же используется по умолчанию если не указывать ключик -t. Правила в цепочках просматриваются последовательно, при совпадении условий и применении ACCEPT, DROP или REJECT просмотр цепочки останавливается.

anc ★★★★★
()

Правильная картинка https://inai.de/images/nf-packet-flow.svg

Порты 33331, 26656, 26657 будут в raw/prerouting, mangle/prerouting, nat/prerouting, а в filter уже будут 22, 26656, 26657.

Или можно заблокировать в mangle?

нет. Фильтрация в filter либо в raw.

Если DNAT нужно делать только для для одного внешнего хоста, так укажи его через "-s"

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

Спасибо! Если порты 26656, 26657 есть в PREROUTING: -A PREROUTING -i enp0s31f6 -p tcp –dport 26656 -j DNAT –to 192.168.1.38:26656 -A PREROUTING -i enp0s31f6 -p tcp –dport 26657 -j DNAT –to 192.168.1.38:26657 Они все равно будут в filter? Если в filter стоит: -A INPUT -s 173.249.42.34 -j ACCEPT -A INPUT -s 194.163.131.86 -j ACCEPT -A INPUT -s 144.76.219.187 -j ACCEPT :INPUT DROP то прероутинг будет только с вышеуказанных трех ip?

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

В фильтр попадает все, что не дропнуто ранее.

В filter/INPUT попадает только то, что адресовано самому хосту.

То, что перенаправлено через DNAT попадает в filter/FORWARD

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

То, что перенаправлено через DNAT попадает в filter/FORWARD

Вроде DNAT на локальный адрес не должен попадать в FORWARD. Или я ошибаюсь?

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

Не ошибаешься.

Если после dnat адрес назначения локальный - то в input, а иначе в forward.

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

ИМХО, вы дали ссылку на неправильную картинку. На википедии уже исправили: https://en.wikipedia.org/wiki/Iptables#/media/File:Netfilter-packet-flow.svg в соответствии с тем, что написано по ссылке anc https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#TRAVERSING... . То есть ″reroute check″ должен быть после ″nat OUTPUT″ (иначе как бы работал DNAT исходящих локальных пакетов).

И где-то ещё должен быть блок изменения ip-адресов ответных NAT-пакетов (stateful NAT)...

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

Да, у меня на старой картинке нет nat/input.

В wiki (2021) «reroute check» нарисован некорректно, т.к. он не выполняется после forward, только для local_output.

Открой код linux/net/ipv4/netfilter/iptable_mangle.c

Посмотри код iptable_mangle_hook()

ipt_mangle_out() в котором есть «reroute check» выполняется только для NF_INET_LOCAL_OUT и сразу после mangle/output.

Из-за этого nat/output не может изменить output интерфейс. Это большое неудобство. Об этом на лоре куча тредов.

«reroute check» не выполняется в postrouting.

https://upload.wikimedia.org/wikipedia/commons/archive/3/37/20190514145455!Ne... и https://upload.wikimedia.org/wikipedia/commons/archive/3/37/20190928173658!Ne... - правильные, но без nat/input

Все остальные версии с ошибкой.

Ответные пакеты вообще в не попадают в NAT-правила (но обрабатываются в nat-conntrack).

Смотри linux/net/netfilter/nf_nat_core.c nf_nat_inet_fn() (особенно интересно goto oif_changed)

Пропусти пакет через TRACE туда и обратно - убедишься в этом.

NAT-правила срабатывают только для NEW.

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

Исходники я буду смотреть, но позже. Если nat/output не может изменить output интерфейс, то почему работает так:

На машине с адресом 192.168.33.222 делаем:

iptables -t nat -I OUTPUT -p icmp -d 192.168.33.222 -j DNAT --to-destination 192.168.33.227

потом на ней запускаем: ping 192.168.33.227

и ping получает ответы, а tcpdump на 192.168.33.227 видит icmp-запросы от 192.168.33.222

Касательно моего запуска TRACE, это ничего не поменяет. Сколько бы раз я TRACE не запустил, на википедии не появится замечание, что после прохождения блока «conntrack» у пакета может измениться ip-адрес. Я писал про правильность схемы.

NAT-правила срабатывают только для NEW.

Об этом везде написано. А то, что NAT stateful, и что пакеты, идущие в обратную сторону, тоже модифицируются мало где упоминается. И почему-то не рисуют после nat/POSTROUTING блока, который изменяет src-адрес пакета, я посмотрел несколько подобных диаграмм.

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

На машине с адресом 192.168.33.222 делаем:

iptables -t nat -I OUTPUT -p icmp -d 192.168.33.222 -j DNAT --to-destination 192.168.33.227

потом на ней запускаем: ping 192.168.33.227

и ping получает ответы, а tcpdump на 192.168.33.227 видит icmp-запросы от 192.168.33.222

Ты запустил пинг с 192.168.33.222 на 192.168.33.227. Твое правило не срабатывает :)

пинг с 192.168.33.222 на 192.168.33.222 попадает в правило и оно работает. По TRACE reroute происходит после output/filter и до mangle/postrouting.

linux/net/netfilter/nf_nat_core.c nf_nat_inet_fn() - первый NAT может менять все.

Однако reroute есть и после output/mangle!

Я вспомнил, что за проблема у нас была! Смена исходящего интерфейса при наличии policy routing.

Наличие reroute после mangle/output позволяет решить эту проблему (через MARK/CONNMARK).

И почему-то не рисуют после nat/POSTROUTING блока, который изменяет src-адрес пакета, я посмотрел несколько подобных диаграмм.

Дык там reroute нет. Только адрес поменяли.

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

Правильная картинка

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

В одной картинке нагляднее.

Update: да ёклмн! нет в жизни щастья(я про неточности на картинке) :-(

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

Я опечатался, пинг я запускал на 192.168.33.222. На момент написания пост я уже 23 часа не спал, поэтому и исходники смотреть не стал :(

По TRACE reroute происходит после output/filter и до mangle/postrouting.

Однако reroute есть и после output/mangle!

Получается, что картинка становится правильнее после наложение двух? Или после OUTPUT/filter есть reroute, а после FORWARD/filter нет reroute и в википедии и в этом месте ошибка?

Что такого можно сделать в FORWARD/filter, чтобы TRACE показал наличие reroute, чтобы не изучать исходники? Хотя больше похоже на ошибку диаграммы.

И, раз уж сюда зашёл гуру, спрошу ещё. Я не совсем понимаю смысл изображения iptables/FORWARD/mangle два раза — на Network layer и на Link layer. Разве в код в ядре по разному отрабатывает правла для маршрутизиции и бриджа? Вроде, ветвление должно быть после iptables/POSTROUTING/nat?

Дык там reroute нет. Только адрес поменяли.

Я не про reroute, я про внешний вид диаграммы, чтобы в ней было меньше магии. А то написали на картинке, что через nat-таблицу идёт первый пакет и у людей возинкает непонимание того, что происходит с отальными пакетами.

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

Получается, что картинка становится правильнее после наложение двух? Или после OUTPUT/filter есть reroute, а после FORWARD/filter нет reroute и в википедии и в этом месте ошибка?

Именно. Определение output интерфейса должно быть выполнено до forward и не может быть изменено в дальнейшем.

Интересно то, что адреса меняются после nat/output, а rerouting со сменой интерфейса происходит после filter/output.

Я бы еще отметил звездочкой блок L3/nat/(prerouting|postrouting), т.к. для неё есть пояснение про NEW.

Я не совсем понимаю смысл изображения iptables/FORWARD/mangle два раза — на Network layer и на Link layer. Разве в код в ядре по разному отрабатывает правла для маршрутизиции и бриджа?

IMHO На схеме показаны все возможные пути.

Путь из L3 в L2 на этапе forward - это ситуация, когда пакет обрабатывающийся на L3 нужно форвардить через бридж. И судя по схеме, такой пакет не попадет в L2/filter/forward.

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

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

*raw
:PREROUTING ACCEPT [5470:797203]
:OUTPUT ACCEPT [6156:931073]
COMMIT
# Generated by iptables-save v1.8.2 on Sun Dec 26 10:02:50 2021
*filter
-A INPUT -i enp0s31f6 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -o enp0s31f6 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#нельзя на хост
-A INPUT  -s 207.180.251.153  -p tcp -m tcp --dport 33335 -j ACCEPT
-A INPUT  -s 192.168.1.46  -p tcp -m tcp -m state --state NEW -j ACCEPT
-A INPUT  -s 192.168.100.2  -p tcp -m tcp -m state --state NEW -j ACCEPT
#нельзя на локалку
-A INPUT  -s 207.180.251.153 -p tcp -m tcp --dport 33337 -m state --state NEW -j ACCEPT
-A INPUT  -s 207.180.251.153 -p tcp -m tcp --dport 33339  -m state --state NEW -j ACCEPT
-A FORWARD -s 207.180.251.153 -p tcp -m tcp -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.100.2  -p tcp -m tcp -m state --state NEW -j ACCEPT
#пиры до меня
-A FORWARD -s 138.201.55.228 -p tcp -m tcp --dport 26656 -m state --state NEW -j ACCEPT

#закрыть
#-A INPUT -p tcp -m tcp --dport 33335 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 33337 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 33339 -j ACCEPT
#-A FORWARD -p tcp -m tcp --dport 22 -j ACCEPT
#-A INPUT -p tcp -m tcp --dport 8006 -m state --state NEW -j ACCEPT

#DROP
:INPUT DROP
:FORWARD DROP

#ACCEPT
:OUTPUT ACCEPT [6159:931193]
COMMIT
# Generated by iptables-save v1.8.2 on Sun Dec 26 10:02:50 2021
*nat

#нельзя
-A PREROUTING -i enp0s31f6 -p tcp --dport 33337 -j DNAT --to 192.168.1.46:22
-A PREROUTING -i enp0s31f6 -p tcp --dport 33339 -j DNAT --to 192.168.1.47:22
-A PREROUTING -i enp0s31f6 -p tcp -m tcp --dport 26656 -j DNAT --to-destination 192.168.1.46:26656
-A PREROUTING -s 192.168.100.2/32 -i vmbr4000 -p tcp -m tcp --dport 33335 -j DNAT --to-destination 192.168.100.3:33335
#инет Валика
#нельзя
-A PREROUTING -i vmbr4000 -s 192.168.100.2 -j DNAT --to 192.168.1.46
-A POSTROUTING -s 192.168.1.46/24 -o enp0s31f6 -j SNAT --to-source 46.4.96.45
-A POSTROUTING -s 172.20.1.0/12 -o vmbr4000 -j SNAT --to-source 192.168.100.3

:PREROUTING ACCEPT
:INPUT ACCEPT [82:6390]
:OUTPUT ACCEPT [36:2170]
:POSTROUTING ACCEPT [37:2254]
COMMIT

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

Спасибо большое iptables привел к другому виду. Вроде все стало хорошо. Но есть недостаток: Почему-то, если связь простоит минуту, то разрывается. Приходится подключаться по новой. Не в -state ошибся?:

*raw
:PREROUTING ACCEPT
:OUTPUT ACCEPT
COMMIT
*filter
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

-A INPUT -i enp0s31f6 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -o enp0s31f6 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#нельзя
-A INPUT -p tcp -m tcp --dport 33335 -m state --state NEW -j ACCEPT
-A INPUT -s 192.168.100.0/24  -m state --state NEW -j ACCEPT
-A INPUT -s 192.168.1.0/24  -m state --state NEW -j ACCEPT
-A INPUT -s 172.20.1.0/12  -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.100.3  -m state --state NEW -j ACCEPT
-A FORWARD -s 172.20.1.0/12  -m state --state NEW -j ACCEPT
-A FORWARD -s 192.168.1.0/24  -m state --state NEW -j ACCEPT

#нельзя
-A FORWARD -s 207.180.251.163/32 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 111 -j DROP
-A INPUT -p udp -m udp --dport 111 -j DROP
#похоже не нужно
-A OUTPUT -p tcp -m tcp --dport 111 -j DROP
-A OUTPUT -p udp -m udp --dport 111 -j DROP
#пиры
-A FORWARD -s 46.4.96.45/32 -p tcp -m tcp --dport 26656 -m state --state NEW -j ACCEPT
#закрыть
-A INPUT -p tcp -m tcp --dport 8006  -m state --state NEW -j ACCEPT
-A FORWARD -p tcp -m tcp --dport 22  -m state --state NEW -j ACCEPT
-A INPUT -p icmp -j ACCEPT

#на DROP
:INPUT DROP
:FORWARD DROP

#ACCEPT
:OUTPUT ACCEPT
COMMIT


*nat

#нужен
-A PREROUTING  -s 207.180.251.163/32 -i enp0s31f6 -p tcp --dport 33331 -j DNAT --to 192.168.1.38:22
-A PREROUTING  -s 207.180.251.163/32 -i enp0s31f6 -p tcp --dport 33333 -j DNAT --to 192.168.1.39:22
#закрыть
-A PREROUTING  -i enp0s31f6 -p tcp --dport 33331 -j DNAT --to 192.168.1.38:22
-A PREROUTING  -i enp0s31f6 -p tcp --dport 33333 -j DNAT --to 192.168.1.39:22
#нельзя
-A PREROUTING -i vmbr4000 -s 192.168.100.3 -j DNAT --to 192.168.1.38
-A PREROUTING -p tcp -m tcp --dport 26656 -j DNAT --to-destination 192.168.1.38:26656
-A POSTROUTING -s 172.20.1.0/24 -o vmbr4000 -j SNAT --to-source 192.168.100.2
-A POSTROUTING -s 192.168.1.38/24 -o enp0s31f6 -j SNAT --to-source 138.201.55.226
COMMIT

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

если ты не крутил sysctl, а ssh отваливается, значит виноват провайдер.

Но на него есть управа - TCPKeepAlive, ServerAliveInterval, ServerAliveCountMax, ClientAliveInterval, ClientAliveCountMax в настройках ssh.

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

Сессия в терминале отключается. Нужно повторно соединиться командой ssh …

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