LINUX.ORG.RU
решено ФорумAdmin

Iptables. Как лучше всего протестить? Чего не хватает?

 


1

2

Приветствую. Есть роутер (CentOS), в нем FTP. Требуется: Пускать в роутер на 22 только с 192.168.1.105 Пускать в роутер из инета на vsftpd (порт нестандартный из-за провайдера). Локалку пускать в инет на TCP:21,53,80,443,465,993,995 UDP:53,123 и на локальные компы (без ограничений) По возможности все лишнее запретить нафиг.

Гляньте, пожалуйста, правила. Знаю, что вечно где-то косячу и что-то пропускаю по невнимательности, поэтому нужна помощь из вне. :) Пока есть что-то типа этого:

 
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -s 192.168.1.0/24 ! -d 192.168.1.0/24  -j SNAT --to-source 11.22.33.44
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:lan_ssh - [0:0]
:lan_rules - [0:0]
:icmp_allow - [0:0]
:wan_rules_out - [0:0]
:wan_rules_in - [0:0]
:fwd_rules_out - [0:0]
:fwd_rules_in - [0:0]
:rate_limit - [0:0]
:check-flags - [0:0]

#LAN
-A lan_rules -p tcp --dport 22 -j lan_ssh
-A lan_rules -m state --state NEW -j ACCEPT
-A lan_ssh -s 192.168.1.105 -j ACCEPT
-A lan_ssh -j DROP

#Scan
-A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
-A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
-A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
-A check-flags -p tcp --tcp-flags ALL ALL -j DROP
-A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
-A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
-A check-flags -p tcp --tcp-flags ALL NONE -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
-A check-flags -p tcp --tcp-flags ALL NONE -j DROP
-A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
-A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
-A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

#ICMP traffic
-A icmp_allow -p icmp --icmp-type 4 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 12 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 3 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 11 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 8 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 0 -j ACCEPT
-A icmp_allow -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
-A icmp_allow -p icmp -j DROP

#fwd_rules_out
-A fwd_rules_out -p tcp -m tcp -m multiport --dports 21,53,80,443,465,993,995 -j ACCEPT
-A fwd_rules_out -p udp -m udp -m multiport --dports 53,123 -j ACCEPT
-A fwd_rules_out -j DROP

#fwd_rules_in
-A fwd_rules_in -j RETURN

#FTP
-A rate_limit -p tcp --dport 2121 -m limit --limit 3/min --limit-burst 3 -j ACCEPT
-A rate_limit -j LOG --log-prefix "IN DROP: "
-A rate_limit -j DROP

#WAN
-A wan_rules_in -p tcp -m tcp --dport 2121 -m state --state NEW -j rate_limit
-A wan_rules_in -p tcp --dport 44000:44049 -m conntrack --ctstate ESTABLISHED,RELATED -m connlimit ! --connlimit-above 5 -j ACCEPT
-A wan_rules_in -j DROP

-A wan_rules_out -p tcp --dport 1024:65365 -j ACCEPT
-A wan_rules_out -p tcp -m tcp -m multiport --dports 21,53,80,443 -j ACCEPT
-A wan_rules_out -p udp -m udp -m multiport --dports 53,123 -j ACCEPT
-A wan_rules_out -j DROP

-A INPUT -j check-flags
-A INPUT -j icmp_allow
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth1 -j lan_rules
-A INPUT -i eth0 -j wan_rules_in

-A FORWARD -j check-flags
-A FORWARD -j icmp_allow
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -j fwd_rules_out
-A FORWARD -i eth0 -o eth1 -j fwd_rules_in

-A OUTPUT -j check-flags
-A OUTPUT -j icmp_allow
-A OUTPUT -o eth0 -j wan_rules_out
-A OUTPUT -o eth1 -j ACCEPT

COMMIT

eth0 - wan (11.22.33.44) eth1 - lan (192.168.1.0/24)

Как лучше всего протестировать то что получилось? Чую, не все перекрыто, или наоборот перестарался. Такую тему создавал, но она уже утонула. Но тогда вопрос был немного другой...

И нужно ли постоянно делать: -A <> -j DROP? По идее нет, све же по дефолту перекрыто. Сейчас сделано «на всякий случай».

fallschirm
() автор топика

ИМХО, "-A fwd_rules_in -j RETURN" только вредит восприятию, по сути ведь это DROP (по политике) и всё работает на "--state RELATED,ESTABLISHED".

С точки зрения оптимальности, лучше первыми ставить "--state RELATED,ESTABLISHED, ", а "-j icmp_allow" заменить на "-p icmp -j icmp_allow".

