Isolating network interfaces in Linux

Изолирование сетевого интерфейса

В данном примере мы имеем на хосте два сетевых интерфейса eth0 и eth1. Наша цель заизолировать один интерфейс.

    root@netns:~# ip a
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:00:0a:02:ba:36 brd ff:ff:ff:ff:ff:ff
        inet 10.2.186.54/24 brd 10.2.186.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::200:aff:fe02:ba36/64 scope link 
           valid_lft forever preferred_lft forever
    3: eth1:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:00:0a:02:ba:37 brd ff:ff:ff:ff:ff:ff
        inet 10.2.186.55/24 brd 10.2.186.255 scope global eth1
           valid_lft forever preferred_lft forever
        inet6 fe80::200:aff:fe02:ba37/64 scope link 
           valid_lft forever preferred_lft forever
    root@netns:~# 
Создаем network namespace
    ip netns add mynamespace

Посмотреть список созданных сетевых неймспейсов командой

    root@netns:~# ip netns list
    mynamespace (id: 0)

поднимем lo интерфейс

    #опустим интерфейс
    root@netns:~# ip link set eth1 down
    #прокинем его в ранее созданный НС
    root@netns:~# ip link set eth1 netns mynamespace
    #повесим на него ip и добавим в новом НС маршрут
    root@netns:~# ip netns exec mynamespace ip addr add 10.2.186.55/24 dev eth1
    root@netns:~# ip netns exec mynamespace ip route add default via 10.2.186.1
    #поднимем интерфейс
    root@netns:~# ip netns exec mynamespace ip link set eth1 up   

На выводе ниже показано, что eth1 перестал отображаться в исходном неймспейсе

    root@mynamespace:~# ip a
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:00:0a:02:ba:34 brd ff:ff:ff:ff:ff:ff
        inet 10.2.186.52/24 brd 10.2.186.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::200:aff:fe02:ba34/64 scope link 
           valid_lft forever preferred_lft forever    

Можно зайти зайти внутрь нового пространства имен и посмотреть его сетевые интерфейсы

    root@mynamespace:~# ip netns exec mynamespace ip a
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    3: eth1:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:00:0a:02:ba:33 brd ff:ff:ff:ff:ff:ff
        inet 10.2.186.51/24 scope global eth1
           valid_lft forever preferred_lft forever
        inet6 fe80::200:aff:fe02:ba33/64 scope link 
           valid_lft forever preferred_lft forever
    root@mynamespace:~#     

Идея состоит в том, чтобы определенным приложениям разрешить ходить через нужный интерфейс. Пример использования сервисом нужных НС смотреть в разделе systemd.