我正在尝试设置一个 Docker 容器,用于绕过防火墙/NAT,以允许 SSH 访问这些路由屏障后面的计算机。实际上,我有一个在 Docker 容器内监听的 SSH 服务,我的其他计算机连接到该容器,打开反向 SSH 端口转发,然后如果我想连接到防火墙后面的计算机,我会在反向端口上连接到我的 Dockerized 代理服务器。示例:
受防火墙保护的计算机“Bob”连接到代理服务器:
ssh -R 2024:localhost:22 -N remote.server
接下来,我连接到远程服务器的端口,2024
以便沿着隧道返回并连接到localhost:22
bob:
ssh -p 2024 remote.server
当它不是 dockerized 时,这一切都运行良好,但是当我尝试将其移动到 dockerized 服务时,我发现sshd
docker 容器内的服务器顽固地拒绝打开远程端口转发。ssh -vvv
上面第一步中的连接给出:
...
debug1: Entering interactive session.
debug1: pledge: network
debug3: receive packet: type 4
debug1: Remote: Server has disabled port forwarding.
debug3: receive packet: type 82
debug1: remote forward failure for: listen 2024, connect localhost:22
Warning: remote port forwarding failed for listen port 2024
debug1: All remote forwarding requests processed
这听起来很像我的sshd
没有设置为允许远程端口转发。然而,我的sshd_config
似乎认为它是:
# tail /etc/ssh/sshd_config -n 5
GatewayPorts yes
AllowTcpForwarding yes
AllowStreamLocalForwarding yes
PermitTunnel yes
UsePrivilegeSeparation no
确实,在docker容器内部运行ssh -ddd
,然后连接上面的行首先显示:
debug3: /etc/ssh/sshd_config:91 setting GatewayPorts yes
debug3: /etc/ssh/sshd_config:92 setting AllowTcpForwarding yes
debug3: /etc/ssh/sshd_config:93 setting AllowStreamLocalForwarding yes
debug3: /etc/ssh/sshd_config:94 setting PermitTunnel yes
debug3: /etc/ssh/sshd_config:95 setting UsePrivilegeSeparation no
其次是:
debug1: server_input_global_request: rtype tcpip-forward want_reply 1
debug1: server_input_global_request: tcpip-forward listen localhost port 2024
debug1: server_input_global_request: rtype [email protected] want_reply 0
显然我的配置设置正确,但客户端似乎仍然认为服务器无法进行端口转发。我该如何说服 openssh 服务器执行远程转发?什么可能导致此故障?
客户端正在运行OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
,服务器正在运行OpenSSH_6.7p1 Debian-5+deb8u4
,docker 版本已17.09.1-ce
开启Amazon Linux 2017.09
。
谢谢!
答案1
啊哈!我明白了。这是因为docker
我正在为我的容器创建一个ipv6
内部网络,而我的内核没有ipv6
启用转发。因此,当sshd
在容器外运行时,它可以通过ipv4
,但当在容器内部的 docker bridge 网络上运行时sshd
,它会监听ipv6
并且无法打开端口转发。
一旦我启用ipv6
转发(添加net.ipv6.conf.all.forwarding = 1
并/etc/sysctl.conf
重新启动),一切都会开始正常工作。
答案2
您还可以尝试强制 sshd 使用 ipv4。在您的示例中,添加开关“-4”,如下所示:
ssh -4 -R 2024:localhost:22 -N remote.server
答案3
按照这些步骤帮助了我
- 安装
ssh
在容器上 - 使用以下方式启用服务
/etc/init.d/ssh start
- 运行
echo 'root:a-strong-password' | chpasswd
设置root密码 - 编辑/etc/ssh/sshd_config并设置
PermitRootLogin yes
- 然后
/etc/init.d/ssh restart
- 然后
ssh -fNTCR localhost:<YOUR-PORT>:localhost:22 remote-host
它进入后台,你可以通过以下方式查看ps aux | grep ssh
- 然后在远程主机我们可以登录
ssh -p <YOUR-PORT> localhost
- 要求密码并且你已经创建
屏幕主机
更多信息