Группа процессов A маршрут по умолчанию tun0, B маршрут по умолчанию tun1 и т. д.
У меня есть окно Linux с N туннельными интерфейсами, tun0, tun1, и так далее.
Я хочу настроить все так, чтобы конкретная группа процессов, A, имела маршрут по умолчанию (и только), указывающий на tun0, Между тем, вторая группа процессов, B, имеет маршрут по умолчанию (и единственный), направленный на tun1, и так далее. A, B и т. Д. Не обязательно являются "группами процессов" в смысле POSIX; в идеале конфигурация должна быть установлена заранее, после чего любой процесс может объявить себя членом A или B или... при запуске. (Это нормально, если только процессы, запущенные как root может сделать это.)
Это ошибка, если какая-либо из этих групп процессов когда-либо отправляет трафик через неверный туннельный интерфейс или из реального сетевого интерфейса eth0, Это также ошибка, если несвязанные процессы на одном хосте когда-либо отправляют трафик через любой из туннельных интерфейсов; они должны продолжать использовать eth0 непосредственно.
У меня сложилось впечатление, что это можно сделать с помощью "сетевых пространств имен", но я не смог понять, как; Прошу пошаговые инструкции.
1 ответ
Это действительно можно сделать с помощью сетевых пространств имен. Предположим, что у вас есть вся следующая информация (которая назначается процессом на другом конце туннельного устройства или программой контроллера):
$namespaceметка для сетевого пространства имен$deviceтуннельное устройство, которое будет назначено пространству имен$mtuMTU для туннельного устройства$addressIP-адрес для назначения туннельному устройству$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.