Bash скрипт для динамического создания виртуальных сетевых интерфейсов - PullRequest
1 голос
/ 05 марта 2020

Я пишу bash приложение, которое работает на кластере серверов Ubuntu 18.04 и обеспечивает и синхронизирует учетные записи пользователей на нескольких серверах, развернутых в разных географических c регионах. Сервер позволяет перенаправлять пользователей на соответствующий сервер geographi c в зависимости от их текущего местоположения, а затем предоставляет им доступ к оболочке S SH.

Сервер в настоящее время имеет один сетевой интерфейс c (eth0). Я пытаюсь включить предоставление дополнительных «виртуальных» сетевых интерфейсов для каждого пользователя в сценарий bash. Это должно позволить каждому пользователю иметь отдельный внутренний IP-адрес, который должен иметь доступ к inte rnet с настроенными правилами NAT. Каждому пользователю всегда будет предоставлен один и тот же внутренний IP-адрес независимо от того, на какой географический сервер c он перенаправлен.

Например, следующий файл конфигурации определяет имена виртуальных интерфейсов и IP-адреса для каждого пользователя, который входит в систему. Этот файл конфигурации синхронизируется на каждом сервере с помощью написанного мной REST API:

{
  "users": [
    {
      "username": "user0",
      "interface": "veth0",
      "ip_address": "192.168.1.0"
    },
    {
      "username": "user1",
      "interface": "veth1",
      "ip_address": "192.168.1.1"
    },
    {
      "username": "user2",
      "interface": "veth2",
      "ip_address": "192.168.1.2"
    },
    {
      "username": "user3",
      "interface": "veth3",
      "ip_address": "192.168.1.3"
    }
  ]
} 

Если пользователь2 входит на сервер, сценарий bash автоматически создает соответствующий интерфейс и IP-адрес следующим образом:

ip link add type $interface
ifconfig $interface $ip_address

Это добавляет следующее к выводу ifconfig:

veth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.1.2  netmask 255.255.255.0  broadcast 192.168.1.255
    ether a6:e7:de:40:9a:28  txqueuelen 1000  (Ethernet)
    RX packets 27  bytes 2082 (2.0 KB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 1132  bytes 48520 (48.5 KB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

I для сервера "/ proc / sys / net / ipv4 / ip_forward" установлено значение 1 для включения пересылки IP-адресов, но я не могу определить правильные правила iptables MASQUERADE, FORWARD и NAT для добавления в сценарий запуска.

Пока я не могу получить доступ к rnet, работающему через виртуальные интерфейсы.

Я не могу понять, что я делаю неправильно, и любая помощь будет оценена.

1 Ответ

0 голосов
/ 05 марта 2020

Я смог решить эту проблему, автоматизировав создание сетевых пространств имен с двумя парами веток следующим образом:

#!/bin/bash

#enable port forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

#create network namespace (netns0)
ip netns add $netns

#add loopback interface to namespace
ip netns exec $netns ip link set lo up

#create veth pairs
ip link add $vetha type veth peer name $vethb

#add $vethb to namespace
ip link set $vethb netns $netns

#add ip addresses to interfaces
ip addr add $ip1 dev $vetha
ip netns exec $netns ip addr add $ip2 dev $vethb

#enable interfaces
ip link set $vetha up
ip netns exec $netns ip link set $vethb up

#enable ip forwarding and nating with iptables
iptables -A FORWARD -o eth0 -i $vetha -j ACCEPT
iptables -A FORWARD -i eth0 -o $vetha -j ACCEPT
iptables -t nat -A POSTROUTING -s $ip2 -o eth0 -j MASQUERADE

#add default route to namespace
ip netns exec $netns ip route add default via $ip1

#set dns servers for namespace
mkdir -p /etc/netns/netns0
echo "nameserver 1.1.1.1" > /etc/netns/netns0/resolv.conf
...