Группа процессов A маршрут по умолчанию tun0, B маршрут по умолчанию tun1 и т. д.
У меня есть окно Linux с N туннельными интерфейсами, tun0
, tun1
, и так далее.
Я хочу настроить все так, чтобы конкретная группа процессов, A, имела маршрут по умолчанию (и только), указывающий на tun0
, Между тем, вторая группа процессов, B, имеет маршрут по умолчанию (и единственный), направленный на tun1
, и так далее. A, B и т. Д. Не обязательно являются "группами процессов" в смысле POSIX; в идеале конфигурация должна быть установлена заранее, после чего любой процесс может объявить себя членом A или B или... при запуске. (Это нормально, если только процессы, запущенные как root
может сделать это.)
Это ошибка, если какая-либо из этих групп процессов когда-либо отправляет трафик через неверный туннельный интерфейс или из реального сетевого интерфейса eth0
, Это также ошибка, если несвязанные процессы на одном хосте когда-либо отправляют трафик через любой из туннельных интерфейсов; они должны продолжать использовать eth0
непосредственно.
У меня сложилось впечатление, что это можно сделать с помощью "сетевых пространств имен", но я не смог понять, как; Прошу пошаговые инструкции.
1 ответ
Это действительно можно сделать с помощью сетевых пространств имен. Предположим, что у вас есть вся следующая информация (которая назначается процессом на другом конце туннельного устройства или программой контроллера):
$namespace
метка для сетевого пространства имен$device
туннельное устройство, которое будет назначено пространству имен$mtu
MTU для туннельного устройства$address
IP-адрес для назначения туннельному устройству$netmask
маска сети для назначения туннельному устройству$broadcast
широковещательный адрес для назначения туннельному устройству$gateway
шлюз по умолчанию для использования внутри пространства имен$dns_servers
список DNS-серверов для использования внутри пространства имен
Затем следующий псевдо-shell-скрипт установит пространство имен:
mkdir /etc/netns/$namespace
for dns_server in $dns_servers {
echo "nameserver $dns_server" >> /etc/netns/$namespace/resolv.conf
}
ip netns add $namespace
ip link set dev $device netns $namesapce
ip netns exec $namespace {
ip link set dev lo up
ip addr add dev $device local $address/$netmask broadcast $broadcast
ip link set dev $device mtu $mtu up
ip route add default via $gateway dev $device
}
И снести его снова, вы делаете
kill $(ip netns pids $namespace)
ip netns delete $namespace
rm -rf /etc/netns/$namespace
И чтобы запустить программу внутри пространства имен, просто используйте ip netns exec
,
Фактическая рабочая реализация этого механизма для туннелей OpenVPN может быть найдена здесь; к сожалению, потому что для того, что мне нужно, для этого нужно установить, вышеизложенное превращается в 1200 строк C.