LinuxForum.Fans
Тема

прошу помощи со скриптом iptables для шлюза

Автор: Me_Shock 182 сообщений 27898 просмотров
#313079

И еще, с последними версиями iptables я, вместо -m state --state, использую -m conntrack --ctstate. Иначе вылазили какие-то недовольные сообщения.

#313080

"urfin⇓" написал:
по-моему, FORWARD это внутренность насоса
а по-моему, это обводной контур, чтобы миновать насос, хотя тут больше смеситель подойдет..
#313081
urfin написал:
И еще, с последними версиями iptables я, вместо -m state --state, использую -m conntrack --ctstate. Иначе вылазили какие-то недовольные сообщения.

Да всё меняетса. Мир не стои на месте.

#313082

"urfin⇓" написал:
И еще, с последними версиями iptables я, вместо -m state --state, использую -m conntrack --ctstate. Иначе вылазили какие-то недовольные сообщения.
не видел таких.
text
root@gw5:~# iptables --version
iptables v1.4.8
#313083

Тем не менее у меня они были, и в openSUSE

text
# iptables --version
iptables v1.4.16.3

и в Sabayon'е. У Вас, в Debian'е, возможно, это все впереди :)

#313088

Всем спасибо, думаю тему можно закрывать!)))

#313168

FORWARD от INPUT не зависит

#313291

"Kettler⇓" написал:
FORWARD от INPUT не зависит
в моем понимании - форвард это транзитные пакеты, но ведь когда пакет возвращается он же не может миновать цепочку INPUT, иначе он никогда не попадет в хост..?
#313299

В цепочку INPUT попадают пакты _адресованные_ хосту, а в FORWARD -- _адресованные_ кому-либо другому, они цепочку INPUT не проходят.

#313304

bormant, ок, просто я не понимаю как в таком случае это все работает, например пинг. Вот мой хост называется GW5, у него есть 2 сети (внутр. и внешняя) Если я выполню команду ping ya.ru подключенным клиентом к внутренней сети, то как эхо-реплай ко мне вернется, ведь он будет предназначен для моего хоста GW5?

#313308
Enzo_brn написал:
bormant, ок, просто я не понимаю как в таком случае это все работает, например пинг. Вот мой хост называется GW5, у него есть 2 сети (внутр. и внешняя) Если я выполню команду ping ya.ru подключенным клиентом к внутренней сети, то как эхо-реплай ко мне вернется, ведь он будет предназначен для моего хоста GW5?

Вкратце так. Ну если я сам верно понимаю.
Например есть ваш шлюз gw5. В нём всё настроено и он раздаёт тырнет в локалку с помощью NAT. Представим какомуто хосту из локалки нужно пингануть хост в интернете ukr.net. Что он делает? Он сначала выесняет что такого компа в пределах локалки нету. *DONT_KNOW* . Что же дальше делать, всё засада, такого компа нету. *SCRATCH* . Но тут, ЭВРИКА *YAHOO* , он додумываетса просмотреть свою таблицу маршрутизацыи и виесняет что у гланым шлюзом в сети есть GW5, значит нужно его спросить что это за комп и какой его айпи. Тоисть происходит DNS запрос и название преобразуетса в айпи. Ура комп выяснил какой айпи в нужного компа *DANCE* . Потом он пробует приконектитса к нужному компу по айпишке что он только что получил. И опять он спрашывает шлюза по умолчанию, что тыры-пыры мне мол нужен вот такой комп с таким айпи. Шлюз принимая соединение от вашего компа, смотрит в заголовок пакета и выясняет айпы адрес хоста назначения. Пошарив по своим таблицам аршрутизацыи шлюз находит путь к этому хосту. А теперь давайте уважаеые читатели разберёмся как этот первый пакет соединения проходит шлюз gw5 чтобы уйти к хосту назначения ukr.net. По ману iptables это есть транзитный пакет и он движетса так:
mangle PREROUTING > nat PREROUTING > mangle FORWARD > Filter FORWARD > mangle POSTROUTING > nat POSTROUTING. Тоисть в цепочку INPUT&OUTPUT таблицы Filter он не попадает. Ну так как у нас NAT то в nat POSTROUTING в заголовке пакета айпи адрес компа который прислал этой пакет из локалки подменяетса на реальную (белую) айпишку шлюза и уже этот пакет уходит в интернет к адресату ukr.net. Потом когда приходит ответ на шлюз, он смотрит что этот пакет не для него а для компа с локалки и пакет движетса тем самым путём тока в обратную сторону. Перед этим nat POSTROUTING пакету возращаетса айпишка того компа что инициализировал соединение.
Так вот проходят транзитные пакеты через шлюз.
Тут подробнее написано.
Не знаю прав ли я на 100 процентов, но как то всё так.

#313341

"kisil⇓" написал:
но как то всё так
А теперь дропните все INPUT и OUTPUT. И что получится? :)
"kisil⇓" написал:
А теперь давайте уважаеые читатели разберёмся как этот первый пакет соединения проходит шлюз gw5 чтобы уйти к хосту назначения ukr.net. По ману iptables это есть транзитный пакет и он движетса так:
mangle PREROUTING > nat PREROUTING > mangle FORWARD > Filter FORWARD > mangle POSTROUTING > nat POSTROUTING. Тоисть в цепочку INPUT&OUTPUT таблицы Filter он не попадает. Ну так как у нас NAT то в nat POSTROUTING в заголовке пакета айпи адрес компа который прислал этой пакет из локалки подменяетса на реальную (белую) айпишку шлюза и уже этот пакет уходит в интернет к адресату ukr.net.
Все правильно. Но только, когда адрес локалки подменяется на белый адрес(вернее будет сказать, что не просто подменяется, а к заголовку добавляется белый адрес, в качестве основного, для глобальной сети, а локальный остается в заголовке, как дополнительный для обратной маршрутизации), он уже вываливается по правилам OUTPUT для белого адреса к ukr.net, когда ukr.net отвечает, то пакет приходит по нашему белому адресу и попадает сначала на правила INPUT, а уже после перенаправляется в nat и FORWARD, для обратного преобразования адреса в локальный и проброса, а затем уже после преобразования снова должен попасть в OUTPUT, но уже для локального адреса. По-моему, так.
#313347

