Помогите разобраться с цепочкой FORWARD в IPTABLES.
После прочтения множества документов, включая IPTABLES_HOW-TO, я разобрался с написанием правил для одиночной машины(1 NIC), подключенной к LAN or WAN. Но никак не смог понять пока, каким образом фильтровать трафик для роутера, имеющего две сетевые карточки. Как я вижу порядок движения пакетов:
Internet
|
eth0
Входящий пакет(поступает в цепочку INPUT)
|
Транзитный пакет(поступает в цепочку FORWARD)
|
eth1
Входящий пакет(поступает снова в цепочку INPUT)
|
LAN(пакет приходит локальному приложению)
Как это будет выгдядеть в рулах:
(пусть в ЛВС разрешено все)
$iptables -P INPUT DROP
$iptables -P OUTPUT DROP
$iptables -P FORWARD DROP
#Разрешаю входящие подключения, инициированные ранее из уже установившегося
$iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#Разрешаю выходить всем пакетам по всем протоколам из ЛВС в Интернет
$iptables -A OUTPUT -o eth1 -j ACCEPT
#SNAT
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 222.222.222.222
Но если трафик, проходящий между интерфейсами являеюся транзитным, то, => попадает в цепочку FORWARD и уничтожается, благодаря ранее установленной политике для этой цепочки.
Какое правило необходимо написать, чтобы транзитный трафик проходил только между этими интерфейсами?
$iptables -A FORWARD -j ACCEPT ?
Если так, то насколь безопасна такая запись, при том условии, что на роутере будет крутиться веб&майл-серверы?
Правильно ли я понимаю смысл цепочки FORWARD(т.е. это транзитный трафик между eth1ð0)? Или другой смысл несет в себе сия цепочка?
- Для комментирования войдите или зарегистрируйтесь
$iptables -A FORWARD -i eth0
$iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
$iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Такое правило позволяет проходить пакетам из eth1 к eth0 и обратно.
Я бы
Я бы нарисовал две схемы. Первая - для пакетов, приходящих из Интернета и адресованных локальным процессам роутера:
Internet
|
eth0
Входящий пакет(поступает в цепочку INPUT)
|
(пакет приходит локальному приложению)
|
eth0
Исходящий пакет(поступает цепочку OUTPUT)
|
Internet
Вторая - для транзитного трафика из Интернета в LAN:
Internet
|
eth0
|
Транзитный пакет(поступает в цепочку FORWARD)
|
eth1
|
LAN
И пример правил:
$iptables -P INPUT DROP
$iptables -P OUTPUT ACCEPT
$iptables -P FORWARD DROP
#Разрешаю входящие соединения из LAN к процессам роутера
$iptables -A INPUT -i eth1 -j ACCEPT
#Разрешаю транзитные пакеты из LAN в Internet
$iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
#И ответы на них
$iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#Разрешаю входящие, уже установленные соединения из Инета к локальным процессам роутера:
$iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#Если доступ к веб или почте нужно открыть для инета, то:
$iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
#Нат для юзеров из LAN
$iptables -t nat -A POSTROUTING -i eth1 -o eth0 -j SNAT --to-source 222.222.222.222
И не забудь включить форвардинг:
/etc/sysctl.conf
net.ipv4.ip_forward = 1
имхо для ната
имхо для ната надо указывать не -i, а -s (просто потому что не сожрет). и еще не забудь добавить правила для интерфейса lo, а могут разные эффекты быть неприятные.
_________________
Gentoo x86_64 2.6.17-r8 на Athlon 64 3000+
---------------------------------------
По поводу первой схемы:
Взять к примеру, работу команды ping r0.ru:
[eth0-WAN, eth1-LAN]
1. Пакет уходит с ПК(192.168.0.10, который в ЛВС) на роутер-eth1
$iptables -A INPUT -p icmp -i eth1 -s 192.168.0.10/24 -j ACCEPT
2. Пакет уходит с eth1(т.е. OUTPUT)
$iptables -A OUTPUT -p icmp -o eth1 -s 192.168.0.10/24 -j ACCEPT
3. Пакет становиться транзитным, т.к. передается с одного интерфейса на другой(eth1 на eth0)
$iptables -A FORWARD -i eth1 -o eth0 -s 192.168.0.10/24 -j ACCEPT
4. Пакет приходит на eth0(т.е. INPUT)
$iptables -A INPUT -p icmp -i eth0 -s 192.168.0.10/24 -j ACCEPT
5. Пакет уходит с eth0(т.е. OUTPUT)
$iptables -A OUTPUT -p icmp -o eth0 -s 192.168.0.10/24 -j ACCEPT
Схема движения пакета такова? Если неправильно, можете меня поправить?
Я не могу понять логику движения пакетов в данном случае.
Нет, транзитный
Нет, транзитный трафик не проходит по цепочкам INPUT и OUTPUT, только по FORWARD. А вообще, это всё прекрасно разжёвано тут:
http://www.opennet.ru/docs/RUS/iptables/#TRAVERSINGGENERAL
Даже с картинкой )
Я знаю, что он
Я знаю, что он не проходит по цепочкам INPUT&OUTPUT :-). Сообщением выше я описал свое представление о движении пакета через роутер(eth0-WAN, eth1-LAN). Там как раз и есть цепочка FORWARD. Как я понимаю, транзитный трафик - это трафик, который проходит между сетевыми интерфейсами (в данном случае - между eth0 & eth1). Вышепреведенной схемой движения пакета я хотел выяснить у знатоков iptables, правильность моих выводов о движении пакета.
В случае одного интерфеса я понимаю, что:
1. пакет может приходить на интерфейс к локальному приложению(к примеру, ответ на запрос веб-браузера)
2. пакет может выходить с интерфейса к какому-либо серверу в Интернете(к примеру, запрос веб-браузера на получение данных с веб-страницы)
Транзитный трафик в данном случае отсутствует.
Еще раз повторюсь: мне не понятен принцип составления правил для цепочки FORWARD, а также принцип движения пакетов между двумя интерфейсами.
Ну если на то
Ну если на то пошло, то транзитный трафик может присутствовать и при наличии только одного физического интерфейса:
1 при наличии нескольких виртуальных интерфейсов, напр. eth0.1, eth0.2 и пр., когда пересылка идёт между ними.
2 при использовании "двойного ната", когда меняется адрес и источника и назначения пакета, например:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 222.222.222.222
iptables -t nat -A POSTROUTING -d 222.222.222.222 -j SNAT --to-source 111.111.111.111
Здесь все запросы к машине 111.111.111.111 на 80 порт отправляются на адрес 222.222.222.222, и ответы тоже пойдут в обратную сторону, от 222.222.222.222 к 111.111.111.111 и далее к отправителю запроса. Это будет транзитный трафик.
Подводя итог
Подводя итог вышесказанного, необходимо всегда писать правила для транзитного трафика либо разрешать его в любом случае(iptables -P FORWARD ACCEPT). Теперь ясно. Значит и на внешний интерфейс необходимо писать правило, разрешающее транзитный трафик?