我想实现一个中间有两个(A 和 B)服务器的代理。流量从我的计算机到服务器B,然后到服务器A,然后获取数据。我发现在 ~/.ssh/config 中使用此配置:
HOST B
HostName B
user debian
DynamicForward 0.0.0.0:1081
我可以使用我的 1081 端口作为代理。但现在不知道如何通过A代理B的所有流量。
这是我的 ssh 版本:
OpenSSH_7.2p2 Ubuntu-4ubuntu2.8、OpenSSL 1.0.2g 2016 年 3 月 1 日
答案1
B 只是处理它到达 A 的所有内容。A 必须根据其数据选择从何处检索数据。显然只有 A 应该有动态转发隧道中,B的作用只是一个连接的中间主机。通常B应该只需要经典本地转发向 A 提出疑问。
这可以通过不同的方式完成,但最简单和安全的方法利用代理跳转该功能将显示 A 就好像它可以直接访问一样,因此不再需要考虑 B 将如何与预期的端口转发交互。人们可以认为B几乎是不可见的。所以最后,可以放入以下配置~/.ssh/config
:
Host B
User userb
Host A
User usera
ProxyJump B
DynamicForward 1081
仅调用:
ssh A
如果没有配置文件,等效的命令行将是:
ssh -D 1081 -J userb@B usera@A
更新: 应该SSH的版本早于 7.3(因为它似乎是针对 OP 的),代理跳转仍然可以替换为代理命令+ssh-W像这样:
作为配置文件~/.ssh/config
:
Host B
User userb
Host A
User usera
ProxyCommand ssh -W %h:%p B
DynamicForward 1081
或者没有配置文件的等效命令行:
ssh -D 1081 -o 'ProxyCommand ssh -W %h:%p userb@B' usera@A
SOCKS5 API 将在客户端上可用localhost:1081
(除非放回0.0.0.0:1081
(或使用网关端口/-G)以使其可供其他客户端使用)。在引擎盖下,由一对管道控制,一个生成的子SSH进程将通过主机 B 建立一条隧道,并将 A 的 ssh 服务器呈现给初始主机SSH命令:整个 ssh 都是通过隧道传输的,这就是为什么不需要配置特定的附加端口转发。