Fail2Ban, nftables 체제로 완전 전환하기 (feat. 눈물겨운 이유와 Ubuntu 22.04)

2025. 11. 15. 21:15·Infra/DevOps

결국 nft로 전환하게 되었네요...

이러면 내가 어제 새벽까지한 똥X쇼는 대체 무슨 의미가 있었던 것일까..
Fail2Ban : 대우 이따위면 나 일 못한다고 해찌!!!!

어제 포스팅 이후 Fail2Ban의 filter와 jail 업데이트를 진행했다

10초 내에 5번 이상 404를 유도하는 요청은 누가봐도 이상하다 싶어서 벤하려고 filter와 jail을 새로 작성했더니 새로운 filter와 jail을 받아들이지 못하는 로그를 확인

결국 확인해보니 Ubuntu 22.04의 기본 세팅과 Docker는 iptables를 사용하고, fail2ban의 컨테이너 내부에서는 nft를 사용하는 상황;;;

fail2ban 컨테이너만 여전히 nftables 사용 중;;;

걍 이해가 안되는 상황이었음

분명 저는 새벽 4시까지 이 문제랑 씨름을 하다가 정리까지 다하고 잤답니다?

나는 'iptables --version' 결과가 iptables니까 '컨테이너 iptables' 결과도 똑같겠거니 했는데 찾아보니 그냥 다른거란다

컨테이너 내부의 iptables는 호스트 커널의 netfilter backend에 직접 연결되니 변경의 여지가 없음

 

이 과정과 내가 이해한 바를 쉽게 요약, 정리하면 아래 내용으로 요약할 수 있다

개그지같.. 읍읍
더보기

- 그러니까 내가 이해한 바를 정리해보면 

 

1) 일단 커널 단의 nft 세팅은 변경할 수 없다 

- 우분투 22.04 ~ 우분투 24.04부터는 nft가 디폴트로 세팅되어서 그러하다 

- 물론 환경설정을 변경해서 Ubuntu 기반의 디폴트를 iptable로 세팅할 수는 있다 

- But, 커널에 새겨진 디폴트(nft)가 변경된 것은 아님 

 

2) 도커의 컨테이너는 커널 단을 따라가니까 nft 세팅을 디폴트로 따라간다 

- 이것은 환경설정을 변경해서 수정할 수 있는 바가 아니기 때문임

- 이것이 Fail2Ban 컨테이너 내부에서 여전히 nft를 사용하고 있던 이유

- 그렇기 때문에 Fail2Ban을 로컬에 설치하면 환경설정을 따라가게 하여 lagacy를 사용할 수 있다 

(로컬에 설치되면 root 권한도 얻게 되고 환경설정을 직접 읽을 수 있으니 iptable로 생성된다)

 

3) 결국 이 상황에서 컨테이너를 유지하고 iptalbe 체제를 유지하고 싶다면 커널을 직접 커스텀해야 한다 

- 근데 사실상 리스크가 굉장히 크다 

- 위 과정이 단순히 커널을 '직접 빌드'가 아니라 nf_tables를 비활성화하고 ip_tables를 메인 backend로 빌드해야 하기 때문! 

- 이건 아래와 같은 주의사항을 동반함 

(1) Ubuntu 커널 패키징을 깨야하고 

(2) 보안 업데이트 전체 불가능 

(3) Docker 호환성 잃음 

(4) netfilter 전반 불안정해짐 

 

사실상 커널 커스텀 테스트용이지 실제 서비스를 돌릴 서버에서 직접 해볼만한 것은 아니라는 것이다


fail2ban을 로컬에 깔자니 컨테이너로만 돌리고 싶었던 내 상황에는 맘에드는 결정은 아닌지라 체제 전환을 선언...

ㅎㅎㅎ...


2025.11.24 최신화

- 저는 아래 방법으로 해결했습니다..!

https://ratatou2.tistory.com/303

 

Fail2Ban, 다시 iptables-nft 체제로 전환하기 (feat. 3트 후 최최최종ver)

