将对外部 IP/端口的请求重定向到内部 IP/端口?

将对外部 IP/端口的请求重定向到内部 IP/端口?

我有一台运行 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 才能使其工作。

相关内容