稍微遇到看上去有些奇怪的 bug 了。
前几天自己用 docker 搭了个 gogs 服务给团队里的人用,安装时过程顺利,如下是 docker 容器的端口转发:
yudachi@hostker:~$ sudo docker container port ydcgit
22/tcp -> 0.0.0.0:22
3000/tcp -> 0.0.0.0:60003
其中 22 端口是用于 ssh 的,而 60003 用于 nginx 反代到其中一个虚拟主机上。
然后我配置了下 iptables,允许 22 端口入站,然而策略并没有生效。
如下是 iptables 配置:
yudachi@hostker:~$ sudo iptables -L -v -n
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
378 469K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
546 63053 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT all -- * * 127.0.0.1 0.0.0.0/0 state NEW
0 0 ACCEPT all -- * * 172.16.0.0/16 0.0.0.0/0 state NEW
0 0 ACCEPT all -- * * 172.17.0.0/16 0.0.0.0/0 state NEW
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state NEW
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:22 state NEW
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:<服务器的实际 ssh 端口> state NEW
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:<服务器的实际 ssh 端口> state NEW
2 120 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:80 state NEW
7 400 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 state NEW
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:443 state NEW
0 0 invalid_drop all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
14 1092 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 PKTTYPE = broadcast
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 PKTTYPE = multicast
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x01
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x03/0x03
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x06
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x05/0x05
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x29
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x3F
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x3F
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x11/0x01
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x18/0x08
0 0 portscan_drop tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x30/0x20
13 564 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4
13 564 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 29 packets, 1622 bytes)
pkts bytes target prot opt in out source destination
378 469K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
383 138K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 invalid_drop all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
Chain invalid_drop (2 references)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix "INVALID PACKAGE"
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
Chain portscan_drop (11 references)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix "PORTSCAN DETECTED"
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
而下面是本人在本机测试的结果:
λ ssh git@<服务器地址>
ssh: connect to host <服务器地址> port 22: Connection timed out
我稍微有点不能理解,端口号是正确的,配置时自我确定没有任何问题,为何这个规则并没有生效?
刚才还尝试 Google 了相关关键词,暂时还没有找到自己想要的结果,想在此问问各位大触有什么解决方案?
谢谢!
1
wdd2007 2017-05-15 20:32:04 +08:00
service iptables save、service iptables restart 了么?
|
2
DoraJDJ OP @wdd2007 iptables 已经重启很多次了,包括整个系统,甚至连 iptables 规则从头弄了一遍,仍然不行
|
3
tlday 2017-05-15 21:15:27 +08:00 via Android
看看 log,确定是入站还是出站的问题? sshd 进程的状态?不是很懂 iptables 输出的这个东西,只了解一点 iptables 的命令,无责任建议。
|
4
shshilmh 2017-05-15 21:31:46 +08:00
这个 22 是宿主机的端口还是容器的端口?
|
5
cnnblike 2017-05-15 21:50:36 +08:00 via iPhone
selinux 的问题? setenforce 0 试试
|
6
DoraJDJ OP |
7
DoraJDJ OP @cnnblike 拒绝无脑关闭 SELinux。
防火墙关闭的时候可以正常连接 22 端口,所以我可以确定与 SELinux 无关。 另外,系统用的是 Ubuntu Server 16.04.2 LTS。 |
8
cnnblike 2017-05-15 21:52:20 +08:00 via iPhone
22 会不会和默认的 ssh 端口冲突? service sshd stop 试试
|
10
cnnblike 2017-05-15 21:53:45 +08:00 via iPhone
@DoraJDJ 所以我才让你 setenforce 0 啊,重启一下不就开了么?这是在排障,先确定问题在哪里再说
|
11
ryd994 2017-05-15 22:09:35 +08:00
不需要设置入站,docker 是从 bridge 走,算 FORWARD,你设置 publish 就行了
你的问题是 docker 会有个占端口用的进程,有 selinux 的情况下可能占不到 22 你可以试试 dockerd 加--userland-proxy=false |
12
ryd994 2017-05-15 22:11:16 +08:00
你这 iptables 看起来就不对:FORWARD DROP,也没有 DOCKER chain
你先重启一下 docker 服务 |
13
DoraJDJ OP |
15
shshilmh 2017-05-15 22:54:17 +08:00
|
16
tlday 2017-05-16 10:04:53 +08:00
@ryd994 经提醒突然发现 docker 的-p/-P 参数映射的端口原来也是走 bridge 网络的端口转发。我一直以为是本地直接作映射的。也就是说即使使用-p 参数映射端口,这个数据报实际上的路径也是
外网->eth0->docker0->bridge->container 而不是 外网->eth0->container 的咯? |