결국.. 다시 여기로저번에 Fail2Ban이 iptable vs nft 문제로 터지고 나서 2번의 시도 이후에 다시 iptables로 돌아왔다그 뒤로도 nft가 문제가 많았음...서버가 네트워크가 안되는걸 해결하면 컨테이너가

ratatou2.tistory.com


1. nft로 체제 전환

sudo update-alternatives --set iptables /usr/sbin/iptables-nft
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-nft


2. 체제 전환 결과 확인

# 명령어
sudo iptables --version
  
#출력 예시
# iptables v1.8.x (nf_tables)

3. 기존 iptables 규칙 초기화

- 이 부분은 패스하셔도 됩니다!! (리스크 있음!!!)

- 나는 단순히 어제 어차피 한번 다 밀었었으니 싹다 처리하자 싶어서 진행한 부분


DOCKER-USER 체인 등 기존 ruleset 을 모두 지우는 명령어

sudo iptables -F
sudo iptables -t nat -F
sudo iptables -X

Docker 체인 삭제

- 이걸해도 나중에 자동으로 재생성되므로 비교적 안전한 명령어

sudo iptables -F DOCKER-USER || true
sudo iptables -X DOCKER-USER || true

4. nftables 기본 테이블/체인 확인

- 뭐 이거는 없어도 Ubuntu 22.04~부터는 자동으로 생성한다니까 아무것도 안떠도 괜찮다

- 나도 다 끝나고 나서 생겼음


5. Docker 의 DOCKER-USER 체인이 nft 에 생성되었는지 확인

sudo nft list chain inet filter DOCKER-USER

- 없으면 아래 명령어로 생성

sudo nft add chain inet filter DOCKER-USER '{ type filter hook forward priority 0; }'

- 이것도 나중에 Docker가 자동으로 재생성한다니 일단 패스하셔도 될듯하다 (난 해줬음)


6. action.d 생성 or 수정

- action.d/nftables-docker.conf 이란 이름의 파일 하나 만들어서 아래 내용 입력해주었음

[Definition]

# Docker 환경에서 nftables set 기반 차단

actionstart = nft add set inet filter f2b-<name> { type ipv4_addr; flags interval; }
              nft insert rule inet filter DOCKER-USER ip saddr @f2b-<name> drop

actionstop  = nft delete rule inet filter DOCKER-USER ip saddr @f2b-<name> drop
              nft flush set inet filter f2b-<name>
              nft delete set inet filter f2b-<name>

actionban   = nft add element inet filter f2b-<name> { <ip> }

actionunban = nft delete element inet filter f2b-<name> { <ip> }

[Init]
table = inet filter

- 아래는 기존의 iptables action이었는데 이걸 그냥 위의 nft 형태로 변환만 해주었다

- 어차피 iptables에 등록하던걸 nft에 등록하는 내용이라 명령어만 다르다

[Definition]
  actionstart = iptables -N f2b-<name>
                iptables -I DOCKER-USER -j f2b-<name>
  actionstop = iptables -D DOCKER-USER -j f2b-<name>
               iptables -F f2b-<name>
               iptables -X f2b-<name>
  actionban = iptables -I f2b-<name> 1 -s <ip> -j DROP
  actionunban = iptables -D f2b-<name> -s <ip> -j DROP

7. Fail2Ban jail들을 nft action으로 모두 전환

- 결정적으로 달라진 것은 'iptables-docker.conf'를 'nftables-docker.conf'로 바꿨기 때문에 action명을 바꿔주는 것이다

- 아래는 실제로 쓰고 있는 nginx-404.conf 예시

저기(빨간 네모칸)를 action 이름에 맞춰 수정하면 된다!

[nginx-404]
enabled  = true
filter   = nginx-404
logpath  = /var/log/nginx/access.log
maxretry = 5
findtime = 10
bantime = -1
action   = nftables-docker[name=nginx-404, port="http,https", protocol=tcp, chain=DOCKER-USER]
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/24

