У меня есть поле Linux с туннельными интерфейсами N, tun0
, tun1
, и так далее.
Я хочу настроить вещи так, чтобы у конкретной группы процессов, A, было свое значение по умолчанию (и только), маршрут указал tun0
. Между тем у второй группы процессов, B, есть свое значение по умолчанию (и только), маршрут указал tun1
, и так далее. A, B, и так далее являются не обязательно "группами процесса" в смысле POSIX; идеально, конфигурация была бы установлена заранее, после которого, любой процесс мог объявить себя член A или B или... при запуске. (Это хорошо, если только обрабатывает выполнение как root
может сделать это.)
Это - ошибка, если какая-либо из этих групп процессов когда-нибудь отправляет трафику неправильный туннельный интерфейс или интерфейс реальной сети eth0
. Это - также ошибка, если несвязанные процессы на том же хосте когда-нибудь отправляют трафику какой-либо из туннельных интерфейсов; они должны продолжить использовать eth0
непосредственно.
У меня есть впечатление, что это может быть сделано с "сетевыми пространствами имен", но я не мог выяснить как; я прошу пошаговые инструкции.
Это действительно можно сделать с помощью сетевых пространств имен. Предположим, что у вас есть вся следующая информация (которая либо назначается процессом на другом конце туннельного устройства, либо программой вашего контроллера):
$ namespace
метка для сетевого пространства имен $ device
туннельное устройство, которое будет назначено пространству имен $ mtu
MTU для туннельного устройства $ address
IP-адрес для назначения туннельному устройству $ netmask
сетевая маска для назначения туннельному устройству $ broadcast
широковещательный адрес для назначения туннельному устройству $ gateway
шлюз по умолчанию для использования внутри пространства имен $ dns_servers
список DNS-серверов для использования внутри пространства имен Затем следующий псевдоболочка-скрипт настроит пространство имен:
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 может быть найдена [114 7733] здесь ; к сожалению, поскольку для того, что мне он нужен, он должен быть установлен uid, приведенное выше превращается в 1200 строк C.