通过端口将请求从服务器 A 转发到服务器 B

通过端口将请求从服务器 A 转发到服务器 B

我不确定正确的术语,但尝试将流量从服务器 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 地址相当“便宜”,而且尽早更新总是更好,无论更新需要多长时间才能传播到客户端。

相关内容