wan_rules_out мне не совсем понятны, почему здесь не использовано RELATED,ESTABLISHED, а открыты порты 1024:65365?

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

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

«вредит восприятию, по сути ведь это DROP» Я там изначально хотел несколько правил сделать, но пока они не нужны, сделал такую заглушку.

«wan_rules_out мне не совсем понятны» Я там сам запутался немного. :)

Так что ли надо? ->

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -s 192.168.1.0/24 ! -d 192.168.1.0/24  -j SNAT --to-source 11.22.33.44
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:lan_ssh - [0:0]
:lan_rules - [0:0]
:icmp_allow - [0:0]
:wan_rules_out - [0:0]
:wan_rules_in - [0:0]
:fwd_rules_out - [0:0]
:fwd_rules_in - [0:0]
:rate_limit - [0:0]
:check-flags - [0:0]

#LAN
-A lan_rules -p tcp --dport 22 -j lan_ssh
-A lan_rules -m state --state NEW -j ACCEPT
-A lan_ssh -s 192.168.1.105 -j ACCEPT
-A lan_ssh -j DROP

#Scan
-A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
-A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
-A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
-A check-flags -p tcp --tcp-flags ALL ALL -j DROP
-A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
-A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
-A check-flags -p tcp --tcp-flags ALL NONE -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
-A check-flags -p tcp --tcp-flags ALL NONE -j DROP
-A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
-A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
-A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

#ICMP traffic
-A icmp_allow -p icmp --icmp-type 4 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 12 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 3 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 11 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 8 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 0 -j ACCEPT
-A icmp_allow -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
-A icmp_allow -p icmp -j DROP

#fwd_rules_out
-A fwd_rules_out -p tcp -m tcp -m multiport --dports 21,53,80,443,465,993,995 -j ACCEPT
-A fwd_rules_out -p udp -m udp -m multiport --dports 53,123 -j ACCEPT
-A fwd_rules_out -j DROP

#fwd_rules_in
-A fwd_rules_in -j RETURN

#FTP
-A rate_limit -p tcp --dport 2121 -m limit --limit 3/min --limit-burst 3 -j ACCEPT
-A rate_limit -j LOG --log-prefix "IN DROP: "
-A rate_limit -j DROP

#WAN
-A wan_rules_in -p tcp -m tcp --dport 2121 -m state --state NEW -j rate_limit
-A wan_rules_in -p tcp --dport 44000:44049 -m conntrack --ctstate ESTABLISHED,RELATED -m connlimit ! --connlimit-above 5 -j ACCEPT
-A wan_rules_in -j DROP

-A wan_rules_out -p tcp -m tcp -m multiport --dports 21,53,80,443 -j ACCEPT
-A wan_rules_out -p udp -m udp -m multiport --dports 53,123 -j ACCEPT
-A wan_rules_out -j DROP

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j check-flags
-A INPUT -j icmp_allow
-A INPUT -i eth1 -j lan_rules
-A INPUT -i eth0 -j wan_rules_in

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j check-flags
-A FORWARD -j icmp_allow
-A FORWARD -i eth1 -o eth0 -j fwd_rules_out
-A FORWARD -i eth0 -o eth1 -j fwd_rules_in

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -j check-flags
-A OUTPUT -j icmp_allow
-A OUTPUT -o eth0 -j wan_rules_out
-A OUTPUT -o eth1 -j ACCEPT

COMMIT

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

Ну заглушку, так заглушку. Просто я бы там поставил -j DROP, а не -j RETURN.

Так, вроде всё нормально, только правило "--dport 44000:44049 ...-m connlimit ! --connlimit-above 5 " не имеет смысла, что в этом варианте, что в первом, в INPUT все «ESTABLISHED,RELATED» разрешаются до этого правила.

А если оно относится к ftp-data соединениям, то, ИМХО, оно только вредит. С одной стороны в разрешаете любое число ftp-подклчений (если они не происходят слишком часто), с другой стороны ограничиваете число скачек по ftp, в результате получится, что к ftp удаётся подключится, а данные не передаются. Уж лучше просто ограничить число подключений к ftp-серверу. Причём, может даже лучше через REJECT, а не через DROP, чтобы клиенты сразу видели, что их «отпинывают», а не ждали по таймауту.

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

Да, это FTP. Это все от незнания и от желания закрыть все лишнее. :) Т.е. так? ->

-A wan_rules_in -p tcp -m tcp --dport 2121 -m state --state NEW -j rate_limit
-A wan_rules_in -p tcp -m tcp --dport 2121 -m connlimit --connlimit-above 5 -j REJECT
-A wan_rules_in -j DROP

Или вообще так ->

