我知道ssh
提供了带有 的 SOCKS 代理-D
。我想知道是否可以在连接到指定端口时按需启动此类代理(使用socat
和之类的nc
底层功能)。这是一台单用户计算机,因此不需要对本地连接进行身份验证。
以下是我尝试过的:
告诉网络浏览器在 使用 SOCKS 代理
localhost:portA
。对于到“触发器”端口的每个连接
portA
,socat
都会调用该nc-ssh-socks
脚本,该脚本最终执行为nc localhost portB
:socat TCP-LISTEN:portA,fork EXEC:"nc-ssh-socks server portB"
该脚本还确保
ssh
存在一个提供 SOCKS 代理的进程localhost:portB
:cmd="ssh -fND $2 $1" pgrep -u $USER -fx "$cmd" || $cmd exec nc localhost $2
但是,该方案不起作用,我不断收到socat -ddddd
以下形式的错误:
W read(6, 0x1bf5360, 8192): Connection reset by peer
W waitpid(): child 25032 exited with status 1
E write(6, 0x1bf5360, 2): Broken pipe
奇怪的是,偶尔我会看到页面的某些部分出现在浏览器中,但我不知道这是因为缓存还是因为某些连接正常但大多数连接不正常。
有谁对socat
、nc
和有足够的了解ssh
,能够理解为什么这不起作用?
答案1
在调试时,通过从 ssh 命令中删除 -fN 并添加 -vvv 来提高可见性以获取调试信息。这只会为您提供客户端信息,但可能会告诉您更多信息。