LINUX.ORG.RU
ФорумAdmin

iptables разрешить только определенный forwarding

 , ,


0

1

Есть роутер на Debian 11. Локальная сеть - enp0s8, интернет - enp0s3. Хочу сделать так, чтобы из интернета был доступен web-сервер, который лежит в локальной сети на машине 10.0.0.2, а из локальной сети - был доступен Интернет. Весь лишний forward хочу запретить. Делаю такие правила iptables:

*nat
-A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80
-A POSTROUTING -o enp0s3 -j MASQUERADE
COMMIT

*filter
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp0s3 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i enp0s3 -j DROP
-A FORWARD -i enp0s3 -p tcp --dport 80 -j ACCEPT
-A FORWARD -i enp0s3 -j DROP
COMMIT

В таком конфиге Web-сервер из Интернета доступен, но Интернет из локальной сети - нет. Если убрать правило -A FORWARD -i enp0s3 -j DROP, то все работает, но это значит, что будет работать любой forward. Как бы мне сказать что forward соединений из локальной сети в Интернет можно делать, а обратно - только то, что разрешено явно? Или я загоняюсь и так делать не нужно?

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

какая-то слишком далекая наводка, пока что не понял :( Как я себе вижу: пакет от машины в локальной сети попадает в таблицу nat и к нему применяется правило POSTROUTING, после чего пакет попадает в цепочку FORWARD в таблице filter и должен заакцептиться, но что-то идет не так

p.s. поменял последнее правило на два:

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i enp0s3 -j DROP

вроде заработало, но я все еще не понимаю почему

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

Думаю, что понял: правила задаются отдельно для пакетов, которые приходят от внутренней сети и от пакетов, которые приходят в ответ из Интернет. То есть получается, что правило -A FORWARD -i enp0s3 -j DROP дропало все ответы, которые приходили в ответ на запросы из локальной сети, а правило -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT заставляло netfilter вести учет того, что за пакеты приходят из Интернет и если это попытки ответить на соединение инициализированное из локальной сети - то не дропать такие пакеты.

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

-i enp0s3 -j DROP

ОПАСНОСТЬ!

Имя интерфейса может поменяться. И тогда может произойти GLOBAL -j ACCEPT, который приведёт к
FORWARD –state NEW -i $WAN -o $LAN -j ACCEPT
и даже -i $WAN -o $WAN ACCEPT, не говоря о банальном INPUT -j ACCEPT.
хотя при правила не стартанут и будет дефолт с одним ACCEPT

–state RELATED,ESTABLISHED

Подобные правила ближе к началу лучше для производительности имхо.

чтобы из локальной сети выходить нужно дополнительно к ESTABLISHED

-A FORWARD -i enp0s8 -o enp0s3 --state NEW ACCEPT
naKovoNapalBaran
()
Последнее исправление: naKovoNapalBaran (всего исправлений: 3)
Ответ на: комментарий от FireFighter

Правильно ли я понимаю, что для повышения безопасности и улучшения производительности нужно максимально конкретизировать правила до такого состояния:

*nat
-A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80 # форвордим HTTP-трафик на веб-сервер
-A POSTROUTING -i enp0s8 -o enp0s3 -j MASQUERADE # меняем source ip для всего трафика, который форвордится из локальной сети в интернет
COMMIT

*filter
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # разрешаем все установленные соединения, т.к. они уже были отфильтрованы ранее
-A INPUT -i lo -j ACCEPT # разрешаем соединения на локалхосте
-A INPUT -i enp0s3 -p tcp -m tcp --dport 22 -j ACCEPT # разрешаем ssh из внешней сети
-A INPUT -i enp0s8 -j ACCEPT # разрешаем все соединения из внутренней сети
-A INPUT -j DROP # запрещаем все остальное

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT # разрешаем форворд уже установленных соединений, т.к. они уже были отфильтрованы ранее
-A FORWARD -i enp0s8 -o enp0s3 --state NEW ACCEPT # разрешаем форворд трафика из внутренней сети наружу
-A FORWARD -i enp0s3 -o enp0s8 -p tcp --dport 80 -j ACCEPT # разрешаем форворд соединения к web-серверу
-A FORWARD -j DROP # запрещаем все остальное
COMMIT
Goganchic ★★
() автор топика
Ответ на: комментарий от Anoxemian

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

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

но зато это увеличит производительность

Если у вас роутер не на тостере крутиться, то без разницы.

потому что не надо будет на каждый пакет получать адрес интерфейса. Верно?

Неверно. Не на каждый пакет, а на соединение.

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

максимально конкретизировать

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

#!/bin/sh
# вроде так
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
naKovoNapalBaran
()
Последнее исправление: naKovoNapalBaran (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.