パスワード認証を介してDockerコンテナ内でSSH転送Socks5プロキシを使用したいと思います。はい、わかりますSSHキーが良いです。ただし、私のサーバーではないため、キーは使用できず、ユーザー/パスワード認証のみを提供します。autossh
私は仕事に適したツールだと思い、エントリポイントシェルsshpass
スクリプトでこのツールを使用しました。
sshpass -P "assphrase" -p "${PASSWORD}" autossh -M0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -oStrictHostKeyChecking=no -oUserKnownHostsFile=custom_known_hosts -4 -N -D *:5080 ${USER}@${HOST}
両方のパッケージにインストールされます。Dockerfile
FROM debian:stretch-slim
RUN apt-get update \
&& apt-get upgrade -y
RUN apt-get install -y ssh wget sshpass autossh
RUN wget https://www.provider.com/custom_known_hosts
COPY run.sh .
ENTRYPOINT "./run.sh"
これにより、Socks5 プロキシの SSH トンネルが確立されます。ただし、インターネット接続が失われると認証は失敗します。
socks5_forward_1 | Warning: Permanently added 'server.provider.com' (ECDSA) to the list of known hosts.
socks5_forward_1 | SSHPASS searching for password prompt using match "assword"
socks5_forward_1 | SSHPASS read: [email protected]'s password:
socks5_forward_1 | SSHPASS detected prompt. Sending password.
socks5_forward_1 | SSHPASS read:
socks5_forward_1 |
socks5_forward_1 | packet_write_wait: Connection to 1.2.3.4 port 22: Broken pipe
socks5_forward_1 | SSHPASS read: [email protected]'s password:
socks5_forward_1 | SSHPASS detected prompt, again. Wrong password. Terminating.
socks5_forward_1 | Permission denied, please try again.
socks5_forward_1 | Permission denied, please try again.
socks5_forward_1 | Received disconnect from 1.2.3.4 port 22:2: Too many authentication failures
socks5_forward_1 | Authentication failed.
socks5_forward_1 | Permission denied, please try again.
socks5_forward_1 | Permission denied, please try again.
socks5_forward_1 | Received disconnect from 1.2.3.4 port 22:2: Too many authentication failures
socks5_forward_1 | Authentication failed.
私も試しました
sshpass -v -p "${PASSWORD}" autossh -M0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -oStrictHostKeyChecking=no -oUserKnownHostsFile=custom_known_hosts -4 -N -D *:5080 ${USER}@${HOST}
再接続しようとした後は機能しないと思いますので、ループを直接作成してくださいsshpass
。autossh
while true; do command sshpass -P "assphrase" -p "${PASSWORD}" ssh -M0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -oStrictHostKeyChecking=no -oUserKnownHostsFile=custom_known_hosts -4 -N -D *:5080 ${USER}@${HOST}; [ $? -eq 0 ] && break || sleep 5; done
どちらのアプローチも機能しません。私のISPは24時間ごとに再接続するので、毎日コンテナを手動で再起動するのは面倒です。ループの最後のメソッドが再接続を正しく処理できない理由はまだ理解されていません。
答え1
問題は、SSH自体が再接続を試みていて、sshpass
再接続するためにパスワードを送信するのに問題があるようです。そのため、ループを直接作成し、転送が失敗した場合に終了するようにsshを設定しました。
while :; do
sshpass -v \
-p "${PASSWORD}" \
ssh \
-o "ServerAliveInterval 60" \
-o "ServerAliveCountMax 2" \
-o "ConnectTimeout 15" \
-o "ExitOnForwardFailure yes" \
-o "StrictHostKeyChecking no" \
-o "UserKnownHostsFile perfect_privacy_known_hosts" \
-4 -N -D *:5080 ${USER}@${HOST}
echo "SSH connection exieted, wait 15s before re-trying"
sleep 15
done
DSLモデムを再起動して再接続をシミュレートしました。
socks5_forward_1 | Ziel: server.provider.com mit User: myUser
socks5_forward_1 | Warning: Permanently added 'server.provider.com' (ECDSA) to the list of known hosts.
socks5_forward_1 | SSHPASS searching for password prompt using match "assword"
socks5_forward_1 | SSHPASS read: [email protected]'s password:
socks5_forward_1 | SSHPASS detected prompt. Sending password.
socks5_forward_1 | SSHPASS read:
socks5_forward_1 |
socks5_forward_1 | Timeout, server server.provider.com not responding.
socks5_forward_1 | SSH connection exieted, wait 15s before re-trying
socks5_forward_1 | ssh: Could not resolve hostname server.provider.com: Temporary failure in name resolution
socks5_forward_1 | SSH connection exieted, wait 15s before re-trying
socks5_forward_1 | ssh: Could not resolve hostname server.provider.com: Temporary failure in name resolution
socks5_forward_1 | SSH connection exieted, wait 15s before re-trying
socks5_forward_1 | ssh: Could not resolve hostname server.provider.com: Temporary failure in name resolution
socks5_forward_1 | SSH connection exieted, wait 15s before re-trying
socks5_forward_1 | ssh: Could not resolve hostname server.provider.com: Temporary failure in name resolution
socks5_forward_1 | SSH connection exieted, wait 15s before re-trying
socks5_forward_1 | SSHPASS searching for password prompt using match "assword"
socks5_forward_1 | SSHPASS read: [email protected]'s password:
socks5_forward_1 | SSHPASS detected prompt. Sending password.
socks5_forward_1 | SSHPASS read:
これは素晴らしい作品です。 SSH接続が確立され、Socks 5プロキシが自動的に再接続されます。