Новости из Блогов Использование нескольких сетевых стеков в Linux

Discussion in 'Мировые новости. Обсуждения.' started by d3l3t3, 26 Apr 2012.

  1. d3l3t3

    d3l3t3 Banned

    Joined:
    3 Dec 2010
    Messages:
    1,771
    Likes Received:
    98
    Reputations:
    10
    Использование нескольких сетевых стеков в Linux


    В linux относительно давно появилась такая замечательная вещь, как неймспейсы
    (namespaces). Основное применение данной технологии - контейнерная
    виртуализация, но и на маршрутизаторе можно придумать много разных применений,
    так как среди неймспейсов есть "network namespaces".

    Network namespaces позволяют в рамках одной машины в каждом неймспейсе иметь:
    • свой набор таблиц маршрутизации (а их 2^31-1 шт)
    • свою arp-таблицу
    • свои правила iptables
    • свои устройства (а значит и qdisc + class'ы tc)

    NB: для выполнения нижеследующих примеров крайне желательно иметь свежий iproute2 и ядро.

    Создаются неймспейсы достаточно скучно и просто:

    Code:
       ip netns add VROUTER
       ip netns add KUKYSEVRACI
    Создадим "виртуальны шнурок":

    Code:
       ip link add name ve0a type veth peer name ve0b
    Добавим интерфейсы внутрь VROUTER:

    Code:
       ip link set dev eth0 netns VROUTER
       ip link set dev ve0b netns VROUTER
    Выполнить команду в контексте определённого неймспейса можно так:

    Code:
       ip netns exec VROUTER ip link show
    Настроим адреса:

    Code:
       ip netns exec VROUTER ip a a 192.168.1.1/24 dev ve0b
       ip a a 192.168.1.2/24 dev ve0a
       ip netns exec VROUTER ip a a 10.140.48.16/24 dev eth0 
    Поднимем интерфейсы:

    Code:
       ip link set dev ve0a up
       ip netns exec VROUTER ip link set dev eth0 up
       ip netns exec VROUTER ip link set dev ve0b up
    Шлюз по умолчанию:

    Code:
       ip netns exec VROUTER ip r a default via 10.140.48.1
    Посмотрим, что получилось:

    Code:
       root@laptus:~# ip netns exec VROUTER ip r s
       default via 10.140.48.1 dev eth0 
       10.140.48.0/24 dev eth0  proto kernel  scope link  src  10.140.48.16 
       192.168.1.0/24 dev ve0b  proto kernel  scope link  src 192.168.1.1 
    Добавим NAT:

    Code:
       ip netns exec VROUTER iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.140.48.16
    Сделаем пару трейсов:

    Code:
       root@laptus:~# ip netns exec VROUTER traceroute -q 1 -I opennet.ru
       traceroute to opennet.ru (77.234.201.242), 30 hops max, 60 byte packets
        1  10.140.48.1 (10.140.48.1)  0.148 ms
        2  10.140.0.1 (10.140.0.1)  0.245 ms
        3  border.yournet.ru (91.204.148.17)  0.436 ms
        4  alisa.yournet.ru (91.204.151.2)  0.521 ms
        5  sev-gw.yournet.ru (91.204.148.2)  8.975 ms
        6  bl16-1-gw.spb.runnet.ru (194.190.255.25)  1.321 ms
        7  bl16-1-gw.spb.runnet.ru (194.85.40.170)  1.785 ms
        8  s14-1-gw.spb.runnet.ru (194.85.40.81)  1.456 ms
        9  vuztc.spb.runnet.ru (194.190.255.170)  1.987 ms
        10  opennet.ru (77.234.201.242)  2.395 ms
    
       root@laptus:~# traceroute -q 1 -I opennet.ru
       traceroute to opennet.ru (77.234.201.242), 30 hops max, 60 byte packets
        1  192.168.1.1 (192.168.1.1)  0.094 ms
        2  10.140.48.1 (10.140.48.1)  0.751 ms
        3  10.140.0.1 (10.140.0.1)  1.277 ms
        4  border.yournet.ru (91.204.148.17)  2.061 ms
        5  alisa.yournet.ru (91.204.151.2)  2.911 ms
        6  sev-gw.yournet.ru (91.204.148.2)  6.770 ms
        7  bl16-1-gw.spb.runnet.ru (194.190.255.25)  3.622 ms
        8  bl16-1-gw.spb.runnet.ru (194.85.40.170)  5.262 ms
        9  s14-1-gw.spb.runnet.ru (194.85.40.81)  4.135 ms
       10  vuztc.spb.runnet.ru (194.190.255.170)  4.710 ms
       11  opennet.ru (77.234.201.242)  7.220 ms
    Автор: Roman Timofeev ( ^rage^ )
    http://www.opennet.ru/tips/2683_linux_namespace_gateway_virtual_route_iproute.shtml