![端口上 TCP 连接的透明代理(大多数情况下,无需 root 访问权限)](https://linux22.com/image/4821/%E7%AB%AF%E5%8F%A3%E4%B8%8A%20TCP%20%E8%BF%9E%E6%8E%A5%E7%9A%84%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%EF%BC%88%E5%A4%A7%E5%A4%9A%E6%95%B0%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E6%97%A0%E9%9C%80%20root%20%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90%EF%BC%89.png)
我的客户端计算机位于 Internet 上的某个位置,它需要访问位于内部的目标计算机的自定义端口(或者最初是任何可访问计算机上的任何端口,但最终是目标计算机上的特定端口,例如 12345)专用网络,仅接受来自该网络内部计算机的连接。
|
Client --X--> | Target:12345
|
(the Internet) (private network)
没有VPN
专用网络有一个 VPN 服务器,但我在客户端上没有 root 访问权限,并且我无法在那里使用(开放)VPN,因此,我无法轻松访问专用网络。
无根“门”
据推测,可以帮助客户端到达目标的第一件事是可以从外部世界访问的专用网络中的 Gate 机器,并且 Target 将接受来自 Gate 的 TCP 连接:
|
Client --?--> Gate --ok--> Target:12345
|
问题是在 Gate 设置透明的 TCP 流量转发,以便连接到 Gate[:some_port] 的客户端实际上会与 Target:12345 通信。
如果我在 Gate 拥有 root 访问权限,我将使用 iptables 透明地将到达 Gate[:chosen_port] 的 TCP 流量转发到 Target:12345。但是,我没有 Gate 的 root 访问权限(不过,我在那里有用户级访问权限并且可以通过 SSH 访问它)。
如果我可以通过 SSH 访问 Target,我将在 Target 和 Gate 之间建立一条 SSH 隧道,使客户端可以通过该隧道访问 Target;但是,我在 Target 上没有 SSH 访问权限(事实上,我对 Target 唯一能做的就是从专用网络内与其端口 12345 建立 TCP 连接)。
是否可以建立上述 TCP 转发,在客户端和网关都没有根并且没有对目标的 SSH 访问?如果答案是否定的,那么还有一个后续问题。
无root“门”+有root“内幕”
除了 Gate 之外,专用网络还有机器 Insider,我确实拥有 root 访问权限。
|
Client -ssh-> Gate -ssh-> Insider --?--> Target:12345
|
从 Insider 到 Gate 建立了一条反向 SSH 隧道,因此客户端可以 SSH 到 Insider,并且理论上,Insider 可以(“手动”)与 Target 的 12345 端口建立 TCP 连接。然而,这并不是我正在寻找的透明 TCP 流量转发解决方案。
在后一种情况下,我在 Insider 中拥有 root 访问权限是否可以帮助透明地将流量从客户端转发到 Target:12345?
任何建议将不胜感激!
答案1
您可以使用 ssh 端口转发
ssh [email protected] -L 10000:172.16.10.10:10000
当你可以连接到 localhost:10000 后,实际上你将连接到 172.16.10.10:10000 的服务
您还可以使用 ssh -D 参数创建“代理”。