Nginx를 향한 공개가 있다고 가정 해 봅시다.역방향 프록시다운스트림 웹 서비스(B)로 트래픽을 보내는 컨테이너(A). 이 A 컨테이너는 TLS 연결이 종료되는 곳입니다. 도커 서버는반품외부 역방향 프록시 서비스 뒤에 있습니다. 그래요성공적으로전달 헤더에서 실제 IP를 추출하고 기록하는 기능. 괜찮아요.
실제 IP에서 컨테이너 A에서 나가는 트래픽을 감옥(예: DROP)으로 설정하려면 어떻게 Fail2ban 작업을 구성합니까? 다운스트림 웹 서비스 B에는 실제 IP가 포함된 XFF 헤더가 표시됩니다.
이것이 내 iptables가 지금 하고 있는 일입니다( iptables -nL
):
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-auth-fail tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0
DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (2 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.20.128.1 tcp dpt:443
ACCEPT tcp -- 0.0.0.0/0 172.20.128.1 tcp dpt:80
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0
DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-auth-fail (1 references)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 STRING match "X-Forwarded-For: 184.75.215.178" ALGO name bm TO 65535
RETURN all -- 0.0.0.0/0 0.0.0.0/0
보시다시피, 패킷을 XFF 문자열과 일치시켜 보았는데, IP 주소는 프록시 서버가 아닌 실제 IP입니다.
어쩌면 INPUT 체인이 범인일까요?
나의 주요 활동은 다음과 같습니다.
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I <chain> -p <protocol> --dport <port> -j fail2ban-<name>
actionban = iptables -I fail2ban-<name> 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j DROP
답변1
이봐https://github.com/fail2ban/fail2ban/issues/2292
규칙을 넣거나 fail2ban
( 저처럼) 규칙을 복제하도록 구성해야 합니다 . 하나는 기본 체인을 사용하여 호스트를 보호하고 다른 하나는 노출된 도커 컨테이너를 보호하기 위한 것입니다.iptables
chain
DOCKER-USER
답변2
이는 비슷한 문제를 해결하는 데 도움이 되었습니다. Crowdsec 또는 failure2ban을 설정하는 경우:
그룹 제어:
sudo iptables -I FORWARD -m set --match-set crowdsec-blacklists src -j DROP
Fail2ban과 비슷한 것:
sudo iptables -I FORWARD 1 -p tcp -j f2b-HTTPS
실제로 Fail2ban의 iptables에는 자체 "대상"이 있으며 다음을 사용하여 찾을 수 있습니다.
sudo iptables -L | grep f2b
Docker 규칙에 도달하기 전에 요청을 거부(모든 요청 허용)하는 iptables의 Docker 규칙 앞에 항목을 배치합니다.