Получение адресов на сетевых интерфейсах по DHCP недопустимо!

Сетевые настройки необходимо выполнять с помощью netplan.
Затем netplan преобразует, написанную нами конфигурацию, в вид понятный для systemd-network.

По умолчанию в Ubuntu 18.X для управления сетевыми настройками используется сервис networking.
Его нужно отключить:

sudo systemctl disable networking.service
CODE

Конфигурационный файл /etc/network/interfaces необходимо удалить:

sudo rm /etc/network/interfaces
CODE

Настройка bonding-интерфейса

Предположим, что система имеет следующие сетевые интерфейсы, которые требуется объединить в модуль bonding:

sasha@ecss1:~$ lshw -c network
WARNING: you should run this program as super-user.
  *-network                 
       description: Ethernet interface
       product: 82566DM-2 Gigabit Network Connection
       vendor: Intel Corporation
       physical id: 19
       bus info: pci@0000:00:19.0
       logical name: enp0s25
       version: 02
       serial: e6:ba:27:44:78:35
       size: 1Gbit/s
       capacity: 1Gbit/s
       width: 32 bits
       clock: 33MHz
       capabilities: bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=e1000e driverversion=3.2.6-k duplex=full firmware=1.3-0 latency=0 link=yes multicast=yes port=twisted pair slave=yes speed=1Gbit/s
       resources: irq:24 memory:fe940000-fe95ffff memory:fe979000-fe979fff ioport:bc00(size=32)
  *-network
       description: Ethernet interface
       product: DGE-530T Gigabit Ethernet Adapter (rev 11)
       vendor: D-Link System Inc
       physical id: 0
       bus info: pci@0000:03:00.0
       logical name: enp3s0
       version: 11
       serial: e6:ba:27:44:78:35
       capacity: 1Gbit/s
       width: 32 bits
       clock: 66MHz
       capabilities: bus_master cap_list rom ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=skge driverversion=1.14 latency=64 link=no maxlatency=31 mingnt=23 multicast=yes port=twisted pair slave=yes
       resources: irq:16 memory:febfc000-febfffff ioport:e800(size=256) memory:febc0000-febdffff
CODE

Настройка bonding-интерфейса состоит из следующих этапов:

Создание bond-интерфейса

Для того чтобы определить bond-интерфейс в системе, необходимо создать следующий конфигурационный файл:

/etc/netplan/ecss.netplan Внести в него свои параметры сети:
# netplan for ecss1 biysk-work
network:
    version: 2
    renderer: networkd
    ethernets:
        enp0s25:    # Intel 82566DM-2 Gigabit Network Connection (MB)
            dhcp4: no
        enp3s0:     # D-Link DGE-530T Gigabit Ethernet Adapter (rev 11) PCI
            dhcp4: no
    bonds:
        bond1:
            interfaces:
                - enp0s25
                - enp3s0
            parameters:
                mode: active-backup
                mii-monitor-interval: 100
                primary: enp0s25
            optional: false
    vlans:
        bond1.2:    # Voip internal vlan 2
            id: 2
            link: bond1
            addresses: [192.168.2.21/24]
        bond1.3:    # mgm internal vlan 3
            id: 3
            link: bond1
            addresses: [192.168.1.21/24]
            gateway4: 192.168.1.203
            nameservers:
                addresses: [192.168.1.203]
        bond1.476:
            id: 476 # mgm techology net vlan 476
            link: bond1
            addresses: [10.16.33.5/24]
            routes:
                - to: 10.16.0.0/16
                  via: 10.16.33.254
                  on-link: true
                - to: 10.136.16.0/24
                  via: 10.16.33.254
                  on-link: true
В качестве имени интерфейса нельзя использовать bond0.

Настройка /etc/hosts

Доменное имя хоста ecss1 должно резолвиться в адрес 127.0.1.1. Также нужно прописать адрес хоста ecss2. Для этого в файле /etc/hosts необходимо прописать:

127.0.0.1 ecss1
127.0.1.1 ecss1
192.168.1.22 ecss2
CODE

Для ecss2 тоже:

