UFW Дозволяє 22 для IPv4 та IPv6, але SSH відключається при включенні


10

sudo ufw disableпісля чого sudo ufw enableвиштовхує мене з SSH

Звіти DMESG

[UFW BLOCK] IN=eth0 OUT= MAC=30:........ SRC=192.168.1.me DST=192.168.1.server LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=15776 DF PROTO=TCP SPT=55640 DPT=22 WINDOW=253 RES=0x00 ACK URGP=0

Я можу ввійти назад, не змінюючи правила через консоль (UFW все ще ввімкнено).

Це почалося після оновлення Xenial (16.04) з ядра 4.4 до 4.15 (HWE). Оновлення до 18.04.1 питання не вирішило.

Версії:

  • iptables v1.6.1
  • ufw 0,35
  • 4.15.0-29-generic # 31-Ubuntu
  • Ubuntu 18.04.1 LTS

Дослідження статусу UFW є (деякі правила були пропущені, але всі вони ВИДАЛЕНО)

Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
22 (v6)                    ALLOW IN    Anywhere (v6)

Чому це відбувається або, принаймні, як повернутися до очікуваної поведінки?

Я переглянув цю відповідь , і не впевнений, що це стосується, але ось /etc/ufw/before.rules

#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#

# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines


# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

# quickly process packets for which we already have a connection
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# drop INVALID packets (logs these in loglevel medium and higher)
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP

# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT

# allow dhcp client to work
-A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT

#
# ufw-not-local
#
-A ufw-before-input -j ufw-not-local

# if LOCAL, RETURN
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN

# if MULTICAST, RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN

# if BROADCAST, RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN

# all other non-local packets are dropped
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP

# allow MULTICAST mDNS for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT

# allow MULTICAST UPnP for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

PS: Я не очікував, що це "виправить" проблему, але лише для довідки я змінив порт SSHD слухає на (і відповідне правило), і проблема зберігається.


Отже, все працює як слід, за винятком того, що ви на мить випадаєте з сеансу ssh, коли ви вимикаєте брандмауер і знову вмикаєте?
Бернар Вей

так, на мить, як у ньому відключається, і мені доведеться знову підключитися. це не просто "стійло"
Gaia

Це дуже дивно, тому що включення / відключення через ufw має набути чинності лише після перезавантаження. Ви можете перевірити за допомогою systemctl status ufw, щоб побачити, що він все ще працює (або не працює), коли ці команди видаються.
Бернар Вей

2
Це, здається, є регресією ядра і, здається, було введено між ядрами 4.13 та 4.14. Я зараз роблю поділ ядра. Це займе день чи два. Якщо хтось із читачів уже знає винуватця, будь ласка, напишіть тут, щоб я не витрачав час.
Doug Smythies

1
Поки помилки немає, я тільки що закінчив поділ ядра. 4d3a57f23dec59f0a2362e63540b2d01b37afe0a netfilter: conntrack: не включати відстеження з'єднання, якщо не потрібно. Дайте мені кілька годин, і я напишу відповідь.
Doug Smythies

Відповіді:


9

Передумови та межі випуску:

  • Проблема виникає лише тоді, коли UFW або iptables з цими правилами дозволу ssh увімкнено та розпочато сеанс ssh. тобто будь-який сеанс SSH, який розпочався без iptables, взагалі працює нормально, але може бути предметом випадкових відмов, коли встановлений набір правил.
  • нагадайте, що ufw - це лише передній кінець для iptables.
  • Проблема присутня навіть з ядром 4.18-rc8.

Що відбувається?

У sudo ufw allow in port 22результатах в наступному IPTables правил сегмента:

Chain ufw-before-input (1 references)
    pkts      bytes target     prot opt in     out     source               destination
      16     1553 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
     386   300622 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
      15     1068 ufw-logging-deny  all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
      15     1068 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID

Після цього sudo ufw disableслідує sudo ufw enable, і навіть незважаючи на те, що сам ssh-з'єднання залишається нормальним, набір правил iptables, здається, забув асоціацію з цим конкретним з'єднанням і тому класифікує всі вхідні пакети як недійсні. Якимось чином таблиця відстеження з'єднання заплуталася, і пакет навіть не вважається НОВОЮ, але з неправильними прапорами, і не вважається частиною існуючого з'єднання.

Розглянемо дуже базовий еквівалент iptables того, що ufwробиш. Два сценарії, один для очищення набору правил і один для його створення:

#!/bin/sh
FWVER=0.01
#
# clear_firewall_min 2018.08.10 Ver:0.01
#       clear iptables minimum.
#       Currently for this question:
#       /ubuntu/1059781/ufw-allows-22-for-ipv4-and-ipv6-but-ssh-disconnects-when-enabling
#
echo "Loading clear_firewall_min version $FWVER..\n"

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Set some stuff
#
EXTIF="ens5"
UNIVERSE="0.0.0.0/0"

#Clearing any previous configuration
#
echo "  Clearing any existing rules and setting default policies.."
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT

# Reset all IPTABLES counters
$IPTABLES -Z

#sleep 10

echo clear_firewall_min $FWVER done.

І:

#!/bin/sh
#
# test_firewall 2018.08.13 Ver:0.01
#       Minimum version of most basic iptables firewall.
#
# test_firewall 2018.08.09 Ver:0.01
#       Most basic iptables firewall.
#       Currently for this question:
#       /ubuntu/1059781/ufw-allows-22-for-ipv4-and-ipv6-but-ssh-disconnects-when-enabling
#

#sleep 50

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Set some stuff
#
EXTIF="ens5"
UNIVERSE="0.0.0.0/0"

