我想直接使用 QEMU 而不是使用 libvirt 来运行 Whonix,并且我想手动设置内部和外部网络。使用 libvirt 我需要运行以下命令:
virsh net-define Whonix-External.xml
virsh net-define Whonix-Internal.xml
virsh net-start Whonix-External.xml
virsh net-start Whonix-Internal.xml
Whonix-External.xml:
<network>
<name>Whonix-External</name>
<forward mode='nat'/>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='10.0.2.2' netmask='255.255.255.0'/>
</network>
Whonix-Internal.xml:
<network>
<name>Whonix-Internal</name>
<bridge name='virbr2' stp='on' delay='0'/>
</network>
我只知道我必须使用ip link
和ip tuntap
命令来实现这一点,但我甚至不知道从哪里开始,尤其是 Whonix-Gateway 使用两个网络,并且 Whonix-Gateway 和 Whonix-Workstation 共享 Whonix-Internal 网络。我还知道我必须向 QEMU 命令添加-netdev
和-device
选项,但我不知道如何让 VM 选择正确的网络,例如如何告诉 Whonix-Workstation 使用 Whonix-Internal 而不是 Whonix-External。如果需要任何其他信息,请告诉我,我会根据需要编辑帖子。
解决方案
经过一个月寻找解决方案后,我找到了一种设置两个网络的方法,并决定在这里分享。
首先,我创建了名为 的桥接器virbr1
和名为 的分接设备vnet0
,即 Whonix-External 网络,用于 Whonix-Gateway:
病毒1
ip link add virbr1 type bridge
ip link set virbr1 type bridge stp_state 1
ip link set virbr1 up
vnet0
ip tuntap add dev vnet0 mode tap user $(whoami)
ip link set vnet0 master virbr1
ip link set vnet0 up
其次,我创建了网桥virbr2
和分接设备,vnet1
即 Whonix-Internal 网络,用于 Whonix-Gateway:
病毒2
ip link add virbr2 type bridge
ip link set virbr2 type bridge stp_state 1
ip link set virbr2 up
虚拟网络1
ip tuntap add dev vnet1 mode tap user $(whoami)
ip link set vnet1 master virbr2
ip link set vnet1 up
第三,我创建了名为 tap 的设备,vnet2
Whonix-Workstation 将使用它来连接 Whonix-Internal 网络:
虚拟网络2
ip tuntap add dev vnet2 mode tap user $(whoami)
ip link set vnet2 master virbr2
ip link set vnet2 up
最后我添加了iptables
规则(我决定将它们放入单独的链中,以便以后更容易清理)并启用了 IP 转发:
iptables -N WHONIX_FORWARD
iptables -A WHONIX_FORWARD -s 10.0.2.0/24 -j ACCEPT -i virbr1
iptables -A WHONIX_FORWARD -d 10.0.2.0/24 -j ACCEPT -o virbr1 -m state --state RELATED,ESTABLISHED
iptables -A FORWARD -j WHONIX_FORWARD
iptables -t nat -N WHONIX_POSTROUTING
iptables -t nat -A WHONIX_POSTROUTING -s 10.0.2.0/24 ! -d 10.0.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -j WHONIX_POSTROUTING
sysctl -wq net.ipv4.ip_forward=1
为了使其正常工作,我必须将这些选项添加到 Whonix-Gateway 的 QEMU 命令中:
-device virtio-net-pci,id=net0,netdev=hostnet0,bus=pci.0,addr=0x5,mac=MAC
-netdev tap,id=hostnet0,ifname=vnet0,script=no,downscript=no
-device virtio-net-pci,id=net1,netdev=hostnet1,bus=pci.0,addr=0x6,mac=MAC
-netdev tap,id=hostnet1,ifname=vnet1,script=no,downscript=no
我必须将这些选项添加到 Whonix-Workstation 的 QEMU 命令中:
-device virtio-net-pci,id=net0,netdev=hostnet0,bus=pci.0,addr=0x5,mac=MAC
-netdev tap,id=hostnet0,ifname=vnet2,script=no,downscript=no
虚拟机关闭后,我可以使用以下命令清理所有内容:
ip link del virbr1
ip tuntap del dev vnet0 mode tap
ip tuntap del dev vnet1 mode tap
ip link del virbr2
ip tuntap del dev vnet2 mode tap
iptables -D FORWARD -j WHONIX_FORWARD
iptables -F WHONIX_FORWARD
iptables -X WHONIX_FORWARD
iptables -t nat -D POSTROUTING -j WHONIX_POSTROUTING
iptables -t nat -F WHONIX_POSTROUTING
iptables -t nat -X WHONIX_POSTROUTING
sysctl -wq net.ipv4.ip_forward=0