LINUX.ORG.RU

Всё ли правильно в настройках iptables?


1

1

Здравствуйте, господа. Имеются некоторые сомнения в правильности (правильной последовательности) в написании своего свода правил iptables для домашнего роутера. В связи с этим, хотелось бы Вас попросить указать мне, в чём именно я неправ. Домашний роутер представляет собой обычный системник на основе Intel Atom N2800 со встроенной сетевушкой (eth0, смотрящей в локальную сеть), USB-сетевушкой (eth1, смотрящей в Интернет) и WiFi-адаптер (wlan0, работающий в режиме точки доступа и имеющий доступ как в локальную сеть, так и в Интернет, благодаря мосту). На роутере используется proftpd, transmission-daemon, nginx, mysql, php-fpm и т.д.

#!/bin/sh

##################################################
#      Задаём часто используемые переменные      #
##################################################

export WAN=eth1
export LAN=eth0

##################################################
#  Разрешаем ядру перенаправлять сетевой трафик  #
##################################################

echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done

##################################################
#       Блокировка всего сетевого трафика        #
##################################################

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

##################################################
#          Очищаем все сетевые правила           #
##################################################

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -t filter -X

##################################################
#    Задаём сетевые правила для цепочки INPUT    #
##################################################

# Настраиваем правила маршрутизации
iptables -A INPUT ! -i lo -d 127.0.0.0/24 -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i ${WAN} --match state --state ESTABLISHED,RELATED -j ACCEPT

# Отбрасываем ошибочные пакеты
iptables -A INPUT -m state --state INVALID -j DROP
iptables -I INPUT -m conntrack --ctstate INVALID -j DROP

# Отбрасываем фрагментированные пакеты
iptables -A INPUT -f -j DROP

# Защита от попытки открыть входящее соединение TCP не через SYN
iptables -I INPUT -m conntrack --ctstate NEW -p tcp ! --syn -j DROP

# Защита от SYN-флуда
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p udp -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -j DROP

# Защита от сканеров портов
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

# Защита от Ping of death
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# Защита от спуфинга
iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset

# Защита от некорректных ICMP
iptables -I INPUT -p icmp -f -j DROP

# Разрешаем главные типы протокола ICMP
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT

# Чёрный список IP-адресов и их портов
iptables -A INPUT -s 5.45.75.10 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 174.143.173.119 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 61.231.91.253 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 94.102.51.155 -p tcp --dport 80 -j DROP

# Настройка моста
iptables -A INPUT -i br0 -s 192.168.0.0/24 -m state --state NEW -j ACCEPT

# Настраиваем доступ к определённым портам
iptables -A INPUT -i ${WAN} -p tcp -m multiport --ports 21,22,80,443,16843 -m state --state NEW -j ACCEPT
iptables -A INPUT -i ${WAN} -p udp -m multiport --ports 22,80,123,16843 -m state --state NEW -j ACCEPT
iptables -A INPUT -p TCP -i ${WAN} -d 0/0 --dport 0:1023 -j DROP
iptables -A INPUT -p UDP -i ${WAN} -d 0/0 --dport 0:1023 -j DROP

##################################################
#   Задаём сетевые правила для цепочки FORWARD   #
##################################################

# Настраиваем правила маршрутизации
iptables -A FORWARD -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i br0 -o ${WAN} -j ACCEPT
iptables -A FORWARD -i ${WAN} -o br0 -j REJECT

# Отбрасываем ошибочные пакеты
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -I FORWARD -m conntrack --ctstate INVALID -j DROP

# Отбрасываем фрагментированные пакеты
iptables -A FORWARD -f -j DROP

# Выравниваем значение MTU во избежание глюков с сайтами
iptables -A FORWARD -t mangle -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Защита от SYN-флуда
iptables -A FORWARD -p tcp --syn -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -p udp -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -p icmp -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -j DROP

# Защита от сканеров портов
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

# Защита от Ping of death
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 10/s --limit-burst 50 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -j DROP

##################################################
#   Задаём сетевые правила для цепочки OUTPUT    #
##################################################

# Настраиваем правила маршрутизации
iptables -A OUTPUT ! -o lo -d 127.0.0.0/8 -j DROP
iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o ${WAN} --match state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Сбрасываем ошибочные пакеты
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -I OUTPUT -m conntrack --ctstate INVALID -j DROP

# Сбрасываем фрагментированные пакеты
iptables -A OUTPUT -f -j DROP

