Вопрос или проблема
Я купил сервер Ubuntu с двумя сетевыми картами:
Выполните команду ip address show
, результат:
172.31.0.2
публичный IP101.47.30.28
172.31.0.3
публичный IP101.47.55.42
Выполните команду 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-адрес и запущен с отдельным скриптом. Убедитесь, что ваши сетевые интерфейсы и маршруты настроены корректно, чтобы избежать проблем с сетевым подключением.