我不知道如何开始更好,所以我会直接说。我必须去国外旅行,但我需要访问我家乡网络本地的服务器。我有一个 DD-WRT 路由器,只有我的 PC 连接在它后面。所以我的问题是:我可以制定一些 iptables 规则,允许我从外部网络(外国)连接到我的路由器,并将我重定向到我的本地网络(ISP 提供)。我会尝试制作一张我的需求“地图”。
/Me - X/
/My router - R/
/Internet - I/
/Local Server - S/
我访问 S(本地服务器)的典型方式如下:X-R-S
我访问互联网的典型方式是:X-R-I
我的需求是:(R<--I<--X
然后从 R 连接到 S)
这是因为我无法从外部网络访问 S。
当我不在家时,路由器后面没有活动的 PC,所以我不能直接在其上运行代理。
答案1
这应该相对简单;对于 SSH,类似这样的操作应该就可以了:
iptables -t nat -A PREROUTING -p tcp \
-i ppp0 --dport 22 \
-j DNAT \
--to-destination 10.10.10.10:22
假设:R 的外部接口是ppp0
。这是规则应适用的传入接口。
假设:S 的 IP 地址是 10.10.10.10 - 当然替换正确的地址。
它的作用是“目标 NAT”;基本上与“普通 NAT”完全相同,只是它会用内部服务器的地址替换目标地址,并在返回时撤消它。要使用此功能,您需要在 X 上执行的所有操作是运行ssh R
而不是ssh S
连接到 S 上的 sshd(这仅在 X 当前处于不是在互联网上,但在您的内部网络上;您还需要运行 SNAT(“正常”或源 NAT)来获取来自 S 的回复并通过 R 发送,并且您需要将规则从“-i ppp0”更改为“-d <R 的外部地址>”,使其匹配从内部接收的数据包,而不仅仅是从外部接收的数据包;正如您所看到的,它变得有点复杂)。
笔记:当然,其他任何端口也可以这样做,但我会非常强烈建议不要暴露 Samba(Windows 共享)或未加密的 HTTP(除非它是公开的、未经身份验证的内容)。或者其他任何东西。在可能的情况下,它们的安全性并不简单,因此搭载 SSH 的端口转发将为您省去很多麻烦。
只是 Samba 转发很难,所以你最好尝试完全不用它。