有三台服务器: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 来验证这一点。