我不确定正确的术语,但尝试将流量从服务器 A 重定向到服务器 B。我有以下资源:
- A 类型的 DNS 记录指向服务器A的IP 地址,例如:
abc.com
- 服务器AUbuntu,带有静止的例如: 的 IP
00.00.00.01
,没有端口正在侦听。 - 服务器BDebian,带有动态的可以说: 的 IP
00.00.00.02
,正在侦听端口123
- 来自互联网的传入请求
abc.com:123
服务器A是一台没有太多处理能力的服务器,但有一个静态IP。服务器B是一个功能强大的服务器,但具有动态IP。两者都通过不同的网络运行。
我的计划是服务器B经常讲述服务器A它是当前的 IP 地址并将其存储在服务器A的驱动到文件中。
如果有请求服务器A在 Port 处123
,它应该使用之前存储的 IP 地址并将流量重定向到该地址。
我之前尝试过的是使用 IP 表并重定向流量。我不太熟悉 iptables,但在互联网上发现了以下对我有意义的命令:
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf # enable forwarding
sudo sysctl net.ipv4.ip_forward # apply changes
sudo iptables -t nat -A PREROUTING -p tcp --dport 123 -j DNAT --to-destination 00.00.00.02:123
sudo iptables -t nat -A POSTROUTING -p tcp -d 00.00.00.02 --dport 123 -j SNAT --to-source 00.00.00.01
之后我重新启动了 iptables 服务。由于没有产生错误,我尝试使用traceroute来检查我在域上的请求是否会发送到服务器B,但他们没有。
traceroute abc.com 123
我确实知道服务器 A 上的端口 123 上没有任何东西正在侦听,但我认为这很好,因为 iptables 无论如何都会将流量重定向到服务器 B。
也许有人有想法。
答案1
正如@roaima 指出的:
您遇到过动态 DNS (DDNS) 吗?这是处理您的情况的常用方法
你说你的 DNS 提供商有 REST API;完美的!
你可以简单地每隔10秒左右检查一次B的公共IP是否发生变化,然后只在必要时更新。
这样,当没有发生任何事情时,您就不会导致更新,并且在更新公共 IP 地址时,您可以获得较低的延迟。
像这样的脚本可以工作:
#!/bin/bash
lastip=""
while true
do
currip=$(dig +short myip.opendns.com resolver1.opendns.com)
if [ "${lastip}" = "${currip}" ]
then
sleep 10
else
curl WHATEVERNEEDSTOBEDONE_TO_UPDATE_DNS
lastip="${currip}"
sleep 300
fi
done
正如 roaima 指出的那样,当然,您的 DNS 提供商必须具有足够低的 DNS TTL(即它必须将其给出的响应标记为很快就会过期)。然而,我的经验是,提供商提供 5 到 20 分钟的最小 TTL 之类的情况并不罕见,而且它们是可配置的。所以,我建议你尝试一下。
睡眠间隔相当短是因为使用 openDNS 的 myip 服务查询自己的 IP 地址相当“便宜”,而且尽早更新总是更好,无论更新需要多长时间才能传播到客户端。