저는 iptables 전문가가 아니며 수정해야 할 두 가지 이상한 동작이 있습니다!
질문 1: 왜 차단되지 않았나요?
f2b-nginx-naxsi
다음과 같은 iptable 규칙을 가진 사용자 정의 체인이 있습니다 .
$ sudo iptables -S f2b-nginx-naxsi
-N f2b-nginx-naxsi
-A f2b-nginx-naxsi -s 81.250.100.81/32 -j REJECT --reject-with icmp-port-unreachable #<== Here
-A f2b-nginx-naxsi -j RETURN
81.250.100.81
내 공개 IP이므로 차단되어야 합니다.
작동하지 않습니다. 규칙이 잘못되었습니다!
체인에서 체인을 로드하는 방법은 INPUT
다음과 같습니다.
sudo iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j f2b-nginx-naxsi #<== Here
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
-A INPUT -j INPUT_ZONES
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
질문 2: :80 대신 SSH를 사용하는 것이 차단되는 이유는 무엇입니까?
수리하기 위해질문 1나는 이전 규칙을 가져와 INPUT
체인 내부에 설정했습니다.
-I INPUT -s 81.250.100.81/32 -j REJECT --reject-with icmp-port-unreachable
Enter를 누른 후 기계 연결이 끊어졌습니다. 하하.
하지만 어떤 이유에서인지 브라우저에서 nginx를 계속 ping할 수 있습니다.
SSH(22)는 종료되지만 표준 http 연결(80)은 종료되지 않는 이유는 무엇입니까?
미리 감사드립니다.
;-)
답변1
문제 해결 단계:
다중 포트 iptables 모듈이 로드되었는지 확인합니다.
lsmod | grep multiport # Should see something like xt_multiport or ipt_multiport in the output
nginx 서버가 실제로 포트 80 및/또는 443에서 수신 대기하고 있는지 확인하세요. 이를 프록시 뒤에서 구성할 수 있습니다.
sudo ss -tlnp | grep nginx # Should see nginx listed listening on one of those two ports
(수정됨)
2b. Docker 호스트의 어떤 포트가 nginx 컨테이너에 매핑되어 있는지 확인하세요.
docker port <container_name>
This command should show which port(s) you need to use in your custom IPtables chain running on the container host.
답변2
드디어 수수께끼를 풀었습니다!
문제는 내 iptable 규칙을 무시하는 docker에서 발생합니다.
Docker 컨테이너로 들어오는 연결을 삭제하려면 이름이 지정된 체인에 규칙을 배치해야 합니다 DOCKER-USER
.
체인은 Docker 자체에 의해 생성되며 이러한 규칙은 Docker 엔진의 규칙보다 우선합니다.
예를 들어 특정 IP를 금지합니다.(예: Fail2ban에서)포트 443에서:
sudo iptables -I DOCKER-USER -i eth0 -s <SPECIFIC_IP> -p tcp --dport 443 -j DROP
( eth0
외부 인터페이스로 변경)
- 포트를 설정하는 것을 잊지 마십시오. 그렇지 않으면 규칙이 SSH 포트(22)에 적용될 수 있으며 자신이 금지됩니다...
INPUT
Docker 컨테이너에 대한 액세스를 차단하려고 하면 체인에 규칙을 추가할 수 없습니다.- 호출 체인은
DOCKER
Docker 콘텐츠에서만 작동합니다. 아무것도 넣지 마세요.