能够连接到 iptables 中打开的某些端口,而不能连接到其他端口

能够连接到 iptables 中打开的某些端口,而不能连接到其他端口

这是 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 守护进程(我确实需要它,不再需要),它现在可以工作了。

相关内容