127.0.0.1 ecss2
127.0.1.1 ecss2
192.168.1.21 ecss1
CODE

Настройки сети при помощи netplan

Введение

Netplan обеспечивает хранение параметров в формате YAML и предоставляет бэкенды, абстрагирующие доступ к конфигурации для NetworkManager и systemd-networkd.

Конфигурация может происходить в /{etc|run|lib}/netplan/*.yaml.
Netplan подгружает все данные файлы и применяет их.

Команды для управления netplan:

  • netplan apply - применить новые настройки
  • netplan try - попытаться применить настройки
  • netplan ip leases interface - просмотреть настройки interface (например, enp3s0 )
  • netplan ifupdown-migrate - осуществляет преобразование старых настроек /etc/network/interfaces в формат netplan.
  • netplan generate - создаёт из конфигураций с расширением .yaml специфичную конфигурацию для бэкенда (network-manager или systemd-network)

Базовые настройки

Для конфигурации netplan применяется yaml - формат сериализации данных. Ниже приведен пример автоматической настройки сетевых интерфейсов.

Очень важно соблюдать табуляцию и не смешивать табуляцию и пробелы

Пример конфигурации:

    # /etc/netplan/01-network-manager-all.yaml
    # Let NetworkManager manage all devices on this system
    network:
        version: 2
        renderer: NetworkManager
        ethernets:
            enp3s0:
                addresses: []
                dhcp4: true
                optional: true


В начале идёт секция network, с которой начинается конфигурация. Далее следует указать version, который объявляет версию yaml, на котором представлена конфигурация.
renderer - указывает netplan в какой backend транслировать, доступные: networkd (systemd-network) и NetworkdManager (Network Manager)

После определения какой backend использовать, идёт поле ethernets, которое декларирует физические проводные интерфейсы, в нём определяются сетевые интерфейсы, которые реально подключены, например, enp3s0. Для данного интерфейса указывается список статических адресов addresses, включается dhcp4 для dhcp клиента IPv4, а также optional, что означает следующее: Данный интерфейс не обязателен для загрузки системы. Поле optional: по умолчанию false, поддерживается только networkd.

Настройка интерфейсов

Общие настройки для физических интерфейсов

  • match (mapping) - выбирает интерфейсы по критерию
  • macaddress (scalar) - макадрес устройства
  • set-name (scalar) - установка имени интерфейса
  • driver (scalar) - указание имени драйвера ядра
  • wakeonlan (bool) - включение машины по сети

Общие настройки для всех типов

  • renderer (scalar) - выбор бэкенда
  • dhcp4 (bool) - получения настроек сети по dhcp IPv4
  • dhcp6 (bool) - получения настроек сети по dhcp IPv6
  • addresses (sequence of scalar) - список сетевый адресов вида a.b.c.d/mask для IPv4 или "2001:1::/64" для IPv6
  • gateway4 (scalar) - шлюз для IPv4
  • gateway6 (scalar) - шлюз для IPv6
  • nameservers (mapping) - настройка dns
  • optional (bool) - является ли обязательным при старте
  • routes (mapping) - настройка маршрутизации

Маршрутизация

  • vlans: — объявляем блок настройки vlan.
  • vlan10: — произвольное имя vlan интерфейса.
  • id: — тег нашего vlan.
  • link: — интерфейс через который vlan будет доступен.
  • routes: — объявляем блок описания маршрутов.
  • to: — задаем адрес/подсеть до которой необходим маршрут.
  • via: — указываем шлюз через которой будет доступна наша подсеть.
  • on-link: — указываем что прописывать маршруты всегда при поднятии линка.

Пример

network:
        version: 2
        ethernets:
            id0:
                match:
                    macaddress: 00:11:22:33:44:55
                wakeonlan: true
                dhcp4: true
                addresses:
                    - 192.168.14.2/24
                    - 2001:1::1/64
                gateway4: 192.168.14.1
                gateway6: 2001:1::2
                nameservers:
                    search: [foo.local, bar.local]
                    addresses: [8.8.8.8]
            lom:
                match:
                    driver: ixgbe
                set-name: lom1
                dhcp6: true
            switchports:
                match:
                    name: enp2*
                mtu: 1280
        wifis:
            all-wlans:
                match: {}
                access-points:
                    "Joe's home":
                    password: "s3kr1t" 
            wlp1s0:
                access-points:
                    "guest":
                        mode: ap
                        channel: 11
        bridges:
            br0:
                interfaces: [wlp1s0, switchports]
                dhcp4: true
                routes:
                    - to: 0.0.0.0/0
                    via: 11.0.0.1
                    metric: 3
		vlans: 
    		vlan10:
id: 10 link: bond0 dhcp4: no addresses: [10.10.10.2/24] gateway: 10.10.10.1 routes: - to: 10.10.10.2/24 via: 10.10.10.1 on-link: true

Bond (Агрегация)

Настройка бондов, агрегирование физических каналов, в логический происходит следующим образом:

Блок параметров

  • parameters (mapping)
    • mode (scalar) - Режим бонда: balance-rr(default), active-backup, balance-xor, broadcast, 802.3ad(default for ssw), balance-tlb, and balance-alb
    • mii-monitor-interval (scalar) - интервал мониторинга интерфейса(живой или нет). По умолчанию 0 (по умолчанию в милисек)
    • down-delay (scalar) - задержка перед отключением. По умолчанию 0 (по умолчанию в милисек).
    • up-delay (scalar) - задержка перед включением. По умолчанию 0 (по умолчанию в милисек).
    • lacp-rate (fast|slow) - Только в 802.3ad. Скорость передачи LACPDU.
    • transmit-hash-policy (salar) - Политика передачи хэша для выбора ведомых. Полезно в balance-xor, 802.3ad и balance-tlb. Возможные значения: layer2, layer3+4, layer2+3, encap2+3, and encap3+4.
    bonds:
        bond0:
            interfaces: [enp1s0f0, en01s0f1]
            addresses: [10.110.1.253/24]
            gateway4: 10.1.1.1
            parameters:
                    mode: 802.3ad
            nameservers:
                addresses: [10.110.10.22]

Основные параметры это:

  • interfaces (sequence of scalar) - список физических интерфейсов, которые необходимо объединить в один
  • parameters (mapping) - настройки агрегации
   network:
        version: 2
        renderer: networkd
        ethernets:
            enp0s3
                dhcp4: no
            enp0s8:
                dhcp4: no
        bonds:
            bond-ssw:
                dhcp4: yes
                interfaces:
                    - enp0s3
                    - enp0s8
                parameters:
                    mode: 802.3ad
                optional: true
  • bonds: — блок поясняющий что мы будем настраивать bonding.
  • bond0: — произвольное имя интерфейса.
  • interfaces: — набор интерфейсов собираемых в bond-динг, ''как оговаривалось ранее если параметров несколько описываем их в квадратных скобках".
  • parameters: — описываем блок настройки параметров
  • mode: — указываем мод по которому будет работать bonding.
  • mii-monitor-interval: — задаем интервал мониторинга 1 сек.
 bonds:
    bond0:
      dhcp4: no
      interfaces: [enp3s0f0, enp3s0f1]
      parameters: 
        mode: 802.3ad
        mii-monitor-interval: 1

Vlan

Настройка виртуальных интерфейсов мало чем отличается от настройки физического

    vlans:
        vdev:
            id: 101
            link: net1
            addresses:
                - 10.0.1.10/24
        vprod:
            id: 102
            link: net2
            addresses:
                - 10.0.2.10/24
        vtest:
            id: 103
            link: net3
            addresses:
                - 10.0.3.10/24
        vmgmt:
            id: 104
            link: net4
            addresses:
                - 10.0.4.10/24

Для определения vlan служит секция `vlans`, в ней определяются имена новых vlan'ов. У vlan есть 2 обязательных аргумента: `id` и `link`.

  • id (scalar) - номер vlan
  • link (scalar) - родительский интерфейс

Пример

# Пример конфигурации для настройки ECSS-10
# В варианте когда каждый хост подключен к коммутаторам выделенным линком
# Коммутаторы организованны в erps-кольцо
network:
    version: 2 # Версия
    renderer: networkd # systemd
    ethernets: # настройка сетевых интерфейсов
        enp1s0f0: # Наименование интерфейса. Может быть иным
            dhcp4: no # Отключаем настройку по dhcp
            dhcp6: no # Отключаем настройку по dhcp v6
        enp1s0f1:
            dhcp4: no
            dhcp6: no
        enp2s1:
            dhcp4: no
            dhcp6: no

    bonds: # Связываем физические интерфейсы в бонды для отказоустойчивости
        bond1: # Наименование бонда
            interfaces: # перечисляем интерфейсы, которые входят в данный бонд
                - enp1s0f0
                - enp1s0f1
            parameters: # Параметры агрегации
                mode: active-backup # Рекомендуемый режим для линков подключенных к коммутаторам в ERPS-кольце
                primary: enp1s0f0 # Основной интерфейс
                mii-monitor-interval: 100ms
                up-delay: 100ms
                down-delay: 200ms
                lacp-rate: fast
            optional: false

    vlans: # Настраиваем vlan
        vlan.80: # Название vlan
            id: 80 # тэг vlan
            link: bond1 # на каком интерфейсе будет добавляться тэг
            addresses:
                - 10.80.0.10/26 # адрес
            nameservers: # На другой внутренней машине настроен dns
                addresses:
                    - 172.16.0.250
                    - 172.16.0.100

Настройка VRRP

Для настройки механизма резервирования сервера посредством протокола VRRP используется функционал, который предоставляет приложение keepalived.

  1. На первом сервере нужно создать файл конфигурации /etc/keepalived/keepalived.conf со следующим содержимым (адреса и имена интерфейсов прописать свои):

    Пример:

    vrrp_script chk_sip {
        script "/usr/bin/ecss_pa_sip_port 65535"
        interval 2
        timeout 2
    }
    
    vrrp_script check_core {
           script "nc -z localhost 8085"
           interval 2                      # check every 2 seconds
    }
    
    #For domain_bsk_ecss1 SIP
    vrrp_instance VI_SIP_61 {
        state MASTER
        interface bond1.2
        virtual_router_id 61
        priority 100
        advert_int 1
        preempt_delay 60
        unicast_src_ip 192.168.2.21
        unicast_peer {
            192.168.2.22
        }
    
        authentication {
            auth_type PASS
            auth_pass kassw2
            }
        virtual_ipaddress {
            192.168.2.61/24 dev bond1.2 label bond1.2:SIP61
            }
        track_script {
            chk_sip
            }
        }
    
    #For domain_bsk_ecss2 SIP
    vrrp_instance VI_SIP_62 {
        state BACKUP
        interface bond1.2
        virtual_router_id 62
        priority 50
        advert_int 1
        smtp_alert
        preempt_delay 60
        unicast_src_ip 192.168.2.21
        unicast_peer {
            192.168.2.22
        }
        authentication {
            auth_type PASS
            auth_pass kassw2
            }
        virtual_ipaddress {
            192.168.2.62/24 dev bond1.2 label bond1.2:SIP62
            }
        }
    
    
    #For TC ecss1
    vrrp_instance VI_TC63 {
        state BACKUP
        interface bond1.2
        virtual_router_id 63
        priority 100
        advert_int 1
        preempt_delay 20
        unicast_src_ip 192.168.2.21
        unicast_peer {
             192.168.2.22
        }
         authentication {
             auth_type PASS
             auth_pass kassw2
             }
    
         virtual_ipaddress {
         192.168.2.63/24 dev bond1.2 label bond1.2:TC
         }
         track_script {
         check_core
         }
    }
    include ecss-mysql-replication.conf
    
    CODE
  2. На первом сервере создается файл с конфигурацией MySQL /etc/keepalived/ecss-mysql-replication.conf

    vrrp_script check_mysqld {
        script "nc -z localhost 3306"    # cheaper than pidof
        interval 2                     # check every 2 seconds
        fall 1
        rise 2
    }
    
    #For MySQL
    vrrp_instance MySQL71 {
        state BACKUP
        interface bond1.3
        virtual_router_id 71
        priority 100
        advert_int 1
         preempt_delay 10
         unicast_src_ip 192.168.1.21
         unicast_peer {
             192.168.1.21
        }
        authentication {
            auth_type PASS
            auth_pass pmysql
            }
        virtual_ipaddress {
            192.168.1.71/24 dev bond1.3 label bond1.3:MYSQL
            }
        track_script {
            check_mysqld
            }
    }
    CODE
  3. На втором сервере нужно создать аналогичный файл /etc/keepalived/keepalived.conf со следующим содержимым:

    vrrp_script chk_sip {
        script "/usr/bin/ecss_pa_sip_port 65535"
        interval 2
        timeout 2
    }
    
    vrrp_script check_core {
           script "nc -z localhost 8085" 
           interval 2                      # check every 2 seconds
    }
    
    #For domain_bsk_ecss1 SIP
    vrrp_instance VI_SIP_62 {
        state MASTER
        interface bond1.2
        virtual_router_id 62
        priority 100
        advert_int 1
        preempt_delay 60
        unicast_src_ip 192.168.2.22
        unicast_peer {
            192.168.2.21
        }
        authentication {
            auth_type PASS
            auth_pass kassw2
            }
        virtual_ipaddress {
            192.168.2.62/24 dev bond1.2 label bond1.2:SIP62
            }
        track_script {
            chk_sip
            }
        }
    
    #For domain_bsk_ecss2 SIP
    vrrp_instance VI_SIP_61 {
        state BACKUP
        interface bond1.2
        virtual_router_id 61
        priority 50
        advert_int 1
        smtp_alert
        preempt_delay 60
        unicast_src_ip 192.168.2.22
        unicast_peer {
            192.168.2.21
        }
        authentication {
            auth_type PASS
            auth_pass kassw2
            }
        virtual_ipaddress {
            192.168.2.61/24 dev bond1.2 label bond1.2:SIP61
            }
        }
    
    #For TC ecss1
    vrrp_instance VI_TC63 {
        state BACKUP
        interface bond1.2
        virtual_router_id 63
        priority 80
        advert_int 1
        preempt_delay 20
        unicast_src_ip 192.168.2.22
        unicast_peer {
             192.168.2.21
        }
         authentication {
             auth_type PASS
             auth_pass kassw2
             }
         virtual_ipaddress {
         192.168.2.63/24 dev bond1.2 label bond1.2:TC
         }
         track_script {
         check_core
         }
    }
    include ecss-mysql-replication.conf
    CODE
  4. На втором сервере создается файл с конфигурацией MySQL /etc/keepalived/ecss-mysql-replication.conf

    vrrp_script check_mysqld {
        script "nc -z localhost 3306"    # cheaper than pidof
        interval 2                     # check every 2 seconds
        fall 1
        rise 2
    }
    
    #For MySQL
    vrrp_instance MySQL71 {
        state BACKUP
        interface bond1.3
        virtual_router_id 71
        priority 80
        advert_int 1
         preempt_delay 20
         unicast_src_ip 192.168.1.22
         unicast_peer {
             192.168.1.21
        }
        authentication {
            auth_type PASS
            auth_pass pmysql
            }
        virtual_ipaddress {
            192.168.1.71/24 dev bond1.3 label bond1.3:MYSQL
            }
        track_script {
            check_mysqld
            }
    }
    CODE

Далее нужно произвести корректировку IP-адресов и имен интерфейсов, согласно конфигурации системы.

Более подробная информация о приложении keepalived и его настройке приведена в документации по адресу: http://www.keepalived.org/pdf/UserGuide.pdf.

Изменён скрипт проверки доступности контрольного сип порта. Теперь скрипт из keepalive нужно вызывать следующим образом:
/usr/bin/ecss_pa_sip_port 65535, где 65535 дефолтное значение порта, который адаптер открывает в случае, когда он готов принимать нагрузку. Для того, чтобы изменить
порт необходимо в конфиге sip адаптера (/etc/ecss/ecss_pa_sip/sip1.config) в секции ip_ssw_intercom изменить в параметрe keepalive значение порта, после чего перезапустить адаптер.