具有NAT +桥接networking的KVM客户端

我目前有一个专用的服务器上的几个KVM访客与桥接networking(这工作),我可以ping通外部ips我分配通过ifconfig(在客人)。

但是,由于我只有5个公共IPV4 IP地址的事实,我想端口转发这样的服务:

hostip:port – > kvm_guest:port

UPDATE

我发现KVM有一个“默认”的NAT接口,所以将虚拟网卡添加到Guest virshconfiguration中,然后在Guest中configuration它,它的IP地址为:

192.168.122.112

我可以ping通192.168.122.112,并从KVM主机访问192.168.122.112上的所有端口,所以我试图像这样向前端口:

iptables -t nat -I PREROUTING -p tcp --dport 5222 -j DNAT --to-destination 192.168.122.112:2521 iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT 

telnet KVM_HOST_IP 5222只是挂在“尝试”

telnet 192.168.122.112 2521作品

 [root@node1 ~]# tcpdump port 5222 tcpdump: WARNING: eth0: no IPv4 address assigned tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 23:43:47.216181 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445777813 ecr 0,sackOK,eol], length 0 23:43:48.315747 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445778912 ecr 0,sackOK,eol], length 0 23:43:49.415606 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445780010 ecr 0,sackOK,eol], length 0 

由内核丢弃的filter0包接收的7个数据包

 [root@node1 ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere 192.168.122.0/24 state NEW,RELATED,ESTABLISHED Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@node1 ~]# iptables -nvL Chain INPUT (policy ACCEPT 976 packets, 57008 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 11 640 ACCEPT all -- * * 0.0.0.0/0 192.168.122.0/24 state NEW,RELATED,ESTABLISHED Chain OUTPUT (policy ACCEPT 673 packets, 40901 bytes) pkts bytes target prot opt in out source destination [root@node1 ~]# iptables -nvL -t nat Chain PREROUTING (policy ACCEPT 549 packets, 34067 bytes) pkts bytes target prot opt in out source destination 1 64 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5222 to:192.168.122.112:2521 3 192 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5222 to:192.168.122.112:2521 1 64 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5225 to:192.168.122.112:2521 1 64 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5222 to:192.168.122.112:2521 Chain POSTROUTING (policy ACCEPT 45 packets, 3169 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 44 packets, 3105 bytes) pkts bytes target prot opt in out source destination 

所有的帮助表示赞赏。

谢谢。

如果你以这种方式运行kvm:

 kvm -drive... -net nic -net tap .... 

您将成为一个名为tapX (其中X是数字)的新接口(在根主机中)。 这个接口通常默认通过位于/etc/etc/kvm/kvm-ifup/etc/qemu-ifup或其他)中的脚本来configuration,你可以用下面的方法改变它们: kvm -drive... -net nic -net tap,script=mynatbrigescript

从那里,这个接口必须在每个点上configuration:

 ifconfig tapX 192.168.124.1/30 

并在客户端操作系统:

 ifconfig eth0 192.168.124.2/30 

所以如果你(根主机上),你会看到一个新的本地networking(假设你的公共IP为1.2.3.4):

 ip rs 1.2.3.4 dev eth0 ... 192.168.124.0/30 dev tapX proto kernel scope link src 192.168.124.1 

从那里,你必须能够从根主机ping到192.168.124.2。 然后你可以使用DNAT将你的TCP包DNAT

 iptables -t nat -A PREROUTING -i eth0 -d 192.168.122.31 --dport 5222 -j DNAT --to-destination 192.168.124.2:2521 

并在另一个方向上SNAT回答数据包:

 iptables -t nat -A POSTROUTING -o eth0 -s 192.168.124.2 -j SNAT --to-source 192.168.122.31 

现在如果是为了根节点,这个工作:

 telnet 192.168.124.2 2521 

然后从你的本地域,这必须做同样的事情:

 telnet 1.2.3.4 5222 

根本来说,你的根主机必须转发IP数据包,这可以通过以下validation:

 cat /proc/sys/net/ipv4/ip_forward 1 

要么

 sysctl net.ipv4.conf.all.forwarding net.ipv4.conf.all.forwarding = 1 

这可以通过以下设定:

 echo 1 > /proc/sys/net/ipv4/ip_forward 

要么

 sysctl net.ipv4.conf.all.forwarding=1 

首先,应更新您的DNAT规则,以包含KVM主机的目标IP地址。 就这样,即使从虚拟机到互联网(在端口5222上)的stream量也会被取消。

 iptables -t nat -F PREROUTING iptables -t nat -A PREROUTING 1 -d KVM_HOST_IP -p tcp --dport 5222 -j DNAT --to-destination 192.168.122.112:2521 

除此之外你的iptablesconfiguration似乎没问题。 唯一可以build议的是确保你的系统允许IP转发:

 sysctl -w net.ipv4.ip_forward=1 

如果运行上面的命令解决了这个问题,你应该更新/etc/sysctl.conf以便在重新启动时保存。

正如其他人所build议的那样,运行tcpdump -nn -i any port 5222 or port 2521 KVM主机上的tcpdump -nn -i any port 5222 or port 2521都可以为您提供是否正在转发数据包的提示。 当您尝试telnet KVM_HOST_IP 5222您应该看到两个数据包。 一个去KVM_HOST_IP.5222 ,另一个去192.168.122.112.2521