Đây là một cách tốt hơn để thiết lập chuyển tiếp cổng, sử dụng tập lệnh hook ( nguồn ).
Trong /etc/libvirt/hooks/qemu
:
#!/bin/sh
GUEST_NAME=
HOST_PORT=
GUEST_IPADDR=
GUEST_PORT=
if [ "$1" = "$GUEST_NAME" ]; then
if [ "$2" = start ]; then
iptables -t nat -A PREROUTING -p tcp --dport "$HOST_PORT" \
-j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
iptables -I FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
--state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
elif [ "$2" = stopped ]; then
iptables -t nat -D PREROUTING -p tcp --dport "$HOST_PORT" \
-j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
iptables -D FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
--state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
fi
fi
Bạn nên đặt bốn biến ở trên cùng để phù hợp với thiết lập libvirt của bạn.
Bạn sẽ cần phải khởi động lại libvirt-bin, điều này trên ubfox được thực hiện với:
sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'
sau đó bạn sẽ cần phải khởi động lại khách. Trên Ubuntu, bạn sẽ cần điều chỉnh /etc/apparmor.d/usr.sbin.libvirtd
để cho phép tập lệnh hook thực thi:
Kế bên
/usr/sbin/* PUx,
chắp thêm
/etc/libvirt/hooks/* PUx,
Sau đó tải lại apparmor:
sudo service apparmor reload
Có lẽ có một cách để tự động cấu hình $GUEST_IPADDR
bằng virsh / dumpxml / iface-dumpxml, nhưng tôi không tìm thấy nó. Ngoài ra, IP có thể được đặt tĩnh trong tài liệu xml: mạng .
Theo như tôi có thể nói, các bộ lọc mạng chỉ có thể được sử dụng để hạn chế những gì xảy ra trên mạng ảo và chúng không hữu ích cho việc chuyển tiếp cổng.