8. Fail2Ban 재실행

# 재실행
docker restart fail2ban

# 껐다 켜도 된다
docker compose down
docker compose up -d

9. 잘 적용되었는지 확인

1) 컨테이너 로그

- 일단 컨테이너 로그 보는게 제일 확실하긴 했다

docker logs -f fail2ban

- 기존에 뭐만하면 터지던 놈들이 이젠 곧 잘 적용된 모습


2) nft rule 생성 확인

- nft에서 규칙 잘 생성됐는지 확인하는 명령어

sudo nft list chain inet filter DOCKER-USER

- 내가 적용한 3가지 필터가 잘 적용되어 있는 것을 확인할 수 있었다

- 아래처럼 응용하면 해당 필터에 어떤 IP들이 차단 되었는지도 확인 가능

# 템플릿
sudo nft list set inet filter <필터 이름>

# 예시 
sudo nft list set inet filter f2b-nginx-404

'nginx-404' jail에 의해 차단된 IP 목록(IP set) 을 조회 (아직 없음)
'nginx-badbots-access' jail에 의해 차단된 IP 목록(IP set) 을 조회 (꽤 잡힘!)


번외

결국 어제 적었던 대로 기어이 전환을 해버렸네요...

그래 어차피 언젠가 할거 신경쓰이는 거 줄여버렸으니 오히려 럭키비키라고 생각해버리면 되는 것임!! 개꿀!!

어쩌면 미리 점쳤던 것일지도..

 

반응형

'Infra > DevOps' 카테고리의 다른 글

Prometheus, Out of Bound 해결방법 (feat. 서버 시간 통일 & TSDB 초기화)  (0) 2025.11.28
Fail2Ban, 다시 iptables-nft 체제로 전환하기 (feat. 최최최종ver)  (0) 2025.11.24
Fail2Ban 돌연사 사건 및 해결방법 (feat. 그지같은 nftables)  (0) 2025.11.15
SSH 22번 포트 자동 복구 시스템 구축하기 (feat. 서버 잃고 뇌 약간 고치기 ㅠ)  (0) 2025.10.24
나만의 VPN 서버 만들기 (feat. 홈서버 + WireGuard)  (4) 2025.10.23
'Infra/DevOps' 카테고리의 다른 글
  • Prometheus, Out of Bound 해결방법 (feat. 서버 시간 통일 & TSDB 초기화)
  • Fail2Ban, 다시 iptables-nft 체제로 전환하기 (feat. 최최최종ver)
  • Fail2Ban 돌연사 사건 및 해결방법 (feat. 그지같은 nftables)
  • SSH 22번 포트 자동 복구 시스템 구축하기 (feat. 서버 잃고 뇌 약간 고치기 ㅠ)
Ratatou2
Ratatou2
온갖 정보들을 기록해두는 메모보드 블로그
  • Ratatou2
    nak-z
    · Ratatou2 ·
  • 전체
    오늘
    어제
  • 공지사항

    • 블로그 이전 진행 중 (24.11.25 ~)
    • 분류 전체보기 (303) N
      • OS (89) N
        • Linux (39)
        • Window (24)
        • Mac (21) N
        • Android (5)
      • Infra (83) N
        • DevOps (38) N
        • Docker (14)
        • Jenkins (9)
        • n8n (13)
        • Nextcloud (8)
        • Rasberry Pi (1)
      • Dev (17)
        • JAVA (7)
        • Python (1)
        • DB (3)
        • Vue (2)
        • AI (4)
        • Git (0)
      • Tools (10)
      • Study (69)
        • Algorithm (66)
        • CS (3)
      • Game (10)
        • Project Zomboid (9)
        • Don't Starve Together (1)
      • etc (24)
        • Temp (0)
      • 개발 외 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Ratatou2
Fail2Ban, nftables 체제로 완전 전환하기 (feat. 눈물겨운 이유와 Ubuntu 22.04)
상단으로

티스토리툴바