Может и так.
Это то что я понял из мана. Могу и неправильно понять.

#313370
"urfin⇓" написал:

вываливается по правилам OUTPUT
попадает сначала на правила INPUT

Отлично. Отлично от задокументированного поведения iptables.
Обратите внимание на http://www.opennet.ru/docs/RUS/iptables/#TRAVERSINGOFTABLES , ссылку вам выше уже давали.

На машину пакет приходит не сразу в INPUT, и уходит не напрямую через OUTPUT.

На машину из локальной сети пакет приходит адресованным другой машине => FORWARD, в INPUT не попадает, в OUTPUT не попадает (не этой машиной порождён), в POSTROUTING mangle/nat адрес источника меняется на адрес машины.

Решение о том, адресован ли входящий пакет машине принимается после прохождения PREPROUTING mangle/nat, на момент принятия решения после правила DNAT пакет адресован уже другой машине в локальной сети => FORWARD, и в INPUT не попадает.

"urfin⇓" написал:
А теперь дропните все INPUT и OUTPUT. И что получится?
Локальная машина не сможет инициировать исходящие соединения и принимать входящие (например, на ней не сможет работать прокси). Транзитный трафик при наличии DNAT/SNAT/маскарадинга и разрешённом ip_forward будет ходить.
#313371

bormant написал:
Транзитный трафик при наличии DNAT/SNAT/маскарадинга будет ходить.
Не ходит. Почему?
#313372

"urfin⇓" написал:
Не ходит. Почему?
Потому что не транзитный?
#313374

bormant написал:
[quote="urfin⇓"]Не ходит. Почему?
Потому что не транзитный?[/quote]"PC"<-"lnet"->"Gate"<->"inet". На "Gate" включен nat, а INPUT & OUTPUT в DROP. С "PC" в "inet" ничего не идет.
При OUTPUT & INPUT в ACCESS все ходит.
#313377

urfin,
можно увидеть на Gate:
cat /proc/sys/net/ipv4/ip_forward
iptables-save
route

NAT включен как-то так:
$IPT -t nat -A POSTROUTING -o $WAN_IF \
-j SNAT --to-source $WAN_IP
echo "1" > /proc/sys/net/ipv4/ip_forward
?

#313380

Пожалуйста смотрите, вот так все ходит (некоторые DROP правила я убрал, как несущественные для обсуждения)

text
# cat /proc/sys/net/ipv4/ip_forward
1
#
iptables-save
# Generated by iptables-save v1.4.16.3 on Thu Apr 4 16:34:15 2013
*filter
:INPUT ACCEPT [32:3971]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [14:560]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.200.0/24 -o dsl0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Apr 4 16:34:15 2013
# Generated by iptables-save v1.4.16.3 on Thu Apr 4 16:34:15 2013
*nat
:PREROUTING ACCEPT [22:3497]
:INPUT ACCEPT [22:3497]
:OUTPUT ACCEPT [6593:442541]
:POSTROUTING ACCEPT [6593:442541]
-A POSTROUTING -s 192.168.200.0/24 -o dsl0 -j MASQUERADE
COMMIT
# Completed on Thu Apr 4 16:34:15 2013
route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default * 0.0.0.0 U 0 0 0 dsl0
10.85.255.126 * 255.255.255.255 UH 0 0 0 dsl0
loopback * 255.0.0.0 U 0 0 0 lo
192.168.200.0 * 255.255.255.0 U 0 0 0 lan0

Только мне помощь не нужна по правилам, УМВР, меня уже просто заинтересовало некоторое расхождение теории с практикой.

#313386

"urfin⇓" написал:
Только мне помощь не нужна
а мне бы не помешала..)
Давайте проследим логику простой настройки файрвола на шлюзе для администратора с параноидальными синдромами:
1. Почистить таблицы.
2. Закрыть все цепочки.
3. Разрешить лупбэк трафик.
4. Разрешить на всех цепочка соединения, УЖЕ инициированные изнутри. (чтобы ИЦМП вернулся).
5. Разрешить во всех цепочках инициировать НОВЫЕ соединения по протоколу ИЦМП.
6. разрешить транзит ИЦМП-пакетов между внутр. и внешней сетью.

Показать
text
#!/bin/bash
#
# ------------------ FLASHING RULES IN ALL DEFAULT TABLES ---------------------
# 1.
$IPT -t mangle -F && $IPT -t filter -F && $IPT -t nat -F && $IPT -F && $IPT -X
# -----------------------------------------------------------------------------
#
# 2.
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# 3. $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT

# 4. $IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT $IPT -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# 5. $IPT -A INPUT -p icmp -m state --state NEW -j ACCEPT $IPT -A OUTPUT -p icmp -m state --state NEW -j ACCEPT $IPT -A FORWARD -p icmp -m state --state NEW -j ACCEPT

# 6. # Masquerade. $IPT -t nat -A POSTROUTING -o $EXT_IF -j MASQUERADE

# Enable routing. echo 1 > /proc/sys/net/ipv4/ip_forward

УМНР, пинги не ходят.. Все ли я правильно понимаю..?

Войдите или зарегистрируйтесь, чтобы ответить.