web-dev-qa-db-ja.com

Dockerコンテナー内のリモートポート転送

これらのルーティングバリアの背後にあるコンピューターへのSSHアクセスを許可するためにファイアウォール/ NATをバイパスするために使用するDockerコンテナーをセットアップしようとしています。本質的に、私は他のコンピューターが接続するdockerコンテナー内でリッスンするSSHサービスを使用しており、リバースSSHポート転送を開いており、ファイアウォールの背後にあるコンピューターに接続する場合は、代わりにdockerizedに接続しますリバースポート上のプロキシサーバー。例:

ファイアウォールで保護されたコンピュータ「ボブ」はプロキシサーバーに接続します。

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

次に、ポート2024でリモートサーバーに接続し、トンネルをたどり、bobのlocalhost:22に接続します。

ssh -p 2024 remote.server

Docker化されていない場合、これはすべてうまく機能しますが、Docker化されたサービスに移動しようとすると、Dockerコンテナ内のsshdサーバーが頑固にリモートポートフォワードを開くことを拒否することがわかりました。上記の最初のステップで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 on Amazon Linux 2017.09です。

ありがとう!

4
staticfloat

ああ!私はそれを考え出した。これは、dockeripv6コンテナの内部ネットワーク、およびカーネルにipv6転送が有効になっています。そのため、コンテナの外でsshdを実行すると、ipv4ですが、Docker Bridgeネットワークのコンテナ内でsshdを実行すると、ipv6およびポート転送を開くことができません。

有効にしたらipv6転送、(追加net.ipv6.conf.all.forwarding = 1/etc/sysctl.confおよび再起動)すべてが正常に機能し始めます。

2
staticfloat

Sshdにipv4の使用を強制することもできます。あなたの例では、次のようにスイッチ「-4」を追加します:

ssh -4 -R 2024:localhost:22 -N remote.server
0
Josh Matthews