ubuntu通过另一台主机将流量路由到特定的远程端口

ubuntu通过另一台主机将流量路由到特定的远程端口

有三台服务器:A,B,C。

C 在端口 8080 上公开服务,并且防火墙规则只允许来自 B 的连接。

我需要设置 A 和 B,以便 A 也可以通过 B 访问 C。

请注意:

  • 我管理 A 和 B,而不是 C。
  • 它们是独立的 ubuntu 服务器,均可直接访问互联网。
  • 我不能使用 C 的 IP 地址作为过滤参数(假设它是动态的)
  • 我可以使用端口作为过滤参数,因为从 A 发往端口 8080 的流量将始终流向 C,而不会流向其他任何地方
  • A 仍然能够通过其他端口正常联系 B,并直接访问互联网

我读了很多关于 iptables 的文章,但我无法让它工作。我想我错过了一些重要的东西。我还发现了rinetd但我不知道它是否能处理我的情况,如果可能的话我不想添加其他软件。

这是迄今为止我尝试过的配置。

在服务器 A 上:

iptables -t nat -A OUTPUT -p tcp --dport 8080 -j DNAT --to-destination IP_OF_B:8080

在服务器 B 上:

modprobe iptable_nat

vi /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p

iptables -t nat -A POSTROUTING -p tcp -s IP_OF_A --dport 8080 -j MASQUERADE

结果:

从A发送到C:8080的数据到达B:8080,但无法到达C:8080。

答案1

我意识到我错过了服务器 C 的动态部分。

rinetd 或 xinetd 之类的工具是设置端口转发的完美选择。您只需保护它,以便只有服务器 A 可以访问它。

那么在服务器 A 上您有两个选择。您可以直接连接到服务器 B:8080,然后连接到服务器 C:8080。服务器 B 显然必须知道如何访问服务器 C。

如果您需要使用服务器 C 的名称,则您的 iptables 规则应该将端口 8080 的流量重定向到服务器 B。您可以通过在服务器 B 上运行 tcpdump 来验证这一点。

相关内容