Docker 容器内的远程端口转发

Docker 容器内的远程端口转发

我正在尝试设置一个 Docker 容器,用于绕过防火墙/NAT,以允许 SSH 访问这些路由屏障后面的计算机。实际上,我有一个在 Docker 容器内监听的 SSH 服务,我的其他计算机连接到该容器,打开反向 SSH 端口转发,然后如果我想连接到防火墙后面的计算机,我会在反向端口上连接到我的 Dockerized 代理服务器。示例:

受防火墙保护的计算机“Bob”连接到代理服务器:

ssh -R 2024:localhost:22 -N remote.server

接下来,我连接到远程服务器的端口,2024以便沿着隧道返回并连接到localhost:22bob:

ssh -p 2024 remote.server

当它不是 dockerized 时,这一切都运行良好,但是当我尝试将其移动到 dockerized 服务时,我发现sshddocker 容器内的服务器顽固地拒绝打开远程端口转发。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
  • 要求密码并且你已经创建

屏幕主机

在此处输入图片描述


更多信息

  1. 如何以 root 或非 root 用户身份远程 ssh 进入 docker 容器

相关内容