IPtables блокирует SSH только при использовании conntrack
ошибка
Как видите, единственная разница между рабочей и не рабочей конфигурацией -m conntrack --ctstate NEW,ESTABLISHED,RELATED
, Если я использую -m conntrack --ctstate NEW,ESTABLISHED
это тоже не работает... Но почему?!
После нескольких тестов я заметил, что все правила, использующие conntrack
не работает... Можете ли вы объяснить мне, почему SSH заблокирован iptables
только когда я использую conntrack
?
Спасибо:-)
Рабочая конфигурация
#!/ Bin/ Баш Server_ip ="XXXX" iptables -F iptables -X # Установка политики фильтра по умолчанию iptables -P INPUT DROP iptables -P ВЫХОД ПРИНЯТЬ iptables -P FORWARD DROP # Разрешить предыдущие подключения iptables -A INPUT -m conntrack --ctstate СВЯЗАННЫЕ, УСТАНОВЛЕННЫЕ -j ПРИНЯТЬ iptables -A OUTPUT -m conntrack --ctstate RELATED, УСТАНОВЛЕНО -j ПРИНЯТЬ # Разрешить неограниченный трафик при обратной связи iptables -A INPUT -i lo -j ПРИНЯТЬ iptables -A ВЫХОД -o lo -j ПРИНЯТЬ # Разрешить только входящий SSH iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -j ПРИНЯТЬ iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -j LOG --log-prefix "[ПРИНЯТЬ ВВОД] [SSH]" # убедитесь, что ничего не приходит и не выходит из этой коробки iptables -A INPUT -j LOG --log-prefix "[DROP INPUT][DEFAULT] " iptables -A INPUT -j DROP
Не рабочая конфигурация
#!/ Bin/ Баш Server_ip ="XXXX" iptables -F iptables -X # Установка политики фильтра по умолчанию iptables -P INPUT DROP iptables -P ВЫХОД ПРИНЯТЬ iptables -P FORWARD DROP # Разрешить предыдущие подключения iptables -A INPUT -m conntrack --ctstate СВЯЗАННЫЕ, УСТАНОВЛЕННЫЕ -j ПРИНЯТЬ iptables -A OUTPUT -m conntrack --ctstate RELATED, УСТАНОВЛЕНО -j ПРИНЯТЬ # Разрешить неограниченный трафик при обратной связи iptables -A INPUT -i lo -j ПРИНЯТЬ iptables -A ВЫХОД -o lo -j ПРИНЯТЬ # Разрешить только входящий SSH iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -m conntrack --ctstate НОВЫЙ, УСТАНОВЛЕННЫЙ, СВЯЗАННЫЙ -j ПРИНЯТЬ iptables -A INPUT -p tcp -s 0/0 -d ${SERVER_IP} --dport 22 -m conntrack --ctstate NEW, УСТАНОВЛЕНО, СВЯЗАНО -j LOG --log-prefix "[ПРИНЯТЬ ВХОД] [SSH]" # убедитесь, что ничего не приходит и не выходит из этой коробки iptables -A INPUT -j LOG --log-prefix "[DROP INPUT][DEFAULT] " iptables -A INPUT -j DROP
[РЕДАКТИРОВАТЬ]
Как я могу быть уверен, что Conntrack участвует?
Потому что в файле журнала я вижу что-то вроде этого:
[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.
2 ответа
На этот раз я знаю, как заставить это работать, не зная, почему это не работает. Перезапуск iptables
Сервис заставляет мой скрипт работать: systemctl restart iptables
,
Прежде чем работать над этим простым сценарием, я пытался реализовать еще один, гораздо дольше. Это применяет новые правила в других ЦЕПЯХ, таких как PREROUTING и другие обычаи. Этот сценарий должен был принудительно iptables
перестать работать с cstate
или же conntrack
Может быть, заполняя таблицу до этого максимум?
Спасибо всем за ваши ответы! Я наконец понял это, когда я удалил firewalld
в пользу iptables
кажется, что я удалил также некоторые зависимости. После удаления и последующей установки iptables моя конфигурация стала функциональной.
[EDIT] На самом деле это все еще не работает:-(
В логах я заметил, что пакеты "SYN" и "ACK SYN" сбрасываются iptables
:
17 декабря 08:03:38 ядро loki: [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 17 декабря 08:03:38 ядро loki: [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 ОКНО =29200 RES=0x00 ACK SYN URGP=0 17 декабря 08:03:38 ядро loki: [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 ОКНО =256 RES=0x00 ACK URGP=0 17 декабря 08:03:38 ядро loki: [ПРИНЯТЬ] [ВХОД][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 17 дек. 08:03:38 loki sshd[5074]: соединение с myIP-порта 51942 на serverIP-порт 22 17 дек. 08:03:39 loki sshd[5074]: принят пароль для myUSER через порт myIP 51942 ssh2 17 дек. 08:03:39 loki systemd-logind: новая сессия 307 пользователя myUSER. 17 дек. 08:03:39 loki systemd: запущена сессия 307 пользователя myUSER.
Как вы увидите в моих правилах, я не убирал пакеты для реальных тестов, чтобы поддерживать связь с моим сервером. Здесь используется скрипт:
#! / Bin/ Баш # # ========= # Сбросить все # ========= # Iptables="Iptables" ip6tables = "ip6tables" # АППАРАТНЫЙ СБРОС $iptables -P ВВОД ПРИНЯТЬ $iptables -P FORWARD ACCEPT $iptables -P ВЫХОД ПРИНЯТЬ $ iptables -F $ iptables -X # $ iptables -t nat -F # $ iptables -t mangle -F ## Отбросить трансляцию (без лога) $iptables -A INPUT -m pkttype --pkt-тип трансляции -j DROP $iptables -A FORWARD -m pkttype --pkt-тип трансляции -j DROP $ iptables -A INPUT -d 255.255.255.255 -j DROP $ iptables -A FORWARD -d 255.255.255.255 -j DROP # Держите соединения открытыми # НЕ ИСПОЛЬЗУЕТСЯ ОТНОСИТЕЛЬНО? https://gist.github.com/azlux/6a70bd38bb7c525ab26efe7e3a7ea8ac $iptables -A INPUT -m conntrack --ctstate УСТАНОВЛЕНО, СВЯЗАНО -j ПРИНЯТЬ $iptables -A OUTPUT -m conntrack --ctstate УСТАНОВЛЕНО, СВЯЗАНО -j ПРИНЯТЬ # # =============== # Разрешить localhost # =============== # $iptables -A INPUT -i lo -j ПРИНЯТЬ $iptables -A OUTPUT -o lo -j ПРИНЯТЬ # # ==== # IPv6 # ==== # $ ip6tables -P INPUT DROP $ ip6tables -A OUTPUT -j REJECT $ ip6tables -P FORWARD DROP # # =========== # Разрешить порты # =========== # ## НОВОЕ НЕ СИНХРОНИЗАЦИЯ $ iptables -A INPUT -p tcp! --syn -m conntrack --ctstate NEW -j LOG --log-prefix "[INPUT] [DROP] [NOT SYN]" ## DNS (без логов) $iptables -A OUTPUT -p udp -s 0/0 --dport 53 -m conntrack --ctstate НОВОЕ, СВЯЗАННОЕ, УСТАНОВЛЕННОЕ -j ПРИНЯТЬ $iptables -A INPUT -p udp --sport 53 -m conntrack --ctstate RELATED, УСТАНОВЛЕНО -j ПРИНЯТЬ ## SSH $iptables -A INPUT -p tcp -s 0/0 --dport 22 -m conntrack --ctstate НОВЫЙ, СВЯЗАННЫЙ, УСТАНОВЛЕННЫЙ -j LOG - Журнал-префикс "[ПРИНЯТЬ] [ВХОД][SSH] " $iptables -A INPUT -p tcp -s 0/0 --dport 22 -m conntrack --ctstate НОВОЕ, СВЯЗАННОЕ, УСТАНОВЛЕННОЕ -j ПРИНЯТЬ $iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate RELATED, УСТАНОВЛЕНО -j ПРИНЯТЬ # # ================= # Журналы DROP Пакеты # ================= # $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] " выход 0