我有一台具有静态 IP 地址的 Debian 服务器。我想设置它,这样如果我使用特定端口连接到此服务器,它将把该流量重定向到我的家庭网络。
我已经使用 iptables 像这样工作了:
iptables -t nat -A PREROUTING -p tcp --dport [port] -j DNAT --to [home-ip]:[port]
iptables -t nat -A POSTROUTING -d [home-ip] -j MASQUERADE
问题是,我的家庭网络有一个动态 IP。一旦 IP 发生变化(这种情况经常发生),它就会停止工作。
但是,我为我的家庭 IP 地址设置了一个动态 DNS 名称。
有没有办法使用 iptables 以便它始终将该流量重定向到我的动态 DNS 名称解析到的 IP?
答案1
IPTables 不支持即时 DNS 解析,因为这涉及安全、性能和实施问题。
如果有人能够修改您域名的 DNS 记录,这将影响 IPTables 规则。
如果 IPTables 对每个传入数据包甚至连接启动数据包进行 DNS 查找,速度就会非常慢。
另外,如果一个域名有多个 A 记录,IPTables 会使用哪一个?
为了实现您的目标,您需要实现一个系统,其中运行 IPTables 的主机将定期检查动态主机名的 IP 地址,然后相应地更改其规则。
另一种选择是在您的家庭网络上的计算机上安装一个软件,该软件监视当前的公共 IP 地址,然后将其发送到您的 IPTables 服务器,该服务器重新配置 IPTables。
我不知道有哪个特定软件可以为您做到这一点。
答案2
出于 Tero Kikanen 的充分解释,iptables并不是一个可以满足你需求的工具。你应该使用远程控制反而。
让我们调用:
hostA 您的本地电脑;
hostB 您的 Debian 服务器;
hostC 您的家用电脑。
如果你想转发你的远程控制例如,您需要在 PC 上添加会话主机A,将以下行添加到您的文件中.ssh/配置:
Host hostC
ProxyCommand ssh hostB -W %h:%p
并确保您拥有登录凭据主机C在主机A现在,您可以从 hostA 连接到 hostC,如下所示:
ssh me@hostc
在此,你不是需要使用 IP 地址,未解析的名称也可以。此外,您可以在代理命令文件或 CLI(这取决于该选项是用于 B->C 连接,还是用于 A->B 连接)。
同样的,您可以通过主机B的中介将主机A上的给定端口(端口A)转发到主机C上的另一个端口(端口C),如下所示:
ssh -L portA:hostC:portC me@hostB
再次强调,无需使用 IP 地址,简单名称即可。远程控制所有通信都会自动加密,因此没有人能够看到您正在做什么。
最后,如果你不知道如何给出(自由的!) 名称到没有静态 IP 地址的 PC (hostC),只需检查诺伊普,这很简单。