# Разрешаем главные типы протокола ICMP
iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT

# Настраиваем доступ к определённым портам
iptables -A OUTPUT -o ${WAN} -p tcp -m multiport --ports 21,80,443 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -o ${WAN} -p udp -m multiport --ports 22,80,123 -m state --state NEW -j ACCEPT

##################################################
# Задаём сетевые правила для цепочки POSTROUTING #
##################################################

# Маскируем внутренние IP под внешний для Интернета
iptables -A POSTROUTING -t nat -o ${WAN} -j MASQUERADE

Всё ли верно?

P.S. Да, и ещё вопрос вдогонку: на ПК, подключённому к роутеру по WiFi, установлен TightVNC Server для удалённого доступа к этому ПК извне. Но почему-то доступа нет - есть доступ к TightVNC Server только из локальной сети. Что следует убрать\добавить в iptables чтобы исправить ситуацию?

С уважением.


Не знаю, всё ли правильно, но ощущение такое, что вы просто копировали всё подряд особо не вникая в смысл правил.

″-m state --state″ и
″-m conntrack --ctstate″ идентичны по функционалу, не нужно их дублировать, используйте что-нибудь одно.

В таблице filter нет фрагментированных пакетов, они дефрагментируются до этой таблицы, а если бы и были, то рубить их всех как-то не правильно, ведь EDNS вполне может получаеть ответ фрагментами.

Правила, котоыре после
iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
фактически не имеют смысла, ведь это правило ACCEPT для всех исходящих пакетов.

А то, что среди добавлемых в конец (″-A″) ещё есть правила, добавляемые в начало (″-I″) вобще затрудняет понимаение.

Но почему-то доступа нет - есть доступ к TightVNC Server только из локальной сети. Что следует убрать\добавить в iptables чтобы исправить ситуацию?

Наверное, DNAT.

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

Да, Вы правы. Этот свод правил вот уже как год используется. И когда я его составлял - я особо в смысл не вникал, но, по крайней мере, решил хоть как-то систематизировать, дабы самому впоследствии не запутаться.

″-m state --state″ и
″-m conntrack --ctstate″

Вас понял, убрал второй вариант из всех цепочек (INPUT, FORWARD и OUTPUT).

А то, что среди добавлемых в конец (″-A″) ещё есть правила, добавляемые в начало (″-I″) вобще затрудняет понимаение.

Благодарю Вас, исправил все "-I" на "-A" дабы не было путанницы.

Правила, котоыре после iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT фактически не имеют смысла

Вы имеете в виду убрать только эти две строчки (а не всё оставшееся в цепочке OUTPUT)?

iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o ${WAN} --match state --state NEW,ESTABLISHED,RELATED -j ACCEPT
В таблице filter нет фрагментированных пакетов, они дефрагментируются до этой таблицы, а если бы и были, то рубить их всех как-то не правильно, ведь EDNS вполне может получаеть ответ фрагментами.

Это не вполне понял. Могу лишь попробовать догадаться, что Вы имеете в виду то, что стоит убрать эти строки:

iptables -t filter -F
iptables -t filter -X

Я прав?

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

Это не вполне понял. Могу лишь попробовать догадаться, что Вы имеете в виду то, что стоит убрать эти строки:

Нет, в правиле:

# Сбрасываем фрагментированные пакеты
iptables -A OUTPUT -f -j DROP
и прочих, содержащих ″-f″, смысла нет. Пакет фрагментируется/дефрагментируется между iptables и сетевым интерфейсом. Во всяком случае, если в iptables задействован conntrack. Поэтому в iptables сбрасывать нечего, это правило никогда не сработает и только зря место в листинге занимает.

а не всё оставшееся в цепочке OUTPUT

Да нет, как раз все оставшиеся. Если я не ошибаюсь, то в выводе ″iptables -L -n -v″ у всех правил типа:

iptables -A OUTPUT -p icmp
будут нулевые счётчики срабатываний, хотя с маршрутизатора наверняка что-нибудь пинговали (type 8), его пинговали (type 0) и трейсроутили (type 11).

Правило:

-p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
фактически эквивалентно
-j ACCEPT
потому что все протоколы (-p all), и все возможные состояния соединения (NEW,ESTABLISHED,RELATED). Ну, кроме состояния ″INAVLID″, но чтобы в цепочке OUTPUT возник пакет с состоянием ″INAVLID″ нужно ещё постораться.

Ещё могу добавить, что правило:

