如何按需获取 ssh socks 代理?

如何按需获取 ssh socks 代理?

我知道ssh提供了带有 的 SOCKS 代理-D。我想知道是否可以在连接到指定端口时按需启动此类代理(使用socat和之类的nc底层功能)。这是一台单用户计算机,因此不需要对本地连接进行身份验证。

以下是我尝试过的:

  • 告诉网络浏览器在 使用 SOCKS 代理localhost:portA

  • 对于到“触发器”端口的每个连接portAsocat都会调用该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

奇怪的是,偶尔我会看到页面的某些部分出现在浏览器中,但我不知道这是因为缓存还是因为某些连接正常但大多数连接不正常。

有谁对socatnc和有足够的了解ssh,能够理解为什么这不起作用?

答案1

在调试时,通过从 ssh 命令中删除 -fN 并添加 -vvv 来提高可见性以获取调试信息。这只会为您提供客户端信息,但可能会告诉您更多信息。

相关内容