2つのネットワークインターフェースを持つサーバーがあります。
NATファイアウォールの制限により、インターネット上のサーバーにSSHトンネルを確立します。
ssh -fNTMS "/tmp/tunnel.socket" host;
ssh -S "/tmp/tunnel.socket" -O forward -R "0:localhost:22" placeholder
通常、有線の1GBイーサネット接続(eth0)を介して接続されていますが、オフィスにあり、人々が物事を移動してケーブルが「離れる」可能性があるため、信頼できません(残念ながら接着剤は使用できません)。
また、低速で費用がかかるモバイル4Gインターネット接続(eth1)もあります。
トンネルがまだ正しく機能していることを確認するには、定期的に次の-O check
コマンドを使用します。
ssh -S "/tmp/tunnel.socket" -O check placeholder
Master running (pid=3430)
echo $?
0
失敗すると、-O check
ソケットが閉じ(通過-O exit
)して新しいSSH接続が確立されます。
eth0 ネットワークケーブル「落下」でエラーが発生した場合、Linux は自動的に eth1 を使用します。
これは本当にうまくいきます。
しかし、eth0が再び表示されたら、再びeth0に切り替えたいと思います。
だから私はトンネルが実行中に-O check
現在eth1(この質問の焦点)を使用していることを確認し、eth0が戻ってくると再接続できると思います。
路線情報:
ip route
default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.225 metric 100
default via 192.168.2.1 dev eth1 proto dhcp src 192.168.2.241 metric 200
eth1のメトリックは200なので、作業中にeth0が優先順位を持ちます。
何も見つからない/proc/3430/
次の接続を一覧表示できますlsof
。
lsof -ai -p 3430 -n -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 3430 craig 3u IPv4 69362 0t0 TCP 192.168.1.225:43878->1.1.1.1:22 (ESTABLISHED)
また、netstat -tpln
ソケットを一覧表示してもインターフェイスは表示されません。
答え1
私が使用している可能な解決策は、両側に新しいインターフェースを作成することです。その後、-w
スイッチを介して接続されますssh
。
まず、正しい指標を使用して2つのローカルデフォルトパスを設定する必要があります。何かが変わるたびに(eth0の上または下)接続が切断されますが、これは問題ではありません(続きを読む)。
各サーバーにTunデバイスを作成し、ユーザーがそのデバイスにアクセスできるようにします。次のようになります(相手の住所を変更する必要があります)。
sudo ip tuntap add dev tun3 mode tun user myuser group mygroup
sudo ifconfig tun3 10.9.0.1 pointopoint 10.9.0.2 netmask 255.255.255.255
まあ、もしそうなら
ssh -w3:3 myuser@remote_host
ssh
両方のインターフェイスをトンネリングしてpingできます。接続が切断されても問題ありません。デバイスはtun
再接続して再開するのを待ちます。
この時点から、eth0または4Gを適切に使用しますが、アドレス(10.9.0.1/10.9.0.2)を保持する「安定した」リンクを介してリモートホストに接続できます。
代わりに、フラグ(モニター)と一緒に(およびキー)をssh
使用することをお勧めします。リンク損失を検出して再接続します。autossh
-M
これは、完全なVPN(ルーティング、ポリシー、ファイアウォールなどをトンインターフェイスに適用できます)に近いですが、慣れ親しんだ既存のssh
VPNを介して機能します。
答え2
愚かです...トンネルは、最も指標の低いデフォルトインターフェイスを使用するため、単一のインターフェイスに疲れません。
eth0 が再び動作すると、データは eth0 を介して転送されます。
これは接続が実際に失敗するため、ServerAliveInterval
/を使用してServerAliveCountMax
接続を通知して閉じる必要があります。