Ubuntu 20.04 LTS를 사용하면 /etc/fail2ban/jail.local에 다음이 있습니다.
[DEFAULT]
bantime = 3600
banaction = iptables
blocktype = drop
[sshd]
enabled = true
protocol = tcp
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
하지만 iptables 규칙을 나열하면 다음과 같습니다.
╰─# iptables -L f2b-sshd -n -v
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
13 1356 REJECT all -- * * 222.187.232.205 0.0.0.0/0 reject-with icmp-port-unreachable
18 1516 REJECT all -- * * 221.181.185.153 0.0.0.0/0 reject-with icmp-port-unreachable
17 1064 REJECT all -- * * 222.186.180.130 0.0.0.0/0 777 55854 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
문제는 DROP 대신 REJECT(ICMP 사용)를 사용한다는 것입니다.
action.d/iptables.conf에는 다음이 포함됩니다.
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
이는 이 OS 버전의 공식 fall2ban apt 패키지와 함께 제공되는 기본 iptables 작업 파일입니다.
또한 [sshd] 아래에 "blocktype=drop"을 추가하려고 시도했지만 효과가 없습니다.
Fail2ban 서비스는 실제 iptables 명령을 기록하지 않기 때문에 이를 디버깅하는 방법을 잘 모르겠습니다.
내가 무엇을 놓치고 있나요?
답변1
단일 감옥의 작업에 일부 매개변수를 제공하려면 action
모든 매개변수(일반적으로 의 기본 섹션에도 제공됨 jail.conf
)를 설정해야 합니다. 또는 금지 작업의 경우 다음과 같은 것을 사용할 수 있습니다.
[some_jail]
banaction = %(known/banaction)s[blocktype=DROP]
DROP 대 REJECT라는 주제와 관련하여 논의는 넷 필터 하위 시스템 자체만큼 오래되었으며 양쪽 모두에 대한 많은 장단점이 있습니다.
금지 문제와 관련하여 다음을 참조하세요.https://github.com/fail2ban/fail2ban/issues/2217#issuecomment-423248516자세한 내용은.
답변2
@sebres의 솔루션을 수락했지만 몇 가지 문제를 추가하고 싶습니다.
iptables-allports 금지의 경우 거부 블록 유형 내부에 공백이 있을 수 있습니다. 그 말을 인용해야 합니다.
예:
[sshd]
banaction=iptables-allports[blocktype="REJECT --reject-with icmp-port-unreachable"]
두 번째로 흥미로운 점은 banaction과 감옥 구성 모두 "protocol"이라는 매개변수를 가지고 있다는 것입니다. 아래 구성에서 오류가 발생하지 않지만 UDP 요청을 차단하지 않았을 때 처음 혼란스러웠습니다.
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
감옥에서 프로토콜=모든 설정이 누락되었기 때문에 이런 일이 일어났습니다. 감옥 수준에서 프로토콜=all을 지정해야 합니다.
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
protocol=all
그 이유는 명명된-ddos 섹션이 iptables에 새 체인을 생성하고 금지된 IP가 해당 체인 내부에 규칙을 생성하기 때문입니다. 감옥 수준에서 프로토콜=all을 지정하지 않으면 체인은 다음과 같이 정의됩니다.
Chain INPUT (policy DROP 22 packets, 952 bytes)
pkts bytes target prot opt in out source destination
1371 229K named-ddos tcp -- * * 0.0.0.0/0 0.0.0.0/0
금지 조치로 인해 proto=all 규칙이 생성된다는 것은 사실입니다.체인 내부, 그러나 체인 자체는 TCP가 아닌 패킷에는 사용되지 않습니다. 결론은 감옥 수준과 금지(지원하는 경우) 모두에서 프로토콜=all을 지정해야 한다는 것입니다. 그렇지 않으면 작동하지 않습니다.