Картина для привлечения внимания: http://dump.bitcheese.net/files/vaxurut/scrot.png
И так, есть домашний ПК, есть провайдер, шнур с интернетом от которого идёт прямо в ПК. Наш ПК в сети. Однако захотелось сделать так, чтобы наш ПК небыл в сети, а в сети была _виртуальная машина_, которая уже затем раздаёт интернеты на наш ПК и другие умные устройства. Таким образом, наш ПК не имея адреса в сети, становится полностью неуязвимым. Поправьте, если ошибаюсь. А ошибаться я могу, ну вы же знаете, админы подкроватных локалхостов, куда уж нам...
В общем для реализации потребуется qemu и какой-нибудь дистрибутив по вкусу, я выбрал конечно CRUX.
Нужно ли объяснять процесс установки?
wget http://ftp.morpheus.net/pub/linux/crux/latest/iso/crux-3.4.iso
mount crux-3.4.iso /mnt/crux
dd if=/dev/zero of=crux.raw bs=1M count=1000
losetup /dev/loop0 crux.raw
fdisk /dev/loop0 # или fdisk crux.raw
# n
# enter
# enter
# enter
# w
mount /dev/loop0p1 /mnt/rootfs # или mount -o offset=$((512 * 2048)) crux.raw
mkdir -p /mnt/rootfs/var/lib/pkg
touch /mnt/rootfs/var/lib/pkg/db
for pkg in /mnt/crux/crux/core/*; do pkgadd --root /mnt/rootfs/ $pkg; done
echo "/dev/sda1 / ext4 defaults 0 1" >> /mnt/rootfs/etc/fstab
Усё. CRUX условно готов к работе в виртуальной машине, в общем-то дело за ядром, для полноты картины оставлю тоже это тут.
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.tar.xz
tar xf linux-4.20.tar.xz
cd linux-4.20
make defconfig
make -j$(nproc) all
env cp arch/x86/boot/bzImage /mnt/rootfs/boot/vmlinuz
env INSTALL_MOD_PATH=/mnt/rootfs make modules_install
sync # или umount /mnt/{crux,rootfs}
Можно запустить виртуальную машину с только что установленным CRUX, которая и будет нашим шлюзом в интернет.
qemu-system-x86_64 \
-machine type=pc,accel=kvm \
-cpu host \
-boot order=c \
-drive file=crux.raw,format=raw \
-nic tap,mac=<Ваш MAC-адрес> \ # это будет WAN-порт
-nic tap \ # это будет LAN-порт
-kernel /mnt/rootfs/boot/vmlinuz -append "root=/dev/sda1"
Как видно из параметров, у виртуальной машины будет две сетевые карты, одна — клонирует мак-адрес вашей сетевой карты с провайдером, она же выполняет роль WAN-порта в роутере, вторая будет служить для раздачи интернетов, она же выполняет роль LAN-порта в роутере.
Напомню, что от интернетов сетевую карту на вашем ПК надо отключить, просто лишить её IP-адреса, оставив в режиме UP.
ip addr del xx.xx.xx.xx dev enp1s0u4h3l2p4a3q4t5b9d0n7m2x3 # лёня привет
Дальше всё просто. При помощи первого моста (linux bridge) мы настроим общение между вашей физической сетевой картой и первой сетевой картой вирт. машины, а при помощи второго моста мы настроим общение между всеми условными хостами и второй сетевой картой вирт. машины, которая интернет раздаёт. Считайте что бридж это коммутатор, свич, который тупо пересылает пакеты.
# включили первый свич
ip link add name br0 type bridge
ip link set br0 up
# в один порт воткнули кабель провайдера
ip link set enp1s0 master br0
ip link set enp1s0 up
# в другой порт воткнули кабель от виртуалки
ip link set tap0 master br0
ip link set tap0 up
Таким элементарным образом настроено общение между кабелем провайдера и первой сетевой картой виртуальной машины, где вы указывали свой мак-адрес. Прямо сейчас, вы можете настроить интернет на виртуальной машине, так, как если бы его настраивали на обычном ПК, и этот интернет будет работать. Если у провайдера IPoE — просто dhcpcd enp0s3
, если PPPoE, настраиваем на виртуалке PPPoE, всё как обычно в общем.
Если у вас какой-то другой интерфейс, куда приходит интернет, например это может быть не сетевая карта, а USB-модем, то соответственно в порт так называемого «свича» втыкаем кабель с этим интерфейсом, — ip link set usb0 master br0
.
И ещё один свич, который будет связывать нас и второй интерфейс сетевой карты виртуальной машины, раздающий интернеты.
# включили второй свич
ip link add name br1 type bridge
ip link set br1 up
# в один порт воткнули кабель виртуальной машины раздающий интернеты
ip link set tap1 master br1
ip link set tap1 up
В другой порт «свича» пока ничего не «втыкаем», но опять же на этом этапе это уже может быть ваша вторая сетевая карта на ПК, которая например раздаёт интернеты дальше уже на реальный свич, и так далее. Но мы пока ограничимся только нашей хост-системой. Поэтому пока ничего.
На этом настройка ПК закончена, переходим к виртуальной машине. Собственно, там надо настроить интернеты на первом интерфейсе enp0s3, как это сделать — точно так же, как вы обычно настраиваете их на своём ПК. В случае IPoE, повторюсь, достаточно dhcpcd. Если интернеты настроены, о чём ping linux.org.ru радостно сообщает, теперь останется лишь настроить раздачу интернетов на вторую сетевую карту виртуальной машины.
Переходим к настройке виртуальной машины.
Поднимем интерфейс на второй сетевой карте, который будет обслуживать 192.168.0.0/24 подсеть и раздавать туда IP-адреса.
ip addr add 192.168.0.1/24 dev enp0s4 broadcast +
ip link set enp0s4 up
Установим DHCP в CRUX
Настроим DHCP
# cat > /etc/dhcpd.conf << EOF
authoritative;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
subnet 192.168.0.0 netmask 255.255.255.0 {
option domain-name "VirtualMachine";
option domain-name-servers 8.8.8.8, 8.8.4.4;
option routers 192.168.0.1;
range 192.168.0.2 192.168.0.254;
}
EOF
Запустим DHCP
Ну и настроим раздачу интернетов.
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o enp0s3 -j MASQUERADE
На этом всё. И так...
Сетевая карта enp1s0 из которой кабель провайдера заходит в свич br0, далее кабель из br0 выходит на первую сетевую карту виртуальной машины enp0s3.
Виртуальная машина получает интернеты тем или иным образом на сетевую карту enp0s3, затем раздаёт их на вторую сетевую карту enp0s4, откуда кабель идёт на второй свич br1.
br1 — теперь ваш доступ в интернет.
Сюда можно включить вторую реальную сетевую карту с реальным свичём, а можно подключиться самому.
И вуа-ля! Мы в интернете через виртуальную машину, при этом наша хост-система недосягаема «из вне».
TL;DR
Возвращаясь к картинке http://dump.bitcheese.net/files/vaxurut/scrot.png, поясню что на ней. Слева направо: выхлоп красивого ifconfig на хост-системе. Далее окошечко с виртуальной машиной и чуть ниже SSH-подключение к ней же, с выхлопом ifconfig уже самой виртуалки. Далее тестируем подключение к br1, тестируем получение локального IP-адреса, тестируем подключение к интернету и что реально всё работает! Ну а в самом низу просто запуск виртуалки. Да.
Замечания и предложения приветствуются! Всем спасибо.
Перемещено leave из talks