Docker 컨테이너에 iptables 방화벽 규칙을 올바르게 추가할 수 없습니다.

Docker 컨테이너에 iptables 방화벽 규칙을 올바르게 추가할 수 없습니다.

특정 IP만 허용하고 다른 IP는 거부하는 Docker 컨테이너용 방화벽을 만들고 싶습니다.

기본 설정은 다음과 같습니다.

$ sudo iptables --list
Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Docker 문서에 명시된 대로 이는 모든 수신 IP를 허용합니다. 그래서 이것을 수정하고 있습니다. 다음 명령을 실행했습니다.

sudo iptables -D DOCKER-USER -j RETURN
sudo iptables -A DOCKER-USER -s xx.xx.xx.xx,yy.yy.yy.yy -j ACCEPT
sudo iptables -A DOCKER-USER -j DROP

이것이 작동해야 합니다. 예상되는 결과는 zz.zz.zz.zz IP에서 서버에 액세스하려고 하면 거부되지만 xx.xx.xx.xx에서는 통과한다는 것입니다.

그러나 이제 xx.xx.xx.xx(또는 yy.yy.yy.yy) 또는 zz.zz.zz.zz에서 액세스하는지 여부에 따라 페이지에 "연결 실패"라는 메시지가 표시됩니다. 그래서 버려진 것 같습니다.

무슨 일이 일어나고 있는지, 이 문제의 원인이 무엇인지 모르겠습니다. 당신의 도움을 주셔서 감사합니다.

답변1

-i따라서 기본적으로 문제는 입력 네트워크 인터페이스 이름을 지정하기 위해 (--in-interface) 옵션 전달을 건너뛰기 때문입니다 .

왜 건너뛰었나요? 내 생각엔 다음과 같은 이유 때문인 것 같아:

  • Docker 공식 문서에는 -i퍼지 값이 있는 옵션이 언급되어 있습니다 ext_if. 이 오류의 첫 번째 이유는 ext_if인터넷 검색 등을 한 후에 이것이 무엇을 의미하는지 이해할 수 없습니다.
  • sudo iptables --list-i(또는 -o)로 지정된 값에 대한 정보를 표시하지 않습니다 . 그래서 이 옵션은 어차피 그다지 중요하지 않고 완전히 무시해도 된다고 생각합니다. (예를 들어 -v 옵션을 사용하여 옵션을 나열할 수 있습니다 sudo iptables --list DOCKER-USER -v.)

@AB 님의 댓글 덕분에 같은 문서를 다시 보고 처음부터 끝까지 다 시도해보며 해결책을 찾았습니다.

그래서 제가 실행하고 문제를 해결한 최종 명령 세트는 다음과 같습니다.

$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nameOfContainer # check the docker container's local ip e.g. 172.17.0.3

# assumes the docker container ip is 172.17.0.3, 
# the "internal" docker container port (e.g. "443" for "0.0.0.0:8122->443/tcp") you want to filter is 443, 
# the network interface (you can check with e.g. `ip addr`) is wlp2s0.

sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -j DROP
sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -s xx.xx.xx.xx -j ACCEPT
sudo iptables -I DOCKER-USER -i wlp2s0 -p tcp -m tcp --dport 443 -d 172.17.0.3 -s yy.yy.yy.0/24 -j ACCEPT

결과 목록은 다음과 같습니다.

$ sudo iptables --list DOCKER-USER -v
[sudo] password for user: 
Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination
   10   704 ACCEPT     tcp  --  wlp2s0 any     yy.yy.yy.0.static.xtom.com/24  172.17.0.3           tcp dpt:https
   20  1900 ACCEPT     tcp  --  wlp2s0 any     xx-xx-xx-xx.oo.oo.vectant.ne.jp  172.17.0.3           tcp dpt:https
   30  1760 DROP       tcp  --  wlp2s0 any     anywhere             172.17.0.3           tcp dpt:https
 145K   60M RETURN     all  --  any    any     anywhere             anywhere

답변2

기본 정책을 결정할 때 규칙 세트를 편집하고 "RETURN"을 "FORWARD"로 바꾸십시오.

인용하다:https://www.linuxtopia.org/Linux_Firewall_iptables/x4604.html

관련 정보