Щоб veth працювала, один кінець тунелю повинен бути з'єднаний з іншим інтерфейсом. Оскільки ви хочете зберегти це все віртуальне, ви можете з'єднати vm1 кінець тунелю (vm2 - інший кінець тунелю) за допомогою віртуального інтерфейсу типу tap, в мості, який називається brm. Тепер ви даєте IP-адреси до brm та vm2 (10.0.0.1 та 10.0.0.2 відповідно), включаєте переадресацію IPv4 за допомогою
echo 1 > /proc/sys/net/ipv4/ip_forward
піднесіть всі інтерфейси та додайте маршрут, що вказує ядру, як досягти IP-адрес 10.0.0.0/24. Це все.
Якщо ви хочете створити більше пар, повторіть наведені нижче кроки з різними підмережами, наприклад, 10.0.1.0/24, 10.0.2.0/24 тощо. Оскільки ви ввімкнули переадресацію IPv4 та додали відповідні маршрути до таблиці маршрутизації ядра, вони зможуть поговорити один з одним відразу.
Також пам’ятайте, що більшість команд, які ви використовуєте (brctl, ifconfig, ...), є застарілими: пакет iproute2 має команди для виконання всього цього, див. Нижче моє використання команди ip .
Це правильна послідовність команд для використання інтерфейсів типу veth :
спочатку створіть усі необхідні інтерфейси,
ip link add dev vm1 type veth peer name vm2
ip link set dev vm1 up
ip tuntap add tapm mode tap
ip link set dev tapm up
ip link add brm type bridge
Зауважте, що ми не виводили brm та vm2, оскільки ми маємо призначити їм IP адреси, але ми створили tapm та vm1, що необхідно для включення їх у brm міст. Тепер поневоліть інтерфейси tapm і vm1 до brm міст,
ip link set tapm master brm
ip link set vm1 master brm
тепер надайте адреси мосту та іншому інтерфейсу veth vm2,
ip addr add 10.0.0.1/24 dev brm
ip addr add 10.0.0.2/24 dev vm2
тепер піднесіть vm2 і brm вгору,
ip link set brm up
ip link set vm2 up
Не потрібно додавати маршрут до підмережі 10.0.0.0/24 явно, він генерується автоматично ,, Ви можете перевірити з ip route show . Це призводить до
ping -c1 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.035 m
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.035/0.035/0.035/0.000 ms
Ви також можете зробити це назад, тобто від vm2 назад до brm:
ping -I 10.0.0.2 -c1 10.0.0.1
PING 10.0.0.1 (10.0.0.1) from 10.0.0.2 : 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms
Найбільш корисним застосуванням NIC типу veth є мережевий простір імен , який використовується в контейнерах Linux (LXC). Ви запускаєте nnsm таким чином
ip netns add nnsm
потім ми переносимо на нього vm2,
ip link set vm2 netns nnsm
ми надаємо новому простору імен мереж інтерфейс lo (абсолютно необхідний),
ip netns exec nnsm ip link set dev lo up
ми дозволяємо NATING в основній машині,
iptables -t nat -A POSTROUTING -o brm -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
(якщо ви підключені до Інтернету через eth0 , інакше зміните відповідно), запустіть оболонку в новому просторі мережних імен,
ip netns exec nnsm xterm &
і тепер, якщо ви почнете вводити новий xterm, ви виявите, що ви знаходитесь в окремій віртуальній машині з IP-адресою 10.0.0.2, але ви можете зайти в Інтернет. Перевага цього полягає в тому, що новий простір імен мережі має власний стек, а це означає, що, наприклад, ви можете запустити в ньому VPN, поки решта вашого ПК не знаходиться на VPN. На цьому заснована контрацепція LXC.
Редагувати:
Я допустив помилку, в результаті чого інтерфейс vm2 збиває його та очищує його адресу. Таким чином, вам потрібно додати ці команди зсередини xterm:
ip addr add 10.0.0.2/24 dev vm2
ip link set dev vm2 up
ip route add default via 10.0.0.1
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf
і тепер ви можете орієнтуватися зсередини xterm.
Ці ip
команди також можна зробити до XTerm з
ip -netns nnsm addr add 10.0.0.2/24 dev vm2
ip -netns nnsm link set dev vm2 up
ip -netns nnsm route add default via 10.0.0.1
br0
сам по собі вгору?