![检查当前的 iptables 规则](https://linux22.com/image/1291676/%E6%A3%80%E6%9F%A5%E5%BD%93%E5%89%8D%E7%9A%84%20iptables%20%E8%A7%84%E5%88%99.png)
好的,为了得到一些回应,这是一个 TL;DR 版本。我知道以下命令:
iptables -A PREROUTING -t nat -i eth0 --dport 80 --source 1.1.1.1 -j REDIRECT --to-port 8080
... 将所有流量从端口 80 重定向到端口 8080。问题是我必须对每个要重定向的端口执行此操作。为了面向未来,我希望将 IP 的所有端口重定向到不同的(内部)IP,这样如果有人决定启用 SSH,他们可以直接连接而不必担心 iptables。
需要什么才能可靠地将所有流量从外部 IP 转发到内部 IP,反之亦然?
扩大的视野
我在网上搜索过这个问题,但一直没有得到确切的答案。我有一个物理服务器 (HOST),上面有几台需要将流量重定向到它们的虚拟机 (VM)。现在只需让它与一台机器一起工作就足够了。
VM 在 VirtualBox 下运行,并设置为使用仅主机适配器 (vboxnet0)。一切似乎都正常,但延迟严重。主机 (CentOS 5.6) 和客户机 (Ubuntu 10.04) 都运行 Linux。
我做了以下事情:
- 配置虚拟机在 vboxnet0 适配器的网络中拥有静态 IP。
- 为主机添加 IP 别名,注册到专用(外部)IP。
- 设置 iptables 以允许流量通过(通过 sysctl)。
- 配置 iptables 将数据从给定 IP 地址 DNAT 和 SNAT 到内部地址。
iptables 命令:
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A POSTROUTING -t nat -j MASQUERADE iptables -t nat -I PREROUTING -d $OUT_IP -I eth0 -j DNAT --到目的地$IN_IP iptables -t nat -I POSTROUTING -s $IN_IP -o eth0 -j SNAT --to-source $OUT_IP
现在网站可以运行了,但是速度真的很慢。我希望我忽略了一些简单的事情,但我现在没有主意了。
一些背景信息:在此之前,该网站使用基本的端口转发。例如,使用 iptables 将端口 80 映射到端口 8080。在 VirtualBox(将网络适配器配置为 NAT)中,反向端口转发使一切顺利进行。问题有两个方面:首先,需要转发多个端口(用于管理界面、https、ssh 等)。其次,它只允许一个 IP 地址使用端口 80。
为了解决这个问题,不同的(子)域使用多个外部 IP 地址。同样,“VirtualBox”网络将包含虚拟机:
DNS 扩展。 IP 适配器 VM“VirtalBox”IP ------------------------------------------------------------------ a.example.com 1.1.1.1 eth0:1 vm_guest_1 192.168.56.1 b.example.com 2.2.2.2 eth0:2 vm_guest_2 192.168.56.2 c.example.com 3.3.3.3 eth0:3 vm_guest_3 192.168.56.3
等等。简而言之,目标是将所有流量从a.example.com
引导到vm_guest_1
(换句话说,从1.1.1.1
引导到192.168.56.1
)。并以可接受的速度实现这一目标 :)。
答案1
既然您已经为虚拟机分配了公共地址,也许您应该考虑使用桥接网络而不是 NAT?您将获得更清晰的设置。
如果您担心您的客人在桥接设置中互相干扰,您仍然可以使用ebtables
和/或静态 arp 来强化事情。
答案2
检查当前的 iptables 规则
iptables -t nat -L -n -v
启用 IP 转发
echo "1" > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward
转发 PG 流量的规则
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination new-master-ip:80
iptables -t nat -A POSTROUTING -j MASQUERADE
检查 iptables 规则
iptables -t nat -L -n -v