Ubuntu Server с двумя сетевыми картами, как задать IP для оболочки в папке

Вопрос или проблема

Я купил сервер Ubuntu с двумя сетевыми картами:

Выполните команду ip address show, результат:

  • 172.31.0.2 публичный IP 101.47.30.28
  • 172.31.0.3 публичный IP 101.47.55.42

результат ip address show

Выполните команду route -n, результат:

результат route -n

Я создал две папки: hh01/, hh02/, в каждой папке был файл a.sh, содержание обоих:

#!/bin/bash

while true; do
    PUBLIC_IP=$(curl -s https://api.ipify.org)
    
    echo "Текущий публичный IP адрес: $PUBLIC_IP"
    
    sleep 3
done

Теперь я хочу назначить фиксированный IP адрес для каждой папки, например:

  • hh01/a.sh должен выводить 101.47.30.28
  • hh02/a.sh должен выводить 101.47.55.42

Я пробовал этот скрипт, но он не сработал:

#!/bin/bash


# Установка переменных
hh01_IP="172.31.0.2"
hh02_IP="172.31.0.3"
hh01_VETH="veth0"
hh02_VETH="veth1"
hh01_VPEER="veth0-peer"
hh02_VPEER="veth1-peer"
DEFAULT_GW="172.31.0.1"

# Создание сетевого пространства имен
ip netns add hh01
ip netns add hh02

# Создание пары veth
ip link add "$hh01_VETH" type veth peer name "$hh01_VPEER"
ip link add "$hh02_VETH" type veth peer name "$hh02_VPEER"

# Перемещение одного конца veth в пространство имен
ip link set "$hh01_VPEER" netns hh01
ip link set "$hh02_VPEER" netns hh02

# Настройка интерфейсов veth в главном пространстве имен
ip addr add "$hh01_IP"/24 dev "$hh01_VETH"
ip addr add "$hh02_IP"/24 dev "$hh02_VETH"
ip link set "$hh01_VETH" up
ip link set "$hh02_VETH" up

# Настройка интерфейсов veth в пространствах имен
ip netns exec hh01 ip addr add "$hh01_IP"/24 dev "$hh01_VPEER"
ip netns exec hh02 ip addr add "$hh02_IP"/24 dev "$hh02_VPEER"
ip netns exec hh01 ip link set "$hh01_VPEER" up
ip netns exec hh02 ip link set "$hh02_VPEER" up

# Включение интерфейсов lo в сетевых пространствах
ip netns exec hh01 ip link set lo up
ip netns exec hh02 ip link set lo up

# Настройка маршрута по умолчанию
ip netns exec hh01 ip route add default via "$DEFAULT_GW" dev "$hh01_VPEER"
ip netns exec hh02 ip route add default via "$DEFAULT_GW" dev "$hh02_VPEER"

# Настройка маршрутизации по политике, чтобы каждое пространство имен использовало разные интерфейсы для доступа к внешней сети
ip rule add from "$hh01_IP" lookup 100
ip rule add from "$hh02_IP" lookup 200

ip route add 172.31.0.0/20 dev eth0 src "$hh01_IP" table 100
ip route add default via "$DEFAULT_GW" dev eth0 table 100

ip route add 172.31.0.0/20 dev eth1 src "$hh02_IP" table 200
ip route add default via "$DEFAULT_GW" dev eth1 table 200

# Запуск процесса pm2, перемещая его в сетевое пространство имен
ip netns exec hh01 pm2 start /root/hh01/a.sh --name test-hh01
ip netns exec hh02 pm2 start /root/hh02/a.sh --name test-hh02

# Оставить SSH и другие службы в основном сетевом пространстве
echo "Настройка завершена!"
echo "Процесс test-hh01 работает в сетевом пространстве hh01"
echo "Процесс test-hh02 работает в сетевом пространстве hh02"

Ответ или решение

Чтобы настроить два сетевых интерфейса в Ubuntu Server и связать их с запущенными скриптами в разных папках, необходимо создать сетевые пространства имен. Давайте разберем, как это сделать шаг за шагом.

1. Подготовка окружения

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

2. Написание скриптов a.sh

Содержимое вашего скрипта a.sh должно быть следующим:

#!/bin/bash

while true; do
    PUBLIC_IP=$(curl -s https://api.ipify.org) || echo "Ошибка получения публичного IP"

    echo "Текущий публичный IP адрес: $PUBLIC_IP"

    sleep 3
done

3. Создание и настройка виртуальных интерфейсов и пространств имен

Создайте скрипт, который настраивает сетевые пространства имен и виртуальные интерфейсы. Ваш скрипт можно модифицировать следующим образом:

#!/bin/bash

# Установка переменных
hh01_IP="172.31.0.2"
hh02_IP="172.31.0.3"
hh01_VETH="veth0"
hh02_VETH="veth1"
hh01_VPEER="veth0-peer"
hh02_VPEER="veth1-peer"
DEFAULT_GW="172.31.0.1"

# Создание сетевых пространств имен
ip netns add hh01
ip netns add hh02

# Создание виртуальных интерфейсов
ip link add "$hh01_VETH" type veth peer name "$hh01_VPEER"
ip link add "$hh02_VETH" type veth peer name "$hh02_VPEER"

# Перемещение одного конца veth в пространство имен
ip link set "$hh01_VPEER" netns hh01
ip link set "$hh02_VPEER" netns hh02

# Конфигурация интерфейсов в главном пространстве
ip addr add "$hh01_IP"/24 dev "$hh01_VETH"
ip addr add "$hh02_IP"/24 dev "$hh02_VETH"
ip link set "$hh01_VETH" up
ip link set "$hh02_VETH" up

# Конфигурация интерфейсов в пространстве имен
ip netns exec hh01 ip addr add "$hh01_IP"/24 dev "$hh01_VPEER"
ip netns exec hh02 ip addr add "$hh02_IP"/24 dev "$hh02_VPEER"
ip netns exec hh01 ip link set "$hh01_VPEER" up
ip netns exec hh02 ip link set "$hh02_VPEER" up

# Включение интерфейса loopback
ip netns exec hh01 ip link set lo up
ip netns exec hh02 ip link set lo up

# Настройка маршрутизации по умолчанию
ip netns exec hh01 ip route add default via "$DEFAULT_GW" dev "$hh01_VPEER"
ip netns exec hh02 ip route add default via "$DEFAULT_GW" dev "$hh02_VPEER"

# Запуск скриптов в пространстве имен
ip netns exec hh01 bash /root/hh01/a.sh &
ip netns exec hh02 bash /root/hh02/a.sh &

echo "Настройка завершена!"
echo "Скрипт для hh01 запущен в сетевом пространстве hh01."
echo "Скрипт для hh02 запущен в сетевом пространстве hh02."

4. Запуск скрипта

Сохраните данный скрипт, например, под названием setup_network.sh, и выполните его:

sudo bash setup_network.sh

5. Проверка работы

Теперь вы можете проверить работу скриптов в каждом пространстве имен. Используйте команду ниже для проверки:

ip netns exec hh01 ps aux
ip netns exec hh02 ps aux

Если скрипты работают, вы будете видеть их в списках процессов в соответствующих пространствах имен.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...