-A wan_rules_in -p tcp -m tcp --dport 2121 -m state --state NEW -j rate_limit
-A wan_rules_in -j DROP

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

А почему при «в INPUT все „ESTABLISHED,RELATED“ разрешаются до этого правила», получается «с другой стороны ограничиваете число скачек по ftp»? Я что-то совсем запутался...

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

У вас было разрешние «ESTABLISHED,RELATED» до правила проверки "--dport 44000:44049". Думаю, что у вас загружен модуль для conntrack ftp-соединений и ему указан порт 2121. Тогда, все открываемые ftp-data соединения с самого начала будут RELATED и пройдут по этому правилу. И не попадут в правило "--dport 44000:44049". Это первая часть моего ответа.

С другой стороны, если перенести правило "--dport 44000:44049" пораньше, то получится, что вы ограничиваете число ftp-data соединений, но не ограничиваете число ftp-command соединений. И это в принципе не правильно, получатся ущербные ftp-сессии --- зайти можно, а что-то скачать нельзя.

Поэтому ограничивайте только порт 2121. Как угодно, можно сначала проверять на rate limit, но в цепочке rate_limit вместо ACCEPT сделать RETURN, а ACCEPT сделать в идущем следом правиле connlimit. Можно вобще убрать rate_limit, оставить только connlimit. Ну и ещё посмотреть какая нагрузка, а то 3 соединения в минуту и всего 5 соединений как-то совсем мало, разве что сервер будет исключительно для одного-двух человек.

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

Тогда по идее так:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -s 192.168.1.0/24 ! -d 192.168.1.0/24  -j SNAT --to-source 11.22.33.44
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:lan_ssh - [0:0]
:lan_rules - [0:0]
:icmp_allow - [0:0]
:wan_rules_out - [0:0]
:wan_rules_in - [0:0]
:fwd_rules_out - [0:0]
:fwd_rules_in - [0:0]
:rate_limit - [0:0]
:check-flags - [0:0]

#LAN
-A lan_rules -p tcp --dport 22 -j lan_ssh
-A lan_rules -m state --state NEW -j ACCEPT
-A lan_ssh -s 192.168.1.105 -j ACCEPT
-A lan_ssh -j DROP

#Scan
-A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
-A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
-A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
-A check-flags -p tcp --tcp-flags ALL ALL -j DROP
-A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
-A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
-A check-flags -p tcp --tcp-flags ALL NONE -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
-A check-flags -p tcp --tcp-flags ALL NONE -j DROP
-A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
-A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
-A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

#ICMP traffic
-A icmp_allow -p icmp --icmp-type 4 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 12 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 3 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 11 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 8 -j ACCEPT
-A icmp_allow -p icmp --icmp-type 0 -j ACCEPT
-A icmp_allow -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
-A icmp_allow -p icmp -j DROP

#fwd_rules_out
-A fwd_rules_out -p tcp -m tcp -m multiport --dports 21,53,80,443,465,993,995 -j ACCEPT
-A fwd_rules_out -p udp -m udp -m multiport --dports 53,123 -j ACCEPT
-A fwd_rules_out -j DROP

#fwd_rules_in
-A fwd_rules_in -j RETURN

#FTP
-A rate_limit -p tcp --dport 2121 -m limit --limit 3/min --limit-burst 3 -j RETURN
-A rate_limit -j LOG --log-prefix "IN DROP: "
-A rate_limit -j DROP

#WAN
-A wan_rules_in -p tcp -m tcp --dport 2121 -m state --state NEW -j rate_limit
-A wan_rules_in -p tcp -m tcp --dport 2121 -m connlimit ! --connlimit-above 5 -j ACCEPT
-A wan_rules_in -j DROP

-A wan_rules_out -p tcp -m tcp -m multiport --dports 21,53,80,443 -j ACCEPT
-A wan_rules_out -p udp -m udp -m multiport --dports 53,123 -j ACCEPT
-A wan_rules_out -j DROP

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j check-flags
-A INPUT -j icmp_allow
-A INPUT -i eth1 -j lan_rules
-A INPUT -i eth0 -j wan_rules_in

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j check-flags
-A FORWARD -j icmp_allow
-A FORWARD -i eth1 -o eth0 -j fwd_rules_out
-A FORWARD -i eth0 -o eth1 -j fwd_rules_in

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -j check-flags
-A OUTPUT -j icmp_allow
-A OUTPUT -o eth0 -j wan_rules_out
-A OUTPUT -o eth1 -j ACCEPT

COMMIT

«сервер будет исключительно для одного-двух человек» - Да, так и есть. Нагрузка будет минимальна.

Спасибо за помощь!

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