Разрешение DNS-адреса после прокси в SSH.NET - PullRequest
0 голосов
/ 29 ноября 2018

Я использую SSH.Net в C # и во время соединения через прокси-сервер SOCKS5 получаю следующее исключение:

System.Net.Sockets.SocketException (0x80004005): No such host is known
   at System.Net.Dns.GetAddrInfo(String name)
   at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
   at System.Net.Dns.GetHostAddresses(String hostNameOrAddress)
   at Renci.SshNet.Session.ConnectSocks5()
   at Renci.SshNet.Session.Connect()
   at Renci.SshNet.BaseClient.Connect()

Соединение с той же машины за тем же проксик тому же серверу бесперебойно работает с WinScp с параметром Do DNS name name at proxy end , выбранным в настройках сайта:

enter image description here

Есть ли способ заставить SSH.Net сделать то же самое?

1 Ответ

0 голосов
/ 29 ноября 2018

Это кажется невозможным.

SSH .NET всегда выполняет DNS-локальное разрешение :

var ip = DnsAbstraction.GetHostAddresses(ConnectionInfo.Host)[0];

//  Send address type and address
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
    SocketWriteByte(0x01);
    var address = ip.GetAddressBytes();
    SocketAbstraction.Send(_socket, address);
}
else if (ip.AddressFamily == AddressFamily.InterNetworkV6)
{
    SocketWriteByte(0x04);
    var address = ip.GetAddressBytes();
    SocketAbstraction.Send(_socket, address);
}
else
{
    throw new ProxyException(string.Format("SOCKS5: IP address '{0}' is not supported.", ip));
}

Если вы хотите изменить SSH.NET код, вам нужно заменить код на что-то вроде (не проверено):

// Send address type and address

SocketWriteByte(0x03); // Resolve by proxy

var host = SshData.Ascii.GetBytes(ConnectionInfo.Host);

SocketWriteByte((byte)host.Length);

SocketAbstraction.Send(_socket, host);

Что должно быть эквивалентно этот код PuTTY / WinSCP :

assert(type == ADDRTYPE_NAME);
command[3] = 3;
sk_getaddr(p->remote_addr, command+5, 256);
command[4] = strlen(command+5);
len = 7 + command[4];  /* 4 hdr, 1 len, N addr, 2 trailer */
...