我有一个服务器与一个外部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连接,这是完美的工作。
有几件事情我们应该考虑。
我在这里做错了什么?
让我们看看当前的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