Docker 容器內的遠端埠轉發
我正在嘗試設置一個 docker 容器,用於繞過防火牆/NAT,以允許 SSH 訪問這些路由障礙後面的電腦。本質上,我有一個 SSH 服務在 docker 容器內監聽,我的其他電腦連接到該服務,打開反向 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
事實上,
ssh -ddd
在 docker 容器內執行,然後連接上面的行首先顯示: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 no-more-sessions@openssh.com 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
。謝謝!
啊哈!我想到了。這是因為
docker
正在為我的容器創建一個ipv6
內部網路,而我的核心沒有ipv6
啟用轉發。因此,當sshd
在容器外執行時,它可以正常工作ipv4
,但是當sshd
在 docker bridge 網路上的容器內執行時,它會監聽ipv6
並且無法打開埠轉發。一旦我啟用
ipv6
轉發,(添加net.ipv6.conf.all.forwarding = 1
並/etc/sysctl.conf
重新啟動)一切都開始正常工作。