Рейтинг:0

Заставить новый процесс использовать определенный сетевой интерфейс (используя пространства имен netns/network)

флаг cn

У меня есть несколько интерфейсов, доступных на машине с Ubuntu 20.04. Среди прочего enx0c5b8f279a64 и usb0 причем последний используется по умолчанию. Я хочу убедиться, что конкретный процесс, запущенный в терминале, будет использовать только один из этих интерфейсов (например, enx0c5b8f279a64 даже если другой интерфейс используется по умолчанию). Если этот процесс запущен и выбран enx0c5b8f279a64 интерфейс недоступен, не следует даже пытаться использовать какой-либо другой интерфейс в качестве запасного варианта (как если бы другие интерфейсы даже не существовали с точки зрения этого процесса).

я так думаю IP-сети это путь, но у меня проблемы с реализацией любого рабочего решения. я пытался https://superuser.com/a/750412 однако я получаю Хост назначения недоступен если я попытаюсь пропинговать 8.8.8.8 :(

Соответствующая часть айпи а с вывод:

 9: enx0c5b8f279a64: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel состояние UP группа по умолчанию qlen 1000
     ссылка/эфир 12:12:12:12:12:12 брд ff:ff:ff:ff:ff:ff
     inet 192.168.7.100/24 ​​brd 192.168.7.255 область глобальная динамическая noprefixroute enx0c5b8f279a64
        valid_lft 84611sec предпочитаемый_lft 84611sec
     inet6 2323::2323:2323:2323:2323/64 ссылка на область действия noprefixroute 
        valid_lft навсегда
 10: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel состояние НЕИЗВЕСТНО группа по умолчанию qlen 1000
     ссылка/эфир 34:34:34:34:34:34 брд ff:ff:ff:ff:ff:ff
     inet 192.168.42.**47**/24 brd 192.168.42.255 область глобальная динамическая noprefixroute usb0
        valid_lft 1858 сек. selected_lft 1 858 сек.
     inet6 4545:454:545:4545:454:5454:5454:5454/64 область глобальная временная устаревшая динамическая 
        valid_lft 2461 сек. preferred_lft 0 сек.
     inet6 5656:565:656:5656:5656:5656:5656:5656/64 область глобальная устаревшая динамическая mngtmpaddr noprefixroute 
        valid_lft 2461 сек. preferred_lft 0 сек.
     inet6 6767::6767:6767:6767:6767/64 ссылка на область действия noprefixroute 
        valid_lft навсегда

и таблица маршрутов:

 маршрут -n
 Таблица IP-маршрутизации ядра
 Шлюз назначения Флаги Генмаски Метрика Ссылка Использование Iface
 0.0.0.0 192.168.7.1 0.0.0.0 UG 100 0 0 enx0c5b8f279a64
 0.0.0.0 192.168.42.129 0.0.0.0 UG 101 0 0 usb0
 192.168.7.0 0.0.0.0 255.255.255.0 U 100 0 0 enx0c5b8f279a64
 192.168.42.0 0.0.0.0 255.255.255.0 U 101 0 0 usb0

До сих пор все решения, которые я пробовал, начинались аналогичным образом:

# создать пространство имен
sudo ip netns добавить nspace0
# создать ссылку
sudo ip link add veth0 type veth имя однорангового узла veth1
# переместить ссылку
набор ссылок sudo ip veth1 netns nspace0

# СДЕЛАЙТЕ ВОЛШЕБСТВО 
# (ни одно из решений, которые я пытался здесь адаптировать, мне пока не помогло).
...

# запустить процесс в пространстве имен (в качестве примера я использую curl) 
sudo ip netns exec nspace0 curl ifconfig.me/ip

Но проблема в том МАГИЯ часть. Я видел несколько подходов с мостами и другими решениями для переадресации IP-адресов. К сожалению, ни один из них не работал у меня до сих пор, и я не настолько разбираюсь в сетях, чтобы иметь возможность диагностировать и исправлять.

Рейтинг:1
флаг cn

Кажется, он работает со следующим скриптом. Дополнительная функция, которой не было в моем первоначальном вопросе, заключается в том, как сохранить интерфейс как в основном, так и в новом пространстве имен (но я займусь этим позже). Ниже приводится довольно описательное решение, основанное на информации, представленной в: здесь, здесь, здесь, здесь, здесь и здесь.

# Сохраняем настройки по умолчанию в файлы для удобства
IP-адрес > log_000.ip_addr.txt
IP-ссылка > log_000.ip_link.txt
IP-маршрут > log_000.ip_route.txt
маршрут -n > log_000.route_n.txt

# Интерфейсы
ИНТЕРФЕЙС_0="usb0"
ИНТЕРФЕЙС_1="enx0c5b8f279a64"

