iptables / KVM转发端口

我有一个服务器与一个外部IP地址(例如1.2.3.4 )。 在该服务器上,我使用libvirt来运行虚拟机。 现在我想从外部通过ssh( port 1234 )访问我的主机上的虚拟服务器。

在我的主机系统上,我得到了一个连接到我的外部IP( 1.2.3.4 )的networking接口eth0

我的虚拟机通过一个名为virbr0的NAT接口连接到主机,IP地址为192.168.122.235

由于我需要转发一个端口,我做了以下与iptable

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 1234 -j DNAT --to-destination 192.168.122.235:1234

iptables -A FORWARD -p tcp -d 192.168.122.235 --dport 1234 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

对于基本的networking,我也得到了主机上运行的UFW允许port 1234

 Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), allow (routed) New profiles: skip To Action From -- ------ ---- [SOMEOTHERPORTS] 1234/tcp ALLOW IN Anywhere 1234/tcp (v6) ALLOW IN Anywhere (v6) 

我确信所有涉及的networking接口都允许转发:

 user@someserver ~ # cat /proc/sys/net/ipv4/conf/virbr0/forwarding 1 user@someserver ~ # cat /proc/sys/net/ipv4/conf/eth0/forwarding 1 

当试图通过SSH连接到服务器从外部networking到1.2.3.4我得到:

 ssh: connect to host 1.2.3.4 port 1234: Connection refused 

我检查了主机的ssh连接,这是完美的工作。

  • 我在这里做错了什么?
  • UFW是否干涉iptables?
  • 我怎样才能得到这个工作?
  • 使用libvirt / virt-manager进行端口转发有没有更简单的方法? (我试过这个: http : //secomputing.co.uk/2012/02/21/Forwarding-ports-to-KVM-clients/ ,它不工作,因为XML是无效的,当改变/它确认,但不如果我让它在“networking”上工作)

有几件事情我们应该考虑。

我在这里做错了什么?

让我们看看当前的iptablesconfiguration,然后我们可以检查它。

UFW是否干涉iptables?

UFW是iptables的命令行前端,但缺乏iptables的许多function。 使用iptablesconfiguration将根据您input的命令向我们展示UFW的function。 但是,您不应该在同一台计算机上同时创build规则。 这是要求并发症。 如果你打算用UFWinput你的命令,但是iptables脚本应该被禁用。 如果你打算在iptables中input你的命令,那么你应该删除UFW。

我怎样才能得到这个工作?

尝试这个。

 iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 1234 -j DNAT --to 192.168.122.235:1234 iptables -A FORWARD -i eth0 -o vibr0 -p tcp --dport 1234 -j ACCEPT 

但请记住,guest虚拟机使用适配器使用NAT连接到主机。 所以这可能不会起作用。

您真正应该考虑的是将适配器types从NAT更改为桥接。

我想也应该使用桥接连接:

试着找出你的networking名称:

  virsh net-edit <network name> 

您可以在Virt Manager中看到的networking名称。 通常它是默认的:

  virsh net-edit default 

从NAT转换为网桥(也是在Virt Manager中find的网桥名称)

 <network> <name>default</name> <uuid>cc45a671-e8d8-4149-a6a5-8d5547551a58</uuid> <forward mode='route'/> <bridge name='virbr0' stp='on' delay='0'/> <mac address='AA:CC:DD:86:53:54'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip> </network> 

备注:

  • 在这个例子中,我们使用DHCP为虚拟机命名。 您也可以进行静态设置

  • 如果你使用ifconfig,你应该得到:

    virbr0 Link encap:以太网硬件地址AA:VV:CC:86:53:54
    INET地址:192.168.122.1 Bcast:192.168.122.255 Maske:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1 RX-Pakete:127 Fehler:0 Verloren:0Überläufe:0 Fenster:0 TX-Pakete:44 Fehler: 0 Verloren:0Überläufe:0Träger:0 Kollisionen:0Sendewarteschlangenlänge:0 RX-Bytes:13032(13.0 KB)TX-Bytes:4707(4.7 KB)

  • 基本上你应该使用端口22的SSH

  • 尝试使用:

    sudo iptables -t nat -A POSTROUTING -s 192.168.122.235 -j SNAT – to-source 1.2.3.4

所以你可以本地化,如果这是端口的问题。 事实上,你可以用Gufwclosures虚拟机上的端口。

这些是我的转发规则,相当不错。

 -A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN -A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE -A POSTROUTING -s 192.168.122.0/24 -o br1 -j MASQUERADE -A INPUT -s 192.168.122.0/24 -j ACCEPT -A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT -A FORWARD -i virbr0 -o virbr0 -j ACCEPT -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable -A FORWARD -i virbr0 -j ACCEPT -A FORWARD -i br1 -o virbr0 -j ACCEPT