fall2ban은 DROP 블록 유형을 사용하지 않습니다.

fall2ban은 DROP 블록 유형을 사용하지 않습니다.

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을 지정해야 한다는 것입니다. 그렇지 않으면 작동하지 않습니다.

관련 정보