[SOLVED] Настройка iptables (nat+firewall), порт tcp80: доступны не все сайты

Автор skantor, 01 октября 2012, 07:57:11

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

skantor

Добрый день, многоуважаемый ALL.

Так случилось, что возникла (производственная?) необходимость по перенастройке домашнего сервера с Windows 2000 на Debian Linux. Основные функции: proxy, firewall, file/print server + сетевые службы ftp, http, smtp/pop3, irc и др. К сожалению, пришлось споткнуться чуть ли не в самом начале, на реализации nat/proxy служб.
Версия Debian: 6.0.4, ядро 2.6.32-5-686, без графической оболочки, компьютер Pentium III 650, ОЗУ 384 Мб, два сетевых интерфейса 100 Мб/с (внешний eth0, внутренний eth1/192.168.1.1), подключение к провайдеру по pppoe, ip-адрес статичный.

С UNIX'ом не приходилось сталкиваться лет 20, так что ось для меня практически что совсем новая. Поиск в Интернете дал, что наиболее простыми в настройке является пара iptables + squid. Использованы рекомендованные материалы по настройке из Интернет, в результате получен следующий конфигурационный файл для iptables, запуск ведется через iptables-restore:
Открыть содержимое (спойлер)
# Generated by iptables-save v1.4.8 on Sun Sep 30 00:35:20 2012
*filter
:INPUT DROP [2:670]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:ALLOWED - [0:0]
:BAD_TCP_PACKETS - [0:0]
:ICMP_PACKETS - [0:0]
:TCP_PACKETS - [0:0]
:UDP_PACKETS - [0:0]
-A INPUT -p tcp -j BAD_TCP_PACKETS
-A INPUT -s 192.168.1.0/24 -i eth1 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -i lo -j ACCEPT
-A INPUT -s 192.168.1.1/32 -i lo -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/32 -i lo -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --sport 68 --dport 67 -j ACCEPT
-A INPUT -d XXX.XXX.XXX.XXX/32 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i ppp0 -p tcp -j TCP_PACKETS
-A INPUT -i ppp0 -p udp -j UDP_PACKETS
-A INPUT -i ppp0 -p icmp -j ICMP_PACKETS
-A INPUT -d 224.0.0.0/8 -i ppp0 -j DROP
-A INPUT -i eth0 -j DROP
-A INPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "IPT INPUT packet died: " --log-level 7
-A FORWARD -s 192.168.0.0/16 -i ppp0 -o eth1 -j ACCEPT
-A FORWARD -p tcp -j BAD_TCP_PACKETS
-A FORWARD -i eth1 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "IPT FORWARD packet died: " --log-level 7
-A OUTPUT -o ppp0 -p udp -m udp --sport 32769:65535 --dport 33434:33523 -j ACCEPT
-A OUTPUT -p tcp -j BAD_TCP_PACKETS
-A OUTPUT -s 127.0.0.1/32 -j ACCEPT
-A OUTPUT -s 192.168.1.1/32 -j ACCEPT
-A OUTPUT -s XXX.XXX.XXX.XXX/32 -j ACCEPT
-A OUTPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "IPT OUTPUT packet died: " --log-level 7
-A ALLOWED -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
-A ALLOWED -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A ALLOWED -p tcp -j DROP
-A BAD_TCP_PACKETS -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
-A BAD_TCP_PACKETS -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A ICMP_PACKETS -i eth1 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ICMP_PACKETS -i ppp0 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ICMP_PACKETS -i ppp0 -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ICMP_PACKETS -i ppp0 -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A TCP_PACKETS -p tcp -m tcp --dport 21 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --dport 22 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --dport 25 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --dport 80 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --sport 80 --dport 1024:65535 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --sport 8080 --dport 1024:65535 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --sport 8083 --dport 1024:65535 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --dport 110 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --dport 113 -j ALLOWED
-A TCP_PACKETS -p tcp -m tcp --dport 443 -j ALLOWED
-A UDP_PACKETS -p udp -m udp --dport 53 -j ACCEPT
-A UDP_PACKETS -p udp -m udp --dport 123 -j ACCEPT
-A UDP_PACKETS -p udp -m udp --dport 2074 -j ACCEPT
-A UDP_PACKETS -p udp -m udp --dport 4000 -j ACCEPT
-A UDP_PACKETS -d XXX.XXX.XXX.255/32 -i ppp0 -p udp -m udp --dport 135:139 -j DROP
-A UDP_PACKETS -d 255.255.255.255/32 -i ppp0 -p udp -m udp --dport 67:68 -j DROP
COMMIT
# Completed on Sun Sep 30 00:35:20 2012
# Generated by iptables-save v1.4.8 on Sun Sep 30 00:35:20 2012
*nat
:PREROUTING ACCEPT [216:20938]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [100:9335]
-A POSTROUTING -p icmp -j MASQUERADE
-A POSTROUTING -p tcp --dport 25 -j MASQUERADE
-A POSTROUTING -p tcp --dport 80 -j MASQUERADE
-A POSTROUTING -p tcp --dport 110 -j MASQUERADE
-A POSTROUTING -p tcp --dport 443 -j MASQUERADE
-A POSTROUTING -p udp --dport 443 -j MASQUERADE
COMMIT
# Completed on Sun Sep 30 00:35:20 2012
[свернуть]
squid установлен, но толком не настроен, перенаправление портов на tcp3128 отключено.

Суть проблемы. При попытке просмотра Интернет-сайтов непосредственно с сервера (через elinks) все в порядке, т.е. сеть работает нормально (насколько об этом можно судить из текстового браузера). При попытке просмотра сайтов из компьютеров внутренней сети обнаруживается, что часть сайтов работает (в том числе и debianforum), часть сайтов "зависает" на получении данных, среди них google, youtube и ряд других сайтов. На некоторых сайтах работает их содержимое, но не загружается содержимое внедренных объектов.
syslog изучен, явного отписывания блокируемых портов/пакетов не видно. Более того, еще в начале настройки, когда политика на цепочки INPUT, OUTPUT и FORWARD стояла ACCEPT, картина была та же самая. Были попытки вставлять дополнительные строчки логирования в iptables, с нулевым результатом.
Есть подозрения: а) на неправильно настроенный MASQUERADE или вообще конфигурацию iptables; б) на остаточно работающий squid, хотя его отключение не решает проблему; в) на iptables как таковой (есть в сети и анти-iptables статьи).

Заранее спасибо, если сможете помочь. Любые логи или конфиги выкладываю по первому запросу.

ihammers

Да... iptables "перегружен":)

Если вам нужно раздавать только web, то можно обойтись только настройкой интернета на сервере и настройкой squid.
Если вам ещё нужно некоторые машины выпускать через nat, то посмотрите следующие статьи на форуме: 1 и 2.

Возможно стоит вам посмотреть только статью про NAT, и оставить настройки squid по умолчанию, при этом всё должно работать.  Если будут ещё вопросы или проблемы, обращайтесь.
Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290

skantor

ihammers, спасибо за ответ.

Поскольку статья про NAT довольно проста, а ссылки 1 и 2 содержат примеры скриптов, мной было принято решение "на свежую голову" пересмотреть созданные таблицы цепочек. После удаления явно параноидальных узлов, блокирующих полезный трафик, проблема не решилась.
Случайно удалось наткнуться на похожую проблему в Интернете, решение связано с TCP MSS, и приводится строка настройки iptables, снимающая данную проблему.

iptables -t mangle -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Поясняющая статья здесь: habrahabr.ru/post/136871/

Всем неравнодушным к проблеме большое спасибо. Вопрос перевожу в статус SOLVED.