Сервер Ubuntu — «виртуальный» сетевой интерфейс с доступом в Интернет

На самом деле я не искал надежного ответа, так как это был просто экспериментальный проект.

Решение, которое я нашел для себя, состояло в том, чтобы сделать владельцем символической ссылки root.

sudo chown root myapp
0
05.03.2020, 00:41
2 ответа

Я принял ответ @StefanSkoglund, поскольку он указал мне правильное направление для решения этой проблемы, однако я хотел опубликовать свое полное решение ниже для всех, кто сочтет его полезным.

Следующее руководство помогало мне на этом пути:

https://josephmuia.ca/2018-05-16-net-namespaces-veth-nat/

По сути, мне пришлось создать две пары интерфейсов veth и присоединить одну к новому сетевому пространству имен. Следующие команды выполнили это:

Сначала я включил IP-переадресацию со следующим:

echo 1 > /proc/sys/net/ipv4/ip_forward

Затем я создал новое сетевое пространство имен (netns0 )и подключил к нему новый адаптер обратной связи. Без этого шага не получится:

ip netns add netns0
ip netns exec netns0 ip link set lo up

Затем я создал две пары veth. В основном они функционируют как два конца линии Ethernet. Один конец остается в основной сети, а другой конец подключен к сетевому пространству имен :

.
ip link add veth0a type veth peer name veth0b
ip link set veth0b netns netns0

Затем я установил IP-адреса для каждого интерфейса в паре и включил их:

ip addr add 192.168.0.1/24 dev veth0a
ip netns exec netns0 ip addr add 192.168.0.2/24 dev veth0b
ip link set veth0a up
ip netns exec netns0 ip link set veth0b up

Следующие правила iptable включают переадресацию и натирование:

iptables -A FORWARD -o eth0 -i veth0a -j ACCEPT
iptables -A FORWARD -i eth0 -o veth0a -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.2/24 -o eth0 -j MASQUERADE

Следующая команда устанавливает маршрут по умолчанию для пространства имен. Это необходимо для связи с основной сетью :

.
ip netns exec netns0 ip route add default via 192.168.0.1

Наконец, я создал файл resolv.conf для конкретного пространства имен с моими DNS-серверами. Это важно для разрешения доменных имен из сетевого пространства имен :

.
mkdir -p /etc/netns/netns0
echo "nameserver 1.1.1.1" > /etc/netns/netns0/resolv.conf

После этих шагов я могу общаться с Интернетом, используя сетевое пространство имен:

$ ip netns exec netns0 ping google.com

PING google.com (172.217.10.238) 56(84) bytes of data.
64 bytes from lga25s59-in-f14.1e100.net (172.217.10.238): icmp_seq=1 ttl=57 time=2.50 ms
64 bytes from lga25s59-in-f14.1e100.net (172.217.10.238): icmp_seq=2 ttl=57 time=1.44 ms
64 bytes from lga25s59-in-f14.1e100.net (172.217.10.238): icmp_seq=3 ttl=57 time=1.39 ms
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.392/1.779/2.505/0.514 ms

Использование «ip netns exec netns0 (КОМАНДА )» позволяет запускать команды с этим пространством имен.

2
28.04.2021, 23:21

Если вы хотите использовать компьютер в качестве хоста для виртуальных машин, вы также хотите, чтобы физическая и виртуальная машины были доступны в обоих направлениях, но если у вас есть только один интерфейс...

необходимо использовать мост (вы создаете их с помощью brctl или NetworkManager :s nmcli. )Хотя macvtap например меняет это.

ОС физического компьютера не будет видеть даже запросы ARP от виртуальных машин (, если вы не соедините виртуальные машины и хост через виртуальный мост )из-за особенностей сетевого стека в Linux.

В последней части этого :https://wiki.archlinux.org/index.php/Network_bridge, это рецепт, который я использовал, чтобы позволить физическому хосту и виртуальным машинам в машине связаться друг с другом.

Другим решением могут быть правила закрепления волос -в вашем маршрутизаторе/брандмауэре.

Вhttp://man7.org/linux/man-pages/man4/veth.4.htmlобсуждаются устройства veth,поэтому в своем примере они рассматривают устройство veth как канал с двумя именами. Вы не добавили имя сверстника в своем примере.

0
28.04.2021, 23:21

Теги

Похожие вопросы