SSH.NET を使用して、リモートマシンのlocalhost:3306
からポート3306へのトンネルを作成しようとしています。
PrivateKeyFile file = new PrivateKeyFile(@" .. path to private key .. ");
using (var client = new SshClient(" .. remote server .. ", "ubuntu", file))
{
client.Connect();
var port = new ForwardedPortLocal(3306, "localhost", 3306);
client.AddForwardedPort(port);
port.Start();
// breakpoint set within the code here
client.Disconnect();
}
ブレークポイントに到達すると、client.IsConnected
はtrue
を返しますが、telnet localhost 3306
は接続していません。代わりにPuTTYを使用して接続を作成し、そこに同じトンネルを設定すると、成功します。私は何を逃しましたか?
ForwardedPortLocalのパラメーターを次のように変更する。
_ var port = new ForwardedPortLocal("localhost", 3306, "localhost", 3306);
_
(バインドするインターフェイスを明示するため)、port.Start();
の直前に次のコードを追加します。
_ port.RequestReceived += delegate(object sender, PortForwardEventArgs e)
{
Console.WriteLine(e.OriginatorHost + ":" + e.OriginatorPort);
};
_
次の出力が表示されていることに気づきました。
_ ::1:60309
_
これの_e.OriginatorHost
_部分は_::1
_でした。これは、IPv6でlocalhost
に相当します。ただし、宛先サーバーはIPv4を使用していました。パラメータを次のように変更します。
_ var port = new ForwardedPortLocal("127.0.0.1", 3306, "localhost", 3306);
_
代わりに、トンネルを強制的にIPv4で実行すると、コードは期待どおりに機能しました。
同じ問題にぶつかって分析し、それがバグであるという結論に達したと考えた後(議論の余地があると思われるかもしれませんが、明らかにこの動作はSSH.NET APIのユーザーを驚かせます)。
だから私はそれを報告しました ローカルトンネルでの予期しない動作(別名バグ)・問題#117・sshnet/SSH.NET・GitHub 。
修正されるまで、 c#-SSHトンネル内に転送ポートを作成する-スタックオーバーフロー の回避策は機能します。