특정 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