我有一台运行 KVM 虚拟化的专用服务器,有 n 个公共 IP 地址,专用于 n-1 个面向 Web 的虚拟机。现在我想设置一些面向 Web 的虚拟机,这些虚拟机没有专用地址,而是从主机为它们转发 2 或 3 个端口。
桥接配置为:
brctl show
假设我想转发
- 178.126.193.153:201 至 192.168.1.101:22
- 178.126.193.153:801 至 192.168.1.101:80
首先,我通过取消注释在主机上启用了端口转发
# net.ipv4.ip_forward=1
,然后/etc/sysctl.conf
我做了
sysctl -p /etc/sysctl.conf
service network restart
然后,类似于中的食谱这个问题,我做了:
iptables -t nat -A PREROUTING -p tcp -i br0 --dport 201 -j DNAT --to-destination 192.168.1.101:22
iptables -A FORWARD -p tcp -d 192.168.1.101 --dport 201 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i br0 --dport 801 -j DNAT --to-destination 192.168.1.101:80
iptables -A FORWARD -p tcp -d 192.168.1.101 --dport 801 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
我在一台客户机上运行ifconfig
并检查其接口 eth0 的 IP 地址确实是 192.168.1.101。虚拟机内部的接口叫eth0
,是吗?
但它不起作用:
nmap 178.126.193.153
没有显示开放端口 201 或 801,并且ssh -l root -p 201 178.126.193.153
让我困惑
ssh: connect to host 178.126.193.153 port 201: Connection refused
ip route
在主机上返回
178.126.193.128/26 dev br0 proto kernel scope link src 178.162.193.153
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
169.254.0.0/16 dev br0 scope link metric 1004
default via 178.126.193.190 dev br0
我究竟做错了什么?
答案1
当您将流量转发到不同的端口时,您需要添加路由后 SNAT 规则(或伪装,这并不重要)。您在前向规则中也犯了一些错误。所以试试这个:
iptables -t nat -A PREROUTING -p tcp -i br0 --dport 201 -j DNAT --to-destination 192.168.1.101:22
iptables -A FORWARD -p tcp -d 192.168.1.101 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -d 192.168.1.101 -p tcp --dport 22 -j SNAT --to-source 178.126.193.153
答案2
您必须启用环回路由。我在路由器上执行了以下操作:
iptables -A FORWARD -o eth1 -d $IP -j ACCEPT
iptables -A FORWARD -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
在我的设置中,eth0 是互联网接口,$IP 是互联网 IP,eth1 是内部接口。
这里的关键是,您需要一个 FORWARD 规则来处理从内部接口到外部目标 IP 的流量。这在逻辑上有点混乱,因为这条规则是在 DNAT 之前应用的。
第二条规则首先接受要转发的内部流量,您可以通过不同的方式实现这一点。
我不确定由于虚拟网络部分是否存在其他特殊情况,您可能也需要 ebtables 才能使其工作。