解决方案

解决方案

我想直接使用 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 linkip 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 的设备,vnet2Whonix-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

相关内容