Connect direct and fallback
Brian Candler
b.candler at pobox.com
Mon Feb 21 19:10:28 AEDT 2022
On 18/02/2022 12:15, Darren Tucker wrote:
> Other than the ProxyUseFdpass part you can do that with a shell one
> liner in ProxyCommand and netcat:
>
> ProxyCommand sh -c 'nc %h %p || nc --proxy lsocksserver:1080
> --proxy-type=socks4 %h %p'
Just a quick follow-up to this: I found that macOS 12.2.1's "nc" command
is broken when using a SOCKS5 proxy and the proxy returns an IPv6 bind
address.
X -----------> Y --------------> Z
macOS SOCKS5 IPv6 target
nc server
$ nc -X 5 -x 1.2.3.4:1080 2001:db8::1 22
�ݐSSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.4
^^
(Notice the extra spurious bytes in response)
Checking with tcpdump I see the exchange as:
--> 05 01 00
<-- 05 00
--> 05 01 00 04 ZZ(x16) 00 16 [connect, ATYP 4 = IPv6 address/port]
<-- 05 00 00 04 YY(x16) PP PP [success, ATYP 4 = IPv6 bind address/port]
<-- start of data
This is the case with two standalone SOCKS5 servers I tried: dante and
Mikrotik.
Interestingly, the problem doesn't manifest when using ssh -D as the
proxy server.
$ ssh -D 1080 Y
...
$ nc -X 5 -x localhost:1080 2001:db8::1 22
SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.4
--> 05 01 00
<-- 05 00
--> 05 01 00 04 ZZ(x16) 00 16 [connect, ATYP 4 = IPv6 address]
<-- 05 00 00 01 00 00 00 00 00 00 [success, ATYP 1 = IPv4 bind
address 0.0.0.0:0]
<-- start of data
That is, ssh -D always returns IPv4 0.0.0.0:0 as the bind address/port,
even if the target is reached via IPv6, and regardless of whether
localhost is 127.0.0.1 or ::1. It appears macOS's /usr/bin/nc is
hard-coded to expect that.
Workaround is to switch to "ncat" (from the makers of "nmap") which
works correctly. Homebrew also has "netcat" and "netcat6" packages, but
neither of those support SOCKS. With ncat, the connection fallback works.
Anyway, I just thought I'd mention it in case it trips up anyone else.
Regards,
Brian.
More information about the openssh-unix-dev
mailing list