UFW는 IPv4 및 IPv6에 22를 허용하지만 활성화시 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- 일반 # 31- 우분투
  • 우분투 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

추신 : 나는 이것이 문제를 "수정"할 것으로 기대하지는 않았지만 참조를 위해 SSHD가 청취하는 포트 (및 해당 규칙)를 변경했으며 문제가 지속됩니다.


따라서 방화벽을 껐다가 다시 켤 때 ssh 세션에서 일시적으로 중단되는 것을 제외하고는 모든 것이 제대로 작동합니까?
Bernard Wei

예, 순간적으로 연결이 끊어지고 다시 연결해야합니다. 그것은 단지 "정지"마구간
Gaia

ufw를 통한 활성화 / 비활성화는 재부팅 후에 만 ​​적용되므로 매우 이상합니다. systemctl status ufw를 사용하여 해당 명령이 실행될 때 여전히 실행 중인지 (또는 실행되고 있지 않은지) 확인할 수 있습니다.
Bernard Wei

2
이것은 커널 회귀 인 것으로 보이며 커널 4.13과 4.14 사이에 도입 된 것으로 보입니다. 나는 지금 커널 이분법을하고있다. 하루나 이틀이 걸립니다. 어떤 독자라도 이미 범인 커밋을 알고 있다면 시간을 낭비하지 않도록 여기에 게시하십시오.
Doug Smythies

1
아직 버그 번호가 없습니다. 저는 단지 커널 이분법을 마쳤습니다. 넷 필터 : conntrack : 필요하지 않은 경우 연결 추적을 사용하지 마십시오. 몇 시간 만 주시면 답변을 드리겠습니다.
Doug Smythies

답변:


9

문제의 배경과 한계 :

  • 이러한 ssh 허용 규칙이있는 UFW 또는 iptables가 활성화되고 ssh 세션이 시작된 경우에만 문제가 발생합니다. 즉, iptables없이 시작된 모든 SSH 세션은 정상적으로 작동하지만 규칙 세트가 설정되면 임의의 드롭 아웃이 발생할 수 있습니다.
  • 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

crippled ssh 세션 터미널에서 입력 한대로 PuTTY가 종료되기 전에 35 개의 유효하지 않은 패킷을 확인하십시오.

왜 이것이 작동을 멈췄습니까?

이것은 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 인 에이블에서는 살아남을 수 있지만 어느 시점에서 임의의 드롭 아웃이 발생할 수 있습니다.

이 문제는 관련 전자 메일 목록을 통해 어느 시점에 업스트림 처리됩니다.

편집 : 업스트림 전자 메일 스레드 (해결 방법 포함). 해결 방법은 여기에 복사되었습니다.

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

편집 2 : 업스트림 제안 된 패치 , 테스트하고 다시보고했습니다.

편집 3 : 2018.11.06 : 이것은 상류에서 멈 췄고, 나는 그들을 괴롭힐 시간이 없었습니다. 곧 다시 연락 드리겠습니다.

편집 4 : 2019.03.17 : 커널 5.0 에서이 문제를 안정적으로 재현 할 수 없습니다.


1
커널 4.18-rc8에서도 문제가 지속됩니다. ssh 세션에 대한 큐가 비어 있는지 여부에 따라 문제점이 발생하는지 여부에 관계가 있습니다. 아니요, 그 완화는 해결책이 아닙니다. 시간이 더 필요합니다.
Doug Smythies

1
알았어 고마워. 답변을 약간 변경해야하지만시기를 모릅니다. 여기에는 여러 가지 문제가 있습니다. 나는 iptables에만 관련된 두 번째 커널 bisection을 거치고 있습니다. 문제에서 UFW를 제거하려고합니다. 상황은 약간 혼란 (내 의견)이며 conntrak 도구는 내가 찾은 첫 번째 커밋으로 인해 기본적으로 손상됩니다. 세부 정보가 충분하면 업스트림으로 이동합니다.
Doug Smythies

1
@Gaia 당신은 그 덕는 그것의 50 %를 얻을 것이다 전체 현상금을 할당하지 않으면 경우 이 최대 - 투표가있다. 현재 하나의 투표권이 있으므로 50 % 현상금 보장을 위해 다른 것을 추가하고 있지만 대부분 훌륭한 답변입니다.
WinEunuuchs2Unix

1
@Gaia : 문제가 다른 UFW 규칙과 관련이 있다고 가정 할 수 있습니다. 업스트림 이메일을 보냈지 만 (버그 시스템이 없음) UFW를 완전히 제거하고 iptables 만 참조합니다. 특정 전자 메일 목록에없고 아직 보관 파일에서 볼 수 없으므로 검토 대기 중이라고 가정합니다. 사용 가능한 링크를 제공하겠습니다.
Doug Smythies

1
@Gaia : 나는 추측 할 수 없다. 내가 아는 전부는 ssh 규칙만으로 UFW를 활성화 한 다음 ssh 연결을 재부팅하면 적어도 나에게는 잘 작동한다는 것입니다. 후속 UFW 비활성화 / 활성화시 삭제됩니다.
Doug Smythies
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.