我有一个小应用程序,一个用 C# 编写的命令行可执行文件,它使用
Renci.SSHNet
库连接到不同的 SFTP 服务器来下载文件。
问题是,根据这些服务器之一的管理员的请求,要连接到它,我不仅需要连接到特定端口(通常的东西),而且还需要从客户端中的特定端口进行连接。
有什么方法可以在我的 exe 中对此进行编码以强制使用特定端口吗?作为最后的手段,我想可以与我的网络管理员交谈以在路由器或其他东西中设置一些规则,但我希望我的应用程序对此负责。
我想到了可以使用本地端口转发重定向流量的想法。为了测试这一点,我使用 OpenSSH 在我的开发计算机上设置了一个 SSH 服务器,并使用 Rebex Tiny SFTP Server 设置了一个测试 SFTP 服务器。然后我打开了到我的机器的 SSH 连接,然后尝试通过重定向端口连接到 SFTP。好吧,我设法通过定义的端口获得 SSH ACK
localPort
,但其余的通信和传输是通过任何空闲端口完成的。
string sshSrv = "127.0.0.1"; // Local SSH server
string sshUser = "user";
string sshPass = "pass";
int sshPort = 22;
string sftpSrv = "192.168.1.120"; // SFTP test server
string sftpUser = "tester";
string sftpPass = "password";
uint sftpPort = 2222;
string localSrv = "127.0.0.1";
int localPort = 51000; // The outgoing traffic must go through this port.
ConnectionInfo sshCI = new ConnectionInfo(sshSrv, sshPort, sshUser,
new PasswordAuthenticationMethod(sshUser, sshPass));
using (SshClient sshClient = new SshClient(sshCI))
{
ForwardedPort fwdPortL = null;
try
{
sshClient.KeepAliveInterval = new TimeSpan(0, 0, 20);
sshClient.Connect();
fwdPortL = new ForwardedPortLocal(localSrv, (uint)localPort, sftpSrv, sftpPort);
fwdPortL.Exception += delegate (object sender, ExceptionEventArgs e)
{
Console.WriteLine("ForwardedPortLocal Exception: " + e.Exception.ToString());
};
fwdPortL.RequestReceived += delegate (object sender, PortForwardEventArgs e)
{
Console.WriteLine($"Request Received: {e.OriginatorHost}:{e.OriginatorPort}");
};
sshClient.AddForwardedPort(fwdPortL);
fwdPortL.Start();
using (SftpClient sftpClient = new SftpClient(localSrv, localPort, sftpUser, sftpPass))
{
sftpClient.Connect();
// Stuff to test SFTP connection...
sftpClient.Disconnect();
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
finally
{
fwdPortL?.Stop();
sshClient.Disconnect();
}
我也有同样的要求,请问有解决办法吗?