仕事からのSSHトンネルを使用して、さまざまなアイドティックファイアウォールを迂回します(上司には問題ありません:))。問題は、しばらくすると通常ssh接続がハングし、トンネルが壊れることです。
少なくともトンネルを自動的に監視できれば、トンネルがハングしたときに再開できますが、それを行う方法すら考えていません。
もちろん、私のssh接続がハングするのを防ぐ方法を教えてくれる人にはボーナスポイントです!
仕事からのSSHトンネルを使用して、さまざまなアイドティックファイアウォールを迂回します(上司には問題ありません:))。問題は、しばらくすると通常ssh接続がハングし、トンネルが壊れることです。
少なくともトンネルを自動的に監視できれば、トンネルがハングしたときに再開できますが、それを行う方法すら考えていません。
もちろん、私のssh接続がハングするのを防ぐ方法を教えてくれる人にはボーナスポイントです!
回答:
autosshが必要なようです。これにより、sshトンネルが監視され、必要に応じて再起動されます。数年使用してきましたが、うまく機能しているようです。
autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C
-Mパラメーターの詳細はこちら
autossh
回答にトンネルの例を使用できますか?
autossh -f -nNT -i ~/keypair.pem -R 2000:localhost:22 username@myoutsidebox.com
リモート端末を作成せずにautosshをバックグラウンドに配置できる-nNTと、.pemファイルを使用するSSHの-iオプションを使用して、これを設定していることに気付くかもしれません。接続を常に開いたままにする場合は、追加のセットアップを行うことをお勧めします。
-M
パラメーターを省略するほうが良いようです:bugs.debian.org/cgi-bin/bugreport.cgi
すべてのステートフルファイアウォールは、その接続のパケットをしばらく見ないと接続を忘れます(接続を閉じずに両端が停止した状態で状態テーブルがいっぱいになるのを防ぐため)。ほとんどのTCP実装は、長い時間後に相手側からの連絡なしでキープアライブパケットを送信します(2時間が一般的な値です)。ただし、キープアライブパケットを送信する前に接続を忘れるステートフルファイアウォールが存在する場合、存続期間は長いがアイドル状態の接続は終了します。
その場合、解決策は接続がアイドル状態になるのを防ぐことです。OpenSSHには、ServerAliveIntervalというオプションがあり、これを使用して接続が長時間アイドル状態になるのを防ぐことができます(ボーナスとして、接続がアイドル状態であってもピアがより早く消滅したことを検出します)。
独自のMacまたはLinuxマシンで、sshを構成して、サーバーsshを3分ごとに有効に保ちます。ターミナルを開いて、あなたの家であなたの見えない.sshに行きます:
cd ~/.ssh/
次に、以下を使用して1行の構成ファイルを作成します。
echo "ServerAliveInterval 180" >> config
以下も追加する必要があります。
ServerAliveCountMax xxxx (high number)
デフォルトは3なので、ServerAliveInterval 180は9分後に送信を停止します(ServerAliveIntervalで指定された3分の間隔のうち3つ)。
ServerAliveInterval 180
6分を与えるのですか?直観でこれを試してみます:180/60 == 3
。では、ServerAliveInterval
30秒の倍数で動作しますか?
次のBashスクリプトを使用して、前のトンネルが停止したときに新しいsshトンネルを生成し続けました。スクリプトを使用すると、追加のパッケージをインストールしたくない場合やコンパイラを使用できない場合に便利です。
while true
do
ssh <ssh_options> [user@]hostname
sleep 15
done
これには、接続を自動的に確立するためのキーファイルが必要ですが、autosshの場合も同様です。
Systemdはこれに最適です。
次/etc/systemd/system/sshtunnel.service
を含むサービスファイルを作成します。
[Unit]
Description=SSH Tunnel
After=network.target
[Service]
Restart=always
RestartSec=20
User=sshtunnel
ExecStart=/bin/ssh -NT -o ServerAliveInterval=60 -L 5900:localhost:5900 user@otherserver
[Install]
WantedBy=multi-user.target
(sshコマンドを合わせて変更します)
sshtunnel
ため、最初にユーザーが存在することを確認してくださいsystemctl enable sshtunnel
起動時に起動するように設定する問題systemctl start sshtunnel
すぐに開始する問題2018年1月の更新:一部のディストリビューション(Fedora 27など)は、systemd initからのSSHの使用を防ぐためにSELinuxポリシーを使用する場合があります。この場合、必要な免除を提供するにはカスタムポリシーを作成する必要があります。
systemd
システムに最適です。使用した場合Restart=on-failure
、SSHクライアントを手動で強制終了しても、終了したSSHクライアントとしてsystemd-by-systemd は正常に終了しません。
ExecStart
たとえばssh
引数リストを作成するための引数として指定された(bash)スクリプトからsshを起動する場合は、基本的なチェックなどを行い、そのようにしてスクリプトから呼び出しますexec /bin/ssh -N ...
。ここに私のコマンドがあります:exec /bin/ssh -N -oExitOnForwardFailure=Yes -oTCPKeepAlive=no -oServerAliveInterval=5 -oServerAliveCountMax=6 -i "${LOCAL_PRIVATE_KEY}" -L "${TUNNEL_INLET}:${TUNNEL_OUTLET}" "${REMOTE_USER}@${REMOTE_MACHINE}"
どこTUNNEL_INLET="127.0.0.1:3307"
とTUNNEL_OUTLET="127.0.0.1:3306"
ServerAliveCountMaxを誤解しているように見えます。私がドキュメントを理解しているように、接続が終了せずに無応答になる可能性のあるサーバーアライブメッセージの数です。したがって、ここで説明しているような場合、値を高く設定すると、ハングした接続が検出されて終了しないことが保証されます!
ファイアウォールが接続を忘れる問題を解決するには、ServerAliveIntervalを設定するだけで十分であり、ServerAliveCountMaxをLowのままにしておくと、発信側が接続に失敗した場合に失敗を通知して終了できます。
必要なのは、1)通常の状況下で接続を永続的に開いたままにする、2)接続障害を検出し、障害時に発信側を終了する、3)毎回sshコマンドを再発行することです。終了(どのように行うかはプラットフォームに大きく依存しますが、Jawaが推奨する「while while」スクリプトは、OS XIで実際に起動アイテムをセットアップする方法の1つです)。
ServerAliveInterval
期限切れのNATセッションによってトンネルの問題が生成される場合は、常にSSHオプションを使用してください。
接続が完全にダウンした場合に備えて、常にリスポーン方法を使用します。ここには少なくとも3つのオプションがあります。
while true do ssh ...; sleep 5; done
)はsleepコマンドを削除せず、ssh
すぐに失敗する可能性があり、再起動するプロセスが多すぎます/etc/inittab
、NATの背後にある別の国に出荷およびインストールされたボックスにアクセスし、ボックスにポートを転送せずに、sshトンネルを作成するように設定できます。
tun1:2345:respawn:/usr/bin/ssh -i /path/to/rsaKey -f -N -o "ServerAliveInterval 180" -R 55002:localhost:22 user@publicip 'sleep 365d'
Ubuntuのupstartスクリプト(/etc/inittab
使用不可):
start on net-device-up IFACE=eth0
stop on runlevel [01S6]
respawn
respawn limit 180 900
exec ssh -i /path/to/rsaKey -N -o "ServerAliveInterval 180" -R 55002:localhost:22 user@publicip
post-stop script
sleep 5
end script
または常に両方の方法を使用します。
私はこれでこの問題を解決しました:
編集
~/.ssh/config
そして追加
ServerAliveInterval 15
ServerAliveCountMax 4
ssh_configのmanページによると:
ServerAliveCountMax
Sets the number of server alive messages (see below) which may be
sent without ssh(1) receiving any messages back from the server.
If this threshold is reached while server alive messages are
being sent, ssh will disconnect from the server, terminating the
session. It is important to note that the use of server alive
messages is very different from TCPKeepAlive (below). The server
alive messages are sent through the encrypted channel and there‐
fore will not be spoofable. The TCP keepalive option enabled by
TCPKeepAlive is spoofable. The server alive mechanism is valu‐
able when the client or server depend on knowing when a connec‐
tion has become inactive.
The default value is 3. If, for example, ServerAliveInterval
(see below) is set to 15 and ServerAliveCountMax is left at the
default, if the server becomes unresponsive, ssh will disconnect
after approximately 45 seconds. This option applies to protocol
version 2 only.
ServerAliveInterval
Sets a timeout interval in seconds after which if no data has
been received from the server, ssh(1) will send a message through
the encrypted channel to request a response from the server. The
default is 0, indicating that these messages will not be sent to
the server. This option applies to protocol version 2 only.
ExitOnForwardFailure yes
他の提案への良い補助です。接続してもポートフォワーディングを確立できない場合は、まったく接続していないのと同じくらい役に立たないでしょう。
autossh
我々のニーズを(それは非常に最初の試みでサーバーに接続できない場合、それはエラーで存在する)満たしていない、私たちは純粋なbashのアプリケーションを書いています:https://github.com/aktos-io/link-サーバー付き
デフォルトでは、サーバー上のNODEのsshdポート(22)に逆トンネルを作成します。他のアクション(追加ポートの転送、接続時のメール送信など)を実行する必要がある場合は、スクリプトon-connect
とon-disconnect
フォルダーを配置できます。
watch
次のようなコマンドを使用して接続で「有効」にするためのダミーコマンドの接続を最終的に終了しましたwatch -n1 60 echo "wiiiii"
。トンネルは、ネットワークが壊れているか、使用しない限り死にません。