Penerusan port jarak jauh di dalam kontainer Docker

Saya mencoba menyiapkan wadah buruh pelabuhan yang saya gunakan untuk melewati firewall/NAT untuk memungkinkan akses SSH ke komputer di balik hambatan perutean ini. Intinya, saya memiliki layanan SSH yang mendengarkan di dalam wadah docker, yang terhubung dengan komputer saya yang lain, membuka penerusan port SSH terbalik, dan kemudian jika saya ingin terhubung ke komputer di belakang firewall, saya malah terhubung ke server proxy dockerized saya di Port terbalik. Contoh:

Komputer firewall" Bob " terhubung ke server proxy:

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

Selanjutnya, saya terhubung ke server jarak jauh di port 2024 sehingga untuk mengikuti terowongan kembali ke bawah dan terhubung ke localhost:22 pada bob:

ssh -p 2024 remote.server

Ini semua berfungsi dengan baik ketika tidak dockerized, namun ketika saya mencoba memindahkan ini ke layanan dockerized, saya menemukan bahwa saya sshd server dalam wadah docker dengan keras kepala menolak untuk membuka port jarak jauh ke depan. Menghubungkan dengan ssh -vvv pada langkah pertama di atas memberikan:

...debug1: Entering interactive session.debug1: pledge: networkdebug3: receive packet: type 4debug1: Remote: Server has disabled port forwarding.debug3: receive packet: type 82debug1: remote forward failure for: listen 2024, connect localhost:22Warning: remote port forwarding failed for listen port 2024debug1: All remote forwarding requests processed

Yang terdengar banyak seperti saya sshd tidak diatur untuk mengizinkan penerusan port jarak jauh. Namun, saya sshd_config tampaknya berpikir itu adalah:

# tail /etc/ssh/sshd_config -n 5GatewayPorts yesAllowTcpForwarding yesAllowStreamLocalForwarding yesPermitTunnel yesUsePrivilegeSeparation no

Sesungguhnya berlari dengan ssh -ddd di dalam wadah buruh pelabuhan, kemudian menghubungkan dengan garis di atas menunjukkan pertama:

debug3: /etc/ssh/sshd_config:91 setting GatewayPorts yesdebug3: /etc/ssh/sshd_config:92 setting AllowTcpForwarding yesdebug3: /etc/ssh/sshd_config:93 setting AllowStreamLocalForwarding yesdebug3: /etc/ssh/sshd_config:94 setting PermitTunnel yesdebug3: /etc/ssh/sshd_config:95 setting UsePrivilegeSeparation no

Diikuti oleh:

debug1: server_input_global_request: rtype tcpip-forward want_reply 1debug1: server_input_global_request: tcpip-forward listen localhost port 2024debug1: server_input_global_request: rtype no-more-sessions@openssh.com want_reply 0

Jadi jelas konfigurasi saya diatur dengan benar, tetapi tampaknya klien masih berpikir server tidak dapat melakukan penerusan port. Bagaimana Saya bisa meyakinkan server openssh untuk melakukan penerusan jarak jauh? Apa yang bisa menyebabkan kegagalan ini?

Klien sedang berjalan OpenSSH_7.2p2 Ubuntu-4ubuntu2.4, server sedang berjalan OpenSSH_6.7p1 Debian-5+deb8u4, versi docker adalah 17.09.1-ce on Amazon Linux 2017.09.

Terima kasih!

Aha! Aku menemukan jawabannya. Ini karena docker adalah menciptakan sebuah ipv6 jaringan internal untuk kontainer saya, dan kernel saya tidak memiliki ipv6 penerusan diaktifkan. Jadi saat berlari sshd di luar wadah, itu akan bekerja lebih ipv4, tapi saat berlari sshd di dalam wadah di jaringan jembatan docker, itu akan mendengarkan ipv6 dan tidak dapat membuka port ke depan.

Setelah saya diaktifkan ipv6 forwarding, (menambahkan net.ipv6.conf.all.forwarding = 1 di /etc/sysctl.conf dan reboot) semuanya mulai bekerja dengan baik.

Anda juga dapat mencoba memaksa sshd untuk menggunakan ipv4. Dalam contoh Anda, tambahkan sakelar " -4 " sebagai berikut:

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

mengikuti langkah-langkah ini membantu saya

  • instal ssh pada wadah
  • aktifkan layanan dengan /etc/init.d/ssh start
  • lari echo 'root:a-strong-password' | chpasswd untuk mengatur kata sandi untuk root
  • edit /etc/ssh / sshd_config dan mengatur PermitRootLogin yes
  • kemudian /etc/init.d/ssh restart
  • kemudian ssh -fNTCR localhost:<YOUR-PORT>:localhost:22 remote-host ini pergi ke latar belakang dan Anda dapat melihatnya melalui ps aux | grep ssh
  • kemudian di remote-host kita bisa login ke dalamnya ssh -p <YOUR-PORT> localhost
  • yang meminta kata sandi dan Anda sudah menciptakan

screenhost

enter image description here


Info lebih lanjut

  1. bagaimana-untuk-ssh-ke-a-docker-kontainer-jarak jauh-sebagai-root-atau-a-non-root-pengguna