使用SSH.NET通过SOCKS5代理连接SFTP时遇「连接规则不允许」错误
使用SSH.NET通过SOCKS5代理连接SFTP报错:Connection not allowed by ruleset
错误详情
KO > Exception :
Message : 'SOCKS5: Connection not allowed by ruleset.'
StackTrace :
at Renci.SshNet.Connection.Socks5Connector.HandleProxyConnect(IConnectionInfo connectionInfo, Socket socket)
at Renci.SshNet.Connection.Socks5Connector.Connect(IConnectionInfo connectionInfo)
at Renci.SshNet.Session.Connect()
at Renci.SshNet.BaseClient.CreateAndConnectSession()
at Renci.SshNet.BaseClient.Connect()
at Debug.Program.Main(String[] args) in C:\DEV\ruche\Debug\Program.cs:line 17
使用相同参数通过FileZilla可正常连接,但SSH.NET代码连接失败。
代码示例
获取SftpClient的方法
public SftpClient GetClient() { if (string.IsNullOrEmpty(Proxy_Adresse) == false) { ConnectionInfo lInfos = new ConnectionInfo(Adresse, //My SFTP adresse Port, // 22 Username, //My SFTP User ProxyTypes.Socks5, Proxy_Adresse, Proxy_Port, //1080 Proxy_Username, //empty in my case Proxy_Password, //empty in my case new PasswordAuthenticationMethod(Username, Password)); //My SFTP User / Password return new SftpClient(lInfos); } else { return new SftpClient(Adresse, Port, Username, Password); } }
连接调用代码
using (var lClient = lSFTP.GetClient()) { lClient.Connect(); Console.WriteLine("OK"); }
排查方向与解决方案
- 检查代理地址格式:SSH.NET不支持在代理地址中添加
socks5://这类协议前缀,确保Proxy_Adresse仅传入纯IP或域名(比如192.168.1.100而非socks5://192.168.1.100),FileZilla会自动兼容前缀,但SSH.NET无法识别。 - 显式指定代理空认证:即使代理用户名密码为空,部分SOCKS5代理要求明确发送空认证包,可手动添加认证方法:
var proxyAuth = new NoneAuthenticationMethod(); ConnectionInfo lInfos = new ConnectionInfo(...) { ProxyAuthenticationMethod = proxyAuth }; - 升级SSH.NET版本:旧版本SSH.NET的SOCKS5代理模块存在规则兼容bug,建议升级到2020.0.0及以上的稳定版本。
- 本地解析SFTP服务器地址:若代理不支持远程域名解析,先在本地将SFTP服务器域名解析为IP地址,再将IP传入
ConnectionInfo的Adresse参数(FileZilla默认本地解析域名,而SSH.NET可能默认让代理解析)。
内容的提问来源于stack exchange,提问作者Arnaud
相关产品推荐
相关产品推荐