iptables -A OUTPUT ! -o lo -d 127.0.0.0/8 -j DROP
и аналогичное с 127.0.0.0/8 в INPUT не имеют смысла. 127.0.0.0/8 назначен на lo интерфейс и куда-то ещё, кроме lo, пакет не пойдёт, а ещё в современных ядрах всегда включен фильтр ″марсианских″ пакетов и не локальные пакеты с адресом 127.0.0.0/8 он зарубит. Раньше этого фильтра не было и правила были нужны.

В целом, правила можно ещё долго вылизывать, например, не понятно, зачем упомянаются 22 и 80 порты по udp. Можно вынести чёрный список в отдельную цепочку, чтобы было удобнее добавлять/удалять ip-адреса. Но, если всё работает, то проще оставить всё как есть, или вам лично начинать думать о смысле каждого правила.

mky ★★★★★ ()

Я прочитал обсуждение, пока нечего добавить к комментариям mky, потому что сам листинг правил просмотрел бегло. Но в любом случае, если хочется разобраться, я бы таки посоветовал глянуть на Iptables Tutorial. Даже после разового беглого просмотра, многие вопросы, уже упомянутые тут, отпадают. Только вот известные мне переводы на русский этого документа устарели, так что читать придётся на буржуйском.

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

Спасибо Вам огромное, добрый человек. Воспользовался Вашими советами и листинг стал ощутимо короче. Изначально он и был небольшим, но тогда я, руководствуясь гуглом, начал наполнять его новыми различными правилами, полагая, что они так или иначе пригодятся. Как теперь выяснилось, напрасно.

Наверное, DNAT.

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

Роутер подключен к интернету. Имеется белый, но динамический IP (меняется при перезагрузке\переподключении сети - посему подключение к Интернет стараюсь лишний раз не трогать). На роутере установлен Debian Wheezy. Настроен DHCP для раздачи IP-адресов устройствам в локальной сети. Адрес роутера - 192.168.0.1. Адрес ПК, на котором стоит Windows с TightVNC - 192.168.0.61. Для TightVNC Server используется порт по умолчанию - 5900. Следовательно, я добавил следующее правило:

iptables -A PREROUTING -t nat -i ${WAN} -p tcp --dport 5900 -j DNAT --to-destination 192.168.0.61:5900

Но, к сожалению, подключиться не удатся. Уточню: в целях проверки подключения, я на ПК запустил TightVNC Server, который слушает порт 5900 в ожидании подключения. Далее, на том же ПК я запускаю TightVNC Viewer и пытаюсь подключиться к TightVNC Server. При этом, если я указываю 192.168.0.61:5900, то запрашивается авторизация и происходит подключение. Если же указываю внешний_ip:5900, то подключение не осуществляется. В чём может быть проблема?

P.S. Не исключаю, что одного добавленного правила может быть недостаточно, но что-то пока идей нет...

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

Из локальной сети нужно два правила, чтобы TightVNC Server отправлял пакеты к TightVNC Viewer через маршрутизатор, а не напрямую.

iptables -t nat -A PREROUTING -i ${LAN} -p tcp --dport 5900 -j DNAT --to-destination 192.168.0.61:5900
iptables -t nat -A POSTROUTING -i ${LAN} -d 192.168.0.61 -p tcp --dport 5900 -j SNAT --to-source 192.168.0.1

Для подключений из инета SNAT правило как бы не нужно, но на винде часто бывает настройка фильтра пакетов или ещё чего, что не принимает соединения с адресов не из локальной сети. Так что, может SNAT и будет нужен и без ″-i ${LAN}″.

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

К сожалению, попытка подключения не увенчалась успехом. TightVNC Viewer постоянно пишет при подключении:

"Error in TightVNC Viewer: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение."

может SNAT и будет нужен и без ″-i ${LAN}″.

Вы правы - не нужен. Вернее, с ″-i ${LAN}″ скрипт не запускается. Выводится ошибка:

iptables v1.4.14: Can't use -i with POSTROUTING

Пришлось ″-i ${LAN}″ убрать. Ошибка пропала, но TightVNC всё равно не желает подключаться.

Sferg ()
Ответ на: комментарий от shell-script

Дополню для ТС: не надо прямо сразу изучать синтаксис iptables, всё что надо для начала — это понять через какие цепочки (таблицы) проходят те или иные пакеты (локальные, транзитные, ...). Ну и естественно надо знать основы TCP/IP сетей, хотя бы source/destination IP address, source/destination port, netmask, routing.

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