결국.. 다시 여기로

저번에 Fail2Ban이 iptable vs nft 문제로 터지고 나서 2번의 시도 이후에 다시 iptables로 돌아왔다

그 뒤로도 nft가 문제가 많았음...
서버가 네트워크가 안되는걸 해결하면 컨테이너가 외부랑 통신을 못하는 ㅋㅋ
하.. 이상하다 싶었고 좀 더 찾아보니.. 도커 공식 홈페이지에서 아래와 같은 글을 볼 수 있었다

- Docker는 iptables-nft랑 iptables-legacy만 지원함
- Docker가 설치된 환경에서 nft는 지원되지 않음
- 아래가 원본 링크
https://docs.docker.com/engine/install/ubuntu/
Ubuntu
Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.
docs.docker.com
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 쓰지 말란거죠? 캭씨!!!!
아무튼 오늘은 서버를 iptables-nft 버전으로 전환하고 Fail2Ban과 호환되도록 세팅해보겠다
참고로 아래 순서대로 진행하면 서버 네트워크 규칙 같은 것들 전부 초기화되니 필요한 것들 (e.g. 포트, 네트워크 규칙, etc) 있으면 백업 필수!!
0. 기본 개념
- 일단 오늘 하는 과정에 대한 기본 개념을 정리하고 가자면 아래와 같다
1. 좋든 싫든 Ubuntu 22.04부터 nft가 디폴트가 되었다
- 좀 더 정확히는 커널의 netfilter는 nftables 엔진이 기본이 되었다는 의미
2. Docker는 nft랑 아직 친화적이지 못하다
3. 이 때 쓰는 것이 iptables-nft
4. iptables-nft는 iptables 명령을 쓰더라도 내부적으로 nft 규칙으로 변환해서 넣어줌
1. 현재 버전 확인
sudo iptables --version
- 여기서 iptables x.x.x (nf_tables) 면 진행할 필요 없다
- legacy는 진행하면 됨


2. iptables-nft 체제로 전환
sudo update-alternatives --set iptables /usr/sbin/iptables-nft
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-nft
sudo update-alternatives --set arptables /usr/sbin/arptables-nft
sudo update-alternatives --set ebtables /usr/sbin/ebtables-nft
- 위 명령어를 진행하고, 버전 확인하면 nf_tables가 떠야 정상이다
3. 도커 환경 체크
cat /etc/docker/daemon.json
- 아래처럼 세팅
{
"iptables": true,
"userland-proxy": false
}
4. 전체 초기화
- ufw, iptables, nftables 전부 초기화한다 (추후에 꼬이는 것 방지)
- 백업할게 있다면 미리 해두자!! (포트 열어둔 것 등등)
sudo ufw disable
sudo ufw reset
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -t raw -F
sudo iptables -t raw -X
sudo nft flush ruleset
5. 도커 재시작
- 이 시점에서 Docker가 nft 백엔드 기반으로 NAT/FORWARD 체인을 재생성한다
- 쉽게 말해 자기가 기록할 권한이 있는 노트를 만듦
sudo systemctl restart docker
6. UFW 재생성
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
7. Fail2Ban 재실행
- 여기서 Fail2Ban 컨테이너 껐다 키면 된다
- 참고로 컨테이너 옵션에 iptables 수정할 권한이 있어야함

- 'NET_ADMIN', 'NET_RAW' 두개 추가 필수
- 근데 아마 Fail2Ban을 연동해두셨었다면 하셨을 가능성 100%
- 혹시 모르겠다면 아래 글 참조
https://ratatou2.tistory.com/190#2.%20Docker%20Container로%20fail2ban을%20띄워보자-1-3
[서버 보안 시리즈 #2] 서버에 Fail2Ban 적용하기
찾았다.. 이 도둑놈시키오늘은 서버 보안 챙기기 시리즈 2번째, Fail2Ban을 적용해볼 것이다몹쓸 요청 보내는 이놈들을 박멸해보자0. 요약- 아래 글은 내가 삽질하며 배운 것들을 정리하고, 왜 그렇
ratatou2.tistory.com
8. 생성여부 확인
- Docker가 DOCKER와 DOCKER-USER chain을 생성했는지 체크하는 단계
sudo iptables -t nat -L DOCKER -n
sudo iptables -L DOCKER-USER -n
- 잘 생성됐으면 아래처럼 무언가 뜬다
- 참고로 뭐가 등록된게 없으면 아무것도 안 뜰 수도 있다 (나는 Fail2Ban 컨테이너 바로 띄워서 등록 했음)

번외
거의 열흘 내내 이 문제로 골머리 싸맸네..
중간에 일이 있어서 3일쯤 묻어두다가 어제 이렇게 안정화 시키고 포스팅으로 기록 해뒀다 휴..
다들 평안한 서버 생활되시길!
'Infra > DevOps' 카테고리의 다른 글
| 홈서버 4대로 쿠버네티스(Kubernetes, K8s) 구축하기 (0) | 2025.12.01 |
|---|---|
| Prometheus, Out of Bound 해결방법 (feat. 서버 시간 통일 & TSDB 초기화) (0) | 2025.11.28 |
| Fail2Ban, nftables 체제로 완전 전환하기 (feat. 눈물겨운 이유와 Ubuntu 22.04) (0) | 2025.11.15 |
| Fail2Ban 돌연사 사건 및 해결방법 (feat. 그지같은 nftables) (0) | 2025.11.15 |
| SSH 22번 포트 자동 복구 시스템 구축하기 (feat. 서버 잃고 뇌 약간 고치기 ㅠ) (0) | 2025.10.24 |
