network namespace + NAT notes

  • ip a
  • sudo ip link add veth0 type veth peer name veth0-peer
  • sudo ip addr add 10.200.1.1/24 dev veth0
  • sudo ip netns add firefoxns
  • sudo ip link set veth0-peer netns firefoxns
  • sudo sysctl -w net.ipv4.ip_forward=1
  • sudo iptables -t nat -A POSTROUTING -s 10.200.1.0/24 -o wlan0 -j MASQUERADE
  • sudo ip netns exec firefoxns ip addr add 10.200.1.2/24 dev veth0-peer
  • sudo ip netns exec firefoxns ip addr add 127.0.0.1/8 dev lo
  • sudo ip netns exec firefoxns ip link set lo up
  • sudo ip netns exec firefoxns ip link set veth0-peer up
  • sudo ip netns exec firefoxns ip route add default via 10.200.1.1
  • sudo ip netns exec firefoxns ip link add br0-lan type bridge
  • sudo ip netns exec firefoxns ip tuntap add tap0 mode tap
  • sudo ip netns exec firefoxns ip tuntap add tap1 mode tap
  • sudo ip netns exec firefoxns ip tuntap add tap2 mode tap
  • sudo ip netns exec firefoxns ip link set dev tap0 master br0-lan
  • sudo ip netns exec firefoxns ip link set dev tap1 master br0-lan
  • sudo ip netns exec firefoxns ip link set dev tap2 master br0-lan
  • sudo ip netns exec firefoxns ip link set dev tap0 up
  • sudo ip netns exec firefoxns ip link set dev tap1 up
  • sudo ip netns exec firefoxns ip link set dev tap2 up
  • sudo ip netns exec firefoxns ip link set dev br0-lan up
  • sudo ip netns exec firefoxns qemu-system-x86_64 -enable-kvm -m 256 -smp 4 -cpu host -drive file=chr.qcow2,format=qcow2 -boot d -nographic -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device virtio-net-pci,netdev=net0,mac=02:aa:bb:cc:dd:ee -net user,hostfwd=tcp::8291-:8291 -net nic
  • sudo ip netns exec firefoxns qemu-system-x86_64 -enable-kvm -m 256 -smp 4 -cpu host -drive file=pc-1.qcow2,format=qcow2 -cdrom alpine-virt-3.21.3-x86_64.iso -boot d -nographic -netdev tap,id=net0,ifname=tap1,script=no,downscript=no -device virtio-net-pci,netdev=net0,mac=$(randommac)

randommac source code

use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    let mac = format!(
        "52:54:00:{:02x}:{:02x}:{:02x}",
        rng.gen::<u8>(),
        rng.gen::<u8>(),
        rng.gen::<u8>()
    );
    println!("{}", mac);
}