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);
}