Etc/Linux

우분투 20.04 fail2ban 설정(ssh 패스워드 오류 시 Ban)

곤프 2021. 4. 26. 16:17

집에 있는 서버를 사용할 때는 ssh 에 접속하는 22번 포트를 다른 포트 번호로 바꿔서 쓰거나 공유기의 포트포워딩으로 외부 1022번 포트를 내부 22번으로 연결해서 사용하거나 해서 딱히 외부에서 ssh로 무작위 대입 공격 같은건 당하지 않았다.
지금 쓰고 있는 오라클 클라우드 서버에서는 포트포워딩이 되는지도 모르겠고, 방화벽 문제도 있고 해서 ssh 디폴트값인 22번 포트를 사용하고 있는데, 얼마나 많이들 들어오는지… fail2ban을 설치하고 보니 3일 동안 밴한 IP가 천개는 가뿐히 넘었다.
방화벽을 기본 iptables 를 사용하고 있다보니, 밴한 IP 가 전부 iptables 에 저장되어서, iptables 건드리려고 하면 너무 양이 많아서 곤란해졌다.

iptables 가 비대해지면 속도도 느려지고 하니, ipset 을 설치해서 여러 IP를 세트로 묶어서 밴하도록 하자.

먼저 ipset 을 설치

 

sudo apt install ipset

fail2ban 을 설치안했으면 설치하자.

 

sudo apt install fail2ban

jail.conf 파일을 편집

 

vim nano /etc/fail2ban/jail.conf

jail.local 파일에 아래 빨간색 내용을 쓴다.

 

[sshd]

maxretry =5
port = ssh, 20022

banaction = iptables-ipset-proto6

banaction_allports = iptables-ipset-proto6-allports

[sshd] 는 ssh 접속에 한해서 적용되는 내용이다.

 

ipset을 사용해서 iptable로 밴을 하기 위해서 설정하는 것이 banaction 이다.
우분투 18.04 에서 ipset 을 설치하면 ipset -V 명령을 실행하면 표시 되는 프로토콜 버전이 6이기 때문에 iptables-ipset-proto6 을 사용한다. 우분투의 다른 버전이나 다른 리눅스 배포판을 사용하고 있으면 프로토콜 버전을 확인하고 설정하자. (6 이외에는 4 버전이 있다.)
banaction_allports 는 말그대로 모든 포트를 밴해버리는 설정인데, 딱히 다른 곳에서 저걸 사용하도록 설정하지 않는 이상 사용하진 않을 것이다.

jail.conf 파일 저장 후 fail2ban 서비스를 재기동

 

sudo service fail2ban restart

기존에 iptables 에 밴 되어있는 IP가 있었다면 모두 ipset 에 옮겨서 저장되고, iptables 내용을 확인해 보면.

 

sudo iptables -L

iptables 에는 아래와 같이 한줄만 들어가있다.

 

REJECT     tcp  --  anywhere             anywhere             multiport dports ssh,20022 match-set f2b-sshd src reject-with icmp-port-unreachable

밴 당한 IP 들은 모두 ipset 에 f2b-sshd 라는 세트로 저장되어 있다. 아래 커맨드로 ipset 에 저장된 내용을 전부 확인 가능.

 

sudo ipset list

sas@3:/etc/fail2ban# sudo ipset list
Name: f2b-sshd
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 timeout 600
Size in memory: 296
References: 1
Number of entries: 1
Members:
36.152.64.18 timeout 85794