이것은 아치 리눅스, 커널 4.18.0-rc3입니다.
다음 명령을 실행했습니다.
iptables -F
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# Allow local
iptables -A INPUT -i lo -j ACCEPT
# Allow services
iptables -A INPUT -p tcp -m tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -s 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8000 -s 192.168.0.0/24 -j ACCEPT
# Allow established
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
실행하면 iptables -nvL
다음이 생성됩니다.
Chain INPUT (policy DROP 2120 packets, 121K bytes)
pkts bytes target prot opt in out source destination
116 15649 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x3F
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
36 2432 ACCEPT tcp -- * * 192.168.0.0/24 0.0.0.0/0 tcp dpt:22
1 44 ACCEPT tcp -- * * 192.168.0.0/24 0.0.0.0/0 tcp dpt:53
4 160 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 132 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
0 0 ACCEPT tcp -- * * 192.168.0.0/24 0.0.0.0/0 tcp dpt:8000
내 생각에는 이것이 좋아 보인다. 자체적으로 추가되는 추가 도커 체인 중 일부를 생략했습니다. 그러나 네트워크의 다른 호스트에서 nmap하면 다음과 같은 결과가 나타납니다.
Host is up (0.0020s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE
22/tcp open ssh
53/tcp open domain
443/tcp closed https
MAC Address: D4:5D:DF:13:98:A5 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 4.89 seconds
그래서, 작동하지 않는 것
- 포트 80은 존재하지 않지만 ss는 포트가 수신 중이고 컬링할 수 있음을 보여줍니다. - docker에서 실행 중인 nginx
- 포트 53이 있고 ss는 수신 중이라고 표시하지만 자세히 알아볼 수 없으며 시간이 초과됩니다. dnsmasq가 docker에서 실행되고 있지 않습니다.
iptables 서비스를 중지하고 모든 것이 잘 진행되었지만 다음에 어떤 경로를 취해야 할지 확신할 수 없기 때문에 이것이 관련되어 있다고 가정합니다. 내가 놓친 조언이 있나요?
편집하다:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c91645b13e0 jenkins/jenkins:lts "/sbin/tini -- /usr/…" 11 hours ago Up 11 hours 8080/tcp, 50000/tcp jenkins_jenkins_1
be584769dae7 nginx:1 "nginx -g 'daemon of…" 11 hours ago Up 10 hours 0.0.0.0:80->80/tcp website_nginx_1
6fdc045ae863 mongo:3 "docker-entrypoint.s…" 36 hours ago Up 11 hours 27017/tcp wikijs_mongo_1
abf884b83aeb requarks/wiki "supervisord --nodae…" 36 hours ago Up 11 hours 3000/tcp wikijs_wiki_1
$ ss -tlan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 32 0.0.0.0:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
ESTAB 0 0 192.168.0.12:34196 192.168.0.209:8009
TIME-WAIT0 0 192.168.0.12%enp5s0:37082 138.201.81.199:80
ESTAB 0 0 192.168.0.12:58514 151.101.17.140:443
ESTAB 0 0 192.168.0.12:22 192.168.0.99:58500
ESTAB 0 0 192.168.0.12:34380 192.168.0.147:8009
ESTAB 0 0 172.19.0.1:59316 172.19.0.3:80
ESTAB 0 0 172.19.0.1:59304 172.19.0.3:80
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:4243 *:*
LISTEN 0 32 [::]:53 [::]:*
LISTEN 0 128 [::]:22 [::]:*
ESTAB 0 0 [::ffff:192.168.0.12]:80 [::ffff:192.168.0.99]:60214
ESTAB 0 0 [::ffff:192.168.0.12]:80 [::ffff:192.168.0.99]:60323
답변1
iptables는 TCP를 허용하지만 UDP는 허용하지 않기 때문에 DNS가 작동하지 않습니다. 이것은 매우 간단합니다. 나는 HTTP에 대해 잘 모르지만 기본적으로 docker 데몬은 다음과 같이 실행됩니다.
/usr/bin/dockerd -H fd://
TCP 포트에 도커 데몬을 노출하기 위해 이것을 다시 작성했습니다.
/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock
이것이 컨테이너 서비스가 실행되는 포트와 어떤 관련이 있는지 모르겠습니다. 그러나 docker 데몬을 노출하지 않음으로써(더 이상 필요하지 않지만) 이제 작동합니다.