我正在尝试使用我的公共 IP 通过 ssh 远程访问我的机器。
常规做法是允许路由器上的端口转发,然后执行:ssh ubuntu@myPublicIp
但我的 ISP 使用 CGNAT,因此我无法使用分配的公共 IP 进行端口转发。因此,我在 AWS 实例上使用 tinyproxy,并将本地计算机连接到代理 IP 地址。
这意味着我通过本地机器发出的每个请求都会经过代理 IP。现在我的公共 IP 被代理 IP 替换了。我的问题是如何在启用了代理的本地 Linux 机器上设置端口转发,以便我可以使用 ssh 远程连接到机器,例如:ssh ubuntu@myProxyIp
。
答案1
要访问 NAT/防火墙/其他任何东西后面的机器,您不需要做任何事情,除了该机器能够与公共网络建立出站连接并通过 ssh 访问公共网络中的实例。
NAT 后面的机器上的设置是为了确保它建立外部 ssh 连接并启用反向端口转发:
ssh -R:60000:127.0.0.1:22 [email protected]
其中[email protected]
是您可以访问的公共网络中的帐户和实例的地址。此命令基本上意味着以下内容:建立到 的 SSH 连接,使用friendly.domain.tld
用户joe
进行身份验证,并在远程端将我们的本地 tcp 端口 22 公开为 tcp 端口 60000。如果 SSH 服务器软件足够新(并且配置允许),您也可以直接将本地转发端口映射到 上的面向互联网的 IP 地址friendly.domain.tld
,但我在此假设不允许进行此类配置。
现在,我们的机器已经建立了传出链接,我们需要做的就是从任何地方连接到它,friendly.domain.tld
在我们的 SSH 连接中使用代理。为此,您需要打开两个终端窗口:第一个将用于与实例建立链接,friendly.domain.tld
以将暴露的 tcp 端口 60000 端口转发到您的本地机器:
ssh -L60000:127.0.0.1:60000 [email protected]
这会将环回接口上的 tcp 端口 60000 映射friendly.domain.tld
到您正在运行 ssh 命令的实例的环回接口。
从现在起,您只需使用以下命令即可连接到 NAT 后面的机器:
ssh -p60000 my_account@localhost
my_account
您的机器上位于 NAT 后面的帐户在哪里。
总而言之,共有三条 SSH 隧道在起作用:
machine_behind_nat <=1=> friendly_instance <=2=> your_laptop
<=================3==================>
这样设置的原因是为了确保即使“friendly_instance”被攻破,您与 NAT 后面的机器的通信也不会受到影响(我们不信任“friendly_instance”,只允许它通过其环回接口传输字节。我们在隧道#3 中使用端到端加密,该隧道通过隧道#1 和#2 传输。
我报道了这个设置在我的博客中如果您想要了解一些背景知识和其他技巧,您可以使用 ssh 来实现。
答案2
根据您实际的端口转发需求,您可以使用 ssh 进行动态反向端口转发。
如果只需要代理端口22:
ssh -R 22:0.0.0.0:2222 user@remote_server
然后你可以在本地机器上执行 ssh 操作:
ssh -p 2222 localuser@ProxyIP
如果要动态转发:
ssh -R 0.0.0.0:2222 user @remote_server
您可以使用代理链访问本地网络上的任何内容。请注意,任何知道您的 SOCKS 代理的远程 IP 和端口的人都可以访问您的本地网络。您可能需要实施防火墙来限制谁可以访问它。
这里有一篇很好的文章讨论这个问题:https://posts.specterops.io/offensive-security-guide-to-ssh-tunnels-and-proxies-b525cbd4d4c6