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