# Собираем информацию о текущей конфигурации
PUBL_IP=$(curl --silent ifconfig.me/ip)
INTERFACE_0_PUBL_IP=$(curl --silent --interface ${INTERFACE_0} ifconfig.me/ip)
INTERFACE_1_PUBL_IP=$(curl --silent --interface ${INTERFACE_1} ifconfig.me/ip)

INTERFACE_0_PRIV_IP=$(IP-адрес шоу ${INTERFACE_0} | awk '/inet/{print $2}')
INTERFACE_1_PRIV_IP=$(IP-адрес шоу ${INTERFACE_1} | awk '/inet/{print $2}')

INTERFACE_0_GATE=$(ip route show dev ${INTERFACE_0} | awk '/по умолчанию через/ {print $3}')
INTERFACE_1_GATE=$(ip route show dev ${INTERFACE_1} | awk '/по умолчанию через/ {print $3}')

эхо "" > log_001.IPs.txt
echo "PUBL_IP: ${PUBL_IP}" >> log_001.IPs.txt
эхо "==========================================" >> log_001 .IPs.txt
echo "INTERFACE_0_PUBL_IP: ${INTERFACE_0_PUBL_IP}" >> log_001.IPs.txt
echo "INTERFACE_0_PRIV_IP: ${INTERFACE_0_PRIV_IP}" >> log_001.IPs.txt
echo "INTERFACE_0_GATE: ${INTERFACE_0_GATE}" >> log_001.IPs.txt
эхо "==========================================" >> log_001 .IPs.txt
echo "INTERFACE_1_PUBL_IP: ${INTERFACE_1_PUBL_IP}" >> log_001.IPs.txt
echo "INTERFACE_1_PRIV_IP: ${INTERFACE_1_PRIV_IP}" >> log_001.IPs.txt
echo "INTERFACE_1_GATE: ${INTERFACE_1_GATE}" >> log_001.IPs.txt
кошка log_001.IPs.txt

NAMESPACE_1="ns1"

# НАСТРОЙКА: Создайте новое пространство имен.
sudo ip netns добавить ${NAMESPACE_1}

# ПРОВЕРКА: Убедитесь, что пространство имен создано.
список sudo ip netns

# ПРОВЕРКА: Список интерфейсов в основном и новом пространстве имен
IP-адрес показать
sudo ip netns exec ${NAMESPACE_1} IP-адрес показать

# НАСТРОЙКА: Связать (переместить) интерфейс в пространство имен.
# Обратите внимание, что этот интерфейс больше не будет доступен в основном (по умолчанию) пространстве имен.
sudo ip link set ${INTERFACE_1} netns ${NAMESPACE_1}

# ПРОВЕРКА: убедитесь, что интерфейс был перемещен из основного в новое пространство имен.
IP-адрес показать
sudo ip netns exec ${NAMESPACE_1} IP-адрес показать

# НАСТРОЙКА: Установите IP-адрес интерфейса в новом пространстве имен и вызовите его.
# TODO: проверьте, что адрес должен быть таким же, как в основном пространстве имен.
sudo ip netns exec ${NAMESPACE_1} ifconfig ${INTERFACE_1} ${INTERFACE_1_PRIV_IP} up

# НАСТРОЙКА: вызовите петлевой интерфейс (поскольку он может понадобиться процессам, работающим в новом пространстве имен).
sudo ip netns exec ${NAMESPACE_1} ifconfig lo 127.0.0.1/8 вверх

# ПРОВЕРКА: список интерфейсов (loopback и INTERFACE_1) в новом пространстве имен
sudo ip netns exec ${NAMESPACE_1} IP-адрес показать

# ПРОВЕРКА: Проверьте таблицу маршрутов.
sudo ip netns exec ${NAMESPACE_1} маршрут -n

# НАСТРОЙКА: добавьте шлюз по умолчанию для маршрутизации в новом пространстве имен.
sudo ip netns exec ${NAMESPACE_1} route добавить gw по умолчанию 192.168.7.1

# ПРОВЕРКА: снова проверьте таблицу маршрутов.
sudo ip netns exec ${NAMESPACE_1} маршрут -n

# СДЕЛАНО: Использовать новое пространство имен.
sudo ip netns exec ${NAMESPACE_1} пинг 8.8.8.8
sudo ip netns exec ${NAMESPACE_1} traceroute 8.8.8.8

# НАСТРОЙКА: исправить DNS
sudo mkdir -pv /etc/netns/${NAMESPACE_1}
sudo echo "сервер имен 8.8.8.8" > /etc/netns/${NAMESPACE_1}/resolv.conf


sudo ip netns exec ${NAMESPACE_1} curl ifconfig.me/ip
sudo ip netns exec ${NAMESPACE_1} curl --silent ifconfig.me/ip

# ДОПОЛНИТЕЛЬНО: отменить изменения (вернуться к исходному состоянию настроек IP)
sudo ip netns del ${NAMESPACE_1}

Ответить или комментировать

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