Iptables: могли бы посмотреть правила?

Работаю программистом (backend), но хочу развиваться еще и в сторону администрирования и пытаюсь более подробно разобраться с netfilter в Linux. Раньше настраивал только простые вещи вроде открыть порт на машине и все. А тут решил попробовать сделать тестовый стенд из двух виртуальных машин: шлюз и клиент. В общем, NAT делаю впервые (сижу два вечера, несколько раз переделывал, но все кажется что я что-то не так делаю, хоть и работает).

Могли бы вы опытным взглядом посмотреть на мои правила iptables и подсказать что лишнее или чего не хватает?

На шлюзе внешний интерфейс enp0s3 с IP 192.168.88.27
Локальная сетка 10.0.1.0/24
Интерфейс шлюза который смотрит в локалку: enp0s8 с IP 10.0.1.1
IP локальной машины которую нужно занатить и пробросить порты - 10.0.1.2

Хочу пробросить внешний порт 192.168.88.27:8080 на локальную машину 10.0.1.2:80

В таблице filter у всех цепочек политика DROP

enp0s3 - inet, enp0s8 - local

INPUT:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp0s8 -j ACCEPT


FORWARD:
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 10.0.1.2/32 -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
-A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT
-A FORWARD -i enp0s8 -o lo -j ACCEPT


OUTPUT:
-A OUTPUT -o enp0s3 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o enp0s8 -j ACCEPT


Таблица nat (у всех политика ACCEPT)

PREROUTING:
-A PREROUTING -d 192.168.88.27/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.0.1.2:80


OUTPUT:
-A OUTPUT -d 192.168.88.27/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.0.1.2:80


POSTROUTING:
-A POSTROUTING -o enp0s3 -j SNAT --to-source 192.168.88.27
-A POSTROUTING -s 10.0.1.0/24 -d 10.0.1.2/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 10.0.1.1
# Либо только:
# -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE


У меня есть несколько сомнений. Если нужно пробросить порт, и чтобы с компьютеров в локальной сети можно было обращаться по внешнему IP:PORT шлюза на хост из этой сети и все корректно работало, то получается я добавил аж 4 правила:

# filter
-A FORWARD -d 10.0.1.2/32 -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT

# nat
-A PREROUTING -d 192.168.88.27/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.0.1.2:80
-A OUTPUT -d 192.168.88.27/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.0.1.2:80
-A POSTROUTING -s 10.0.1.0/24 -d 10.0.1.2/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 10.0.1.1


Так ли нужно делать или что-то убрать/добавить/исправить? И кроме ната - может что-то убрать лишнее или добавить обязательно нужно?

Я читал эту хорошую вики, но чисто как там сделать у меня не получалось - то инета нет на локальной машине, то порт не пробрасывается

Заранее спасибо!
  • Вопрос задан
  • 811 просмотров
Решения вопроса 1
@dronmaxman
VoIP Administrator
Начните с малого, сотрите все правила из Firewall.

1) Разрешите формард пакетов в системе между интерфейсами.
cat /proc/sys/net/ipv4/ip_forward - тут должна быть единичка (1).

2) 10.0.1.1 должен быть как GW 10.0.1.2 иначе трафик надо маскарадить через SNAT.

3) Добавьте правилось проброса порта
-A PREROUTING -i enp0s3 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.0.1.2:80

4) Добавьте правило маскара, что бы маскарадить ответы от 10.0.1.2.
-A POSTROUTING -o enp0s3 -j MASQUERADE

Когда у Вас получится рабочий минимум, можете добавлять остальные правила.
П.С. Исходящий трафик (OUTPUT ) фильтруют параноики)

Хорошая картинка для понимания работы iptables
5ef44fa9868ce033198973.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Комментировать
SignFinder
@SignFinder
Wintel\Unix Engineer\DevOps
то получается я добавил аж 4 правила:

Транзитные пакеты - то есть проходящие сквозь сервер, не попадают в цепочки INPUT и OUTPUT, а только в FORWARD.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы