процесс группирует маршрут по умолчанию tun0, B значение по умолчанию направляют tun1, и т.д.

У меня есть поле Linux с туннельными интерфейсами N, tun0, tun1, и так далее.

Я хочу настроить вещи так, чтобы у конкретной группы процессов, A, было свое значение по умолчанию (и только), маршрут указал tun0. Между тем у второй группы процессов, B, есть свое значение по умолчанию (и только), маршрут указал tun1, и так далее. A, B, и так далее являются не обязательно "группами процесса" в смысле POSIX; идеально, конфигурация была бы установлена заранее, после которого, любой процесс мог объявить себя член A или B или... при запуске. (Это хорошо, если только обрабатывает выполнение как root может сделать это.)

Это - ошибка, если какая-либо из этих групп процессов когда-нибудь отправляет трафику неправильный туннельный интерфейс или интерфейс реальной сети eth0. Это - также ошибка, если несвязанные процессы на том же хосте когда-нибудь отправляют трафику какой-либо из туннельных интерфейсов; они должны продолжить использовать eth0 непосредственно.

У меня есть впечатление, что это может быть сделано с "сетевыми пространствами имен", но я не мог выяснить как; я прошу пошаговые инструкции.

1
задан 23 July 2014 в 22:56
1 ответ

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

  • $ 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.

0
ответ дан 4 December 2019 в 08:34

Теги

Похожие вопросы