Как видите, единственная разница между рабочей и нерабочей конфигурацией заключается в -m conntrack --ctstate NEW,ESTABLISHED,RELATED
. Если я использую -m conntrack --ctstate NEW,ESTABLISHED
тоже не работает ... Но почему ?!
После нескольких тестов я заметил, что все правила, использующие conntrack
не работает ... Вы можете объяснить, почему SSH блокируется iptables
только когда я использую conntrack
?
Спасибо :-)
#!/bin/bash SERVER_IP="X.X.X.X" iptables -F iptables -X # Setting default filter policy iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP # Allow previous connections iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Allow unlimited traffic on loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Allow incoming ssh only iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -j ACCEPT iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -j LOG --log-prefix "[ACCEPT INPUT][SSH] " # make sure nothing comes or goes out of this box iptables -A INPUT -j LOG --log-prefix "[DROP INPUT][DEFAULT] " iptables -A INPUT -j DROP
#!/bin/bash SERVER_IP="X.X.X.X" iptables -F iptables -X # Setting default filter policy iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP # Allow previous connections iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Allow unlimited traffic on loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Allow incoming ssh only iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j LOG --log-prefix "[ACCEPT INPUT][SSH] " # make sure nothing comes or goes out of this box iptables -A INPUT -j LOG --log-prefix "[DROP INPUT][DEFAULT] " iptables -A INPUT -j DROP
[РЕДАКТИРОВАТЬ]
Потому что в лог-файле я вижу что-то вроде этого:
[DROP][INPUT] IN=eth0 OUT= MAC=0c:c4:...:00 SRC=X.X.X.X DST=X.X.X.X LEN=67 TOS=0x08 PREC=0x20 TTL=41 ID=39550 DF PROTO=TCP SPT=51093 DPT=22 WINDOW=229 RES=0x00 ACK PSH URGP
[DROP][INPUT]
это последнее правило в моем файле конфигурации iptables.
На этот раз я знаю, как заставить его работать, не зная, почему это не работает. Перезапуск iptables
сервис заставляет мой скрипт работать: systemctl restart iptables
.
Прежде чем работать над этим простым скриптом, я пытался реализовать другой, гораздо дольше. Он применяет новые правила в других ЦЕПЯХ, таких как PREROUTING и другие обычаи. Этот сценарий, должно быть, принудительно iptables
прекратить работать с cstate
или conntrack
, может, заполнив таблицу до максимума?
Всем спасибо за ответы! Я наконец понял это, когда удалил firewalld
в пользу iptables
похоже, что я удалил также некоторые зависимости. После удаления и повторной установки iptables моя конфигурация стала функциональной.
[EDIT] На самом деле это все еще не работает :-(
В журналах я заметил, что пакеты «SYN» и «ACK SYN» сбрасываются iptables
:
Dec 17 08:03:38 loki kernel: [DROP][INPUT][DEFAULT] IN=eth0 OUT= MAC=0c:c4:...:00 SRC=myIP DST=serverIP LEN=52 TOS=0x00 PREC=0x00 TTL=120 ID=12527 DF PROTO=TCP SPT=51942 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0 Dec 17 08:03:38 loki kernel: [DROP][OUTPUT][DEFAULT] IN= OUT=eth0 SRC=serverIP DST=myIP LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=22 DPT=51942 WINDOW=29200 RES=0x00 ACK SYN URGP=0 Dec 17 08:03:38 loki kernel: [INPUT][DROP][NOT SYN] IN=eth0 OUT= MAC=0c:c4:...:00 SRC=myIP DST=serverIP LEN=40 TOS=0x00 PREC=0x00 TTL=120 ID=12528 DF PROTO=TCP SPT=51942 DPT=22 WINDOW=256 RES=0x00 ACK URGP=0 Dec 17 08:03:38 loki kernel: [ACCEPT][INPUT][SSH] IN=eth0 OUT= MAC=0c:c4:...:00 SRC=myIP DST=serverIP LEN=40 TOS=0x00 PREC=0x00 TTL=120 ID=12528 DF PROTO=TCP SPT=51942 DPT=22 WINDOW=256 RES=0x00 ACK URGP=0 Dec 17 08:03:38 loki sshd[5074]: Connection from myIP port 51942 on serverIP port 22 Dec 17 08:03:39 loki sshd[5074]: Accepted password for myUSER from myIP port 51942 ssh2 Dec 17 08:03:39 loki systemd-logind: New session 307 of user myUSER. Dec 17 08:03:39 loki systemd: Started Session 307 of user myUSER.
Как вы увидите в моих правилах, я не отбрасывал пакеты на самом деле для моих тестов, чтобы оставаться на связи с моим сервером. Здесь используется скрипт:
#!/bin/bash # # ========= # Reset ALL # ========= # iptables="iptables" ip6tables="ip6tables" # HARD RESET $iptables -P INPUT ACCEPT $iptables -P FORWARD ACCEPT $iptables -P OUTPUT ACCEPT $iptables -F $iptables -X # $iptables -t nat -F # $iptables -t mangle -F ## Drop broadcast (without log) $iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP $iptables -A FORWARD -m pkttype --pkt-type broadcast -j DROP $iptables -A INPUT -d 255.255.255.255 -j DROP $iptables -A FORWARD -d 255.255.255.255 -j DROP # Keep connections opened # DO NOT USE RELATED? https://gist.github.com/azlux/6a70bd38bb7c525ab26efe7e3a7ea8ac $iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT $iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # # =============== # Allow localhost # =============== # $iptables -A INPUT -i lo -j ACCEPT $iptables -A OUTPUT -o lo -j ACCEPT # # ==== # IPv6 # ==== # $ip6tables -P INPUT DROP $ip6tables -A OUTPUT -j REJECT $ip6tables -P FORWARD DROP # # =========== # Allow ports # =========== # ## NEW NOT SYNC $iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j LOG --log-prefix "[INPUT][DROP][NOT SYN] " ## DNS (no logs) $iptables -A OUTPUT -p udp -s 0/0 --dport 53 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT $iptables -A INPUT -p udp --sport 53 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT ## SSH $iptables -A INPUT -p tcp -s 0/0 --dport 22 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j LOG --log-prefix "[ACCEPT][INPUT][SSH] " $iptables -A INPUT -p tcp -s 0/0 --dport 22 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT $iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # # ================= # Logs DROP paquets # ================= # $iptables -A INPUT -j LOG --log-prefix="[DROP][INPUT][DEFAULT] " $iptables -A FORWARD -j LOG --log-prefix="[DROP][FORWARD][DEFAULT] " $iptables -A OUTPUT -j LOG --log-prefix="[DROP][OUTPUT][DEFAULT] " exit 0