#Clearing any previous configuration
#
#echo "  Clearing any existing rules and setting default policies.."
$IPTABLES -P INPUT DROP
$IPTABLES -F INPUT

# loopback interfaces are valid.
#
$IPTABLES -A INPUT -i lo -s $UNIVERSE -d $UNIVERSE -j ACCEPT

$IPTABLES -A INPUT -i $EXTIF -p tcp -m conntrack --ctstate INVALID -j LOG --log-prefix "IINVALID:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -p tcp -m conntrack --ctstate INVALID -j DROP
$IPTABLES -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j LOG --log-prefix "NEW TCP no SYN:" --log-level info
$IPTABLES -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
$IPTABLES -A INPUT -i $EXTIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $EXTIF -p tcp -m conntrack --ctstate NEW --dport 22 -j ACCEPT

echo "test_firewall_min $FWVER done..." >> /dev/kmsg

sleep 3

Результати в цих пакетах рахуються після циклу очищення / завантаження з сеансом ssh, який розпочався після циклу завантаження:

doug@s17:~$ sudo iptables -v -x -n -L
Chain INPUT (policy DROP 3 packets, 220 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       0        0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
      35     6388 LOG        tcp  --  ens5   *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID LOG flags 0 level 6 prefix "IINVALID:"
      35     6388 DROP       tcp  --  ens5   *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
       0        0 LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp flags:!0x17/0x02 ctstate NEW LOG flags 0 level 6 prefix "NEW TCP no SYN:"
       0        0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp flags:!0x17/0x02 ctstate NEW
       9      680 ACCEPT     all  --  ens5   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
       0        0 ACCEPT     tcp  --  ens5   *       0.0.0.0/0            0.0.0.0/0            ctstate NEW tcp dpt:22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 12 packets, 1408 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Зверніть увагу на 35 недійсних пакетів, коли я набирав на скаліченому терміналі сеансу ssh, і до того, як PuTTY припинився.

Чому це перестало працювати, воно працювало раніше?

Оскільки це повторюється на 100%, розділення ядра було відносно легким, забираючи багато часу. Результати:

4d3a57f23dec59f0a2362e63540b2d01b37afe0a is the first bad commit
commit 4d3a57f23dec59f0a2362e63540b2d01b37afe0a
Author: Florian Westphal <fw@strlen.de>
Date:   Fri Jul 28 11:22:04 2017 +0200

    netfilter: conntrack: do not enable connection tracking unless needed

    Discussion during NFWS 2017 in Faro has shown that the current
    conntrack behaviour is unreasonable.

    Even if conntrack module is loaded on behalf of a single net namespace,
    its turned on for all namespaces, which is expensive.  Commit
    481fa373476 ("netfilter: conntrack: add nf_conntrack_default_on sysctl")
    attempted to provide an alternative to the 'default on' behaviour by
    adding a sysctl to change it.

    However, as Eric points out, the sysctl only becomes available
    once the module is loaded, and then its too late.

    So we either have to move the sysctl to the core, or, alternatively,
    change conntrack to become active only once the rule set requires this.

    This does the latter, conntrack is only enabled when a rule needs it.

    Reported-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>

Посилання на весь комітет.

Як повернутися до очікуваної поведінки?

Після відключення ufw або очищення встановлених правил iptables створіть новий сеанс SSH. Він переживе наступне включення ufw, але може зазнати випадкового випадання в якийсь момент.

Цю проблему буде прийнято вгору за течією через відповідний список електронних повідомлень.

EDIT: потік електронної пошти вгору (містить обхід). Тут вирішено скопійоване:

echo 1 | sudo tee /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal

EDIT 2: запропонований патч вище за течією , про який я перевірив і повідомив.

EDIT 3: 2018.11.06: Це застопорилося вгору за течією, і я не встиг їх занурити. Я спробую незабаром повернутися до цього.

EDIT 4: 2019.03.17: Я не можу надійно відтворити цю проблему з ядром 5.0.


1
Проблема зберігається навіть із ядром 4.18-rc8. Існує взаємозв'язок між тим, чи виникне проблема чи ні, на основі того, чи черга до будь-якого сеансу ssh порожня чи ні. Ні, це пом'якшення не є рішенням. Мені потрібно більше часу.
Doug Smythies

1
Добре, дякую. Я маю внести деякі зміни у відповідь, але не знаю, коли. Тут є кілька питань. Я проходжу частину другого поділу ядра, пов'язаного лише з iptables. Я намагаюся усунути UFW з проблеми. Речі трохи заплутані (на мою думку), і інструмент conntrak в основному зламаний через перше знайдене я. Я піду вгору за течією, коли матиму достатньо деталей для цього.
Doug Smythies

1
@Gaia Якщо ви не призначите повноцінну суму, то Дуг отримає лише 50%, якщо є два голоси. Наразі є лише один підсумковий голос, тому я частково додаю ще одного для гарантії на 50%, але в основному тому, що це відмінна відповідь.
WinEunuuchs2Unix

1
@Gaia: Я можу лише припустити, що ваша проблема якимось чином пов’язана з деякими іншими правилами UFW. Я надіслав електронну пошту вгору (у них немає системи помилок), але я повністю усунув UFW і посилаюся лише на iptables. Оскільки я не перебуваю в цьому конкретному списку електронних повідомлень і ще не бачу його в архіві, я припускаю, що він використовується для модерації. Я надамо посилання, коли воно буде доступне.
Doug Smythies

1
@Gaia: Я не можу спекулювати. Все, що я знаю, - це лише правила ssh, включений UFW, а потім перезавантаження ssh-з'єднання працює нормально, принаймні для мене. Він випадає при наступному відключенні / включенні UFW.
Doug Smythies
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.