
这是 arch linux,内核 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
我认为这看起来不错,我省略了一些它自己添加的额外的 docker 链。但是如果我从网络上的另一台主机进行 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 显示它正在监听,我可以卷曲到它 - nginx 在 docker 中运行
- 端口 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
DNS 不工作是因为 iptables 允许 TCP 而不是 UDP。这很简单。 HTTP 我了解的有点少,但默认情况下 docker 守护进程运行为:
/usr/bin/dockerd -H fd://
我重写了这个以在 TCP 端口上公开 docker 守护进程
/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock
我不知道这与容器服务运行的端口有什么关系。但通过不暴露 docker 守护进程(我确实需要它,不再需要),它现在可以工作了。