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

Другие вопросы по тегам