iptables는 SSH 연결을 차단합니다.

iptables는 SSH 연결을 차단합니다.

최근에 Raspberry Pi를 Raspbian 8(Jessie)에서 9(Stretch)로 업그레이드했습니다. Pi는 IPv4 및 IPv6를 통해 내 LAN에서 액세스할 수 있습니다. SSH를 통해 여러 번 인증할 수 없는 호스트를 차단하기 위해 일부 iptables 규칙(IPv4만 해당)을 적용했습니다. 현재 IPv6에 대한 iptables 규칙은 없습니다.

하지만 이제 여러 번 연결을 시도하면 iptables(IPv4)가 내 워크스테이션에서 Pi로의 SSH 연결을 차단합니다. 구체적으로 말하자면, IPv4를 통해 첫 번째 SSH 세션을 성공적으로 열 수 있지만 동시에 다른 세션을 열려고 하면 잠깁니다. 그런 다음 IPv6를 통해서만 연결할 수 있거나 차단 시간(10분)이 끝날 때까지 기다려야 합니다.

지금까지 이 문제의 원인을 찾지 못했습니다. iptables는 "iptables return"이라는 키워드를 사용하여 syslog에 실패한 모든 연결 시도를 기록함으로써 설정됩니다. 다음과 같이 SSH 포트에서 연결이 실패한 것을 볼 수 있습니다.

$ tail -f syslog | grep "iptables denied" | grep "DPT=22"
Mar 29 15:39:45 raspberry kernel: [  179.988501] iptables denied: IN=wlan0 OUT= MAC=b8:27:eb:16:b3:1d:e4:b3:18:e3:47:f7:08:00 SRC=192.168.133.51 DST=192.168.133.50 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=32145 DF PROTO=TCP SPT=58723 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0

iptables의 규칙 세트는 다음과 같습니다.

$ cat rules.v4
# Generated by iptables-save v1.6.0 on Mon Mar 26 22:54:58 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:LOG_AND_DROP - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --mask 255.255.255.255 --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 4 --name DEFAULT --mask 255.255.255.255 --rsource -j LOG_AND_DROP
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -s 192.168.133.0/24 -p igmp -m addrtype --dst-type MULTICAST -j ACCEPT
-A INPUT -s 192.168.133.1/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.133.0/24 -p udp -m udp --dport 137:138 -m addrtype --dst-type BROADCAST -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
-A LOG_AND_DROP -j LOG --log-prefix "iptables denied: " --log-level 7
-A LOG_AND_DROP -j DROP
COMMIT
# Completed on Mon Mar 26 22:54:58 2018

원하신다면 성공적인 SSH 세션(최대 디버깅 자세한 정도 "-vvv")의 전체 로그와 디버깅에 도움이 되는 경우 실패한 연결 시도를 제공할 수 있습니다.

답변1

ipv4 iptables 규칙에 따라 10분당 4개의 연결을 허용해야 합니다.

당신은 오직 하나의 연결, 당신이 직접 시도한 연결만을 기대합니다. 그러나 다른 연결 시도는 포트 22(포트 스캔의 매우 일반적인 대상)를 공격할 수 있습니다. Raspberry Pi의 인터페이스 wlan0에 공개 ipv4 주소가 노출되어 있습니까?

답변2

iptables hashlimit 모듈 또는 Google "iptables 속도 제한 소스 주소"를 참조하세요.

좀 더 구체적으로 예를 찾았습니다.

iptables -I INPUT -m hashlimit -m tcp -p tcp --dport 80 --hashlimit-above 20/sec --hashlimit-mode srcip --hashlimit-name http -m state --state NEW -j DROP 

포트, 요금 등에 맞게 사용자 정의됩니다.

또는 fall2ban을 사용하면 정말 좋은 솔루션일 수 있습니다. SSH에만 사용하지만 "실패한 로그인 횟수"로 다른 리소스를 보호하므로 합법적인 로그인으로 속도 제한을 초과하지 않습니다. 비표준 포트에서 작동하려면 구성을 사용자 정의해야 할 수도 있습니다. :)

관련 정보