NetworkNamespaces: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
Строка 205: | Строка 205: | ||
Т.к. мне лениво прописывать маршруты в каждом неймспейсе то поднимаю 100 экземпляров BGPd для того что бы обеспечить обмен маршрутами автоматически. |
Т.к. мне лениво прописывать маршруты в каждом неймспейсе то поднимаю 100 экземпляров BGPd для того что бы обеспечить обмен маршрутами автоматически. |
||
<BR> |
<BR> |
||
− | У quagga есть проблема с подняием многих экземпляров процессов т.к. сокет для взаимодействия между процессами задается на стадии компиляции. Потому пришлось сделать chroot что бы не собирать 100 экземпляров bgpd. |
+ | У quagga есть проблема с подняием многих экземпляров процессов т.к. сокет для взаимодействия между процессами задается на стадии компиляции. Потому пришлось сделать chroot что бы не собирать 100 экземпляров bgpd. |
+ | <BR> |
||
+ | <BR> |
||
+ | О том как именно помещать процессы в chroot думаю рассказывать не надо - это достаточно очевиднои этим методом пользуются уже много лет. Отличие только в том что сейчас у каждого процесса не только своя файловая система но и своя сетевая подсистема. |
||
<PRE> |
<PRE> |
Версия 12:37, 12 мая 2013
Network NameSpaces
Network NameSpaces это способ виртуализации сетевого стека в Linux
В пределах одной физической ноды можно получить:
- отдельную таблицу маршрутизации
- отдельную arp-таблицу
- iptables
- виртуальные устройства или реальные со своими шейперами.
Простой пример
Вот простой роутрер (ноут), один линк через WiFi
ip link show
ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000 link/ether 00:1d:72:d2:2e:41 brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:21:5d:40:2d:7a brd ff:ff:ff:ff:ff:ff 4: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link/ether 5a:c4:11:2e:48:99 brd ff:ff:ff:ff:ff:ff
(lxcbr0) - бридж для LXC, никак не мешает. Проверить наличие неймспейсов:
ip netns show
... ничего нет.
Добавляем 2 неймспейса
ip netns add R0 ip netns add R1
Проверяем:
ip netns list R1 R0
Добавляем 2 виртуальных линка (veth == virtual eth)
ip link add name ve0a type veth peer name ve0b ip link add name ve1a type veth peer name ve1b
ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000 link/ether 00:1d:72:d2:2e:41 brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:21:5d:40:2d:7a brd ff:ff:ff:ff:ff:ff 4: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link/ether 5a:c4:11:2e:48:99 brd ff:ff:ff:ff:ff:ff 20: ve0b: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 2e:0c:69:1a:43:d1 brd ff:ff:ff:ff:ff:ff 21: ve0a: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether b2:21:f3:95:e3:f6 brd ff:ff:ff:ff:ff:ff 22: ve1b: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 16:a4:78:2e:1f:56 brd ff:ff:ff:ff:ff:ff 23: ve1a: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 2a:62:f9:4f:c1:6c brd ff:ff:ff:ff:ff:ff
Добавилось 4 виртуальных интерфейса или они же 2 виртуальных линка
Далее переносим виртуальные езернеты с индексом b внутрь name spaces
ip link set dev ve0b netns R0 ip link set dev ve1b netns R1
Как можно видеть ниже - интерфейсы перестали быть видны:
ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000 link/ether 00:1d:72:d2:2e:41 brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:21:5d:40:2d:7a brd ff:ff:ff:ff:ff:ff 4: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link/ether 5a:c4:11:2e:48:99 brd ff:ff:ff:ff:ff:ff 21: ve0a: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether b2:21:f3:95:e3:f6 brd ff:ff:ff:ff:ff:ff 23: ve1a: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 2a:62:f9:4f:c1:6c brd ff:ff:ff:ff:ff:ff
Для того что бы вызвать комманду из какого-либо неймспейса следует использовать минтаксис ip netns exec ...
ip netns exec R0 ip link show 18: lo: <LOOPBACK> mtu 16436 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 20: ve0b: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 2e:0c:69:1a:43:d1 brd ff:ff:ff:ff:ff:ff
ip netns exec R1 ip link show 19: lo: <LOOPBACK> mtu 16436 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 22: ve1b: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 16:a4:78:2e:1f:56 brd ff:ff:ff:ff:ff:ff
Добавить адреса внутрь неймспейсов.
ip netns exec R0 ip addr add 172.19.0.1/24 dev ve0b ip netns exec R1 ip addr add 172.20.0.1/24 dev ve1b
"включить" линки. Не забываем про lo
ip netns exec R0 ip link set up dev ve0b ip netns exec R0 ip link set up dev lo ip netns exec R1 ip link set up dev ve1b ip netns exec R1 ip link set up dev lo
ip netns exec R0 ifconfig ip netns exec R1 ifconfig
Добавить адреса на основную систему
ip addr add 172.19.0.2/24 dev ve0a ip addr add 172.20.0.2/24 dev ve1a ip link set up dev ve0a ip link set up dev ve1a
ip netns exec R0 ip route add 0.0.0.0/0 via 172.19.0.2 ip netns exec R1 ip route add 0.0.0.0/0 via 172.20.0.2
ip netns exec R0 mtr 172.20.0.1
Немного магии
А теперь попробуем создать тестовый стенд - 100 (сто!) роутреров, включенных один за одним.
Конечно, не руками.
Скрипт для создания
#!/bin/bash I=0 echo "Virtual Router: " $I VR_IP="172.31."${I}".1" HOST_IP="172.31."${I}".1" ip netns add ROUTER_${I} #ip link add name virt_eth0 type veth peer name virt_eth99 ip link add name virt_eth99 type veth peer name virt_eth98 ip link set dev virt_eth99 netns ROUTER_${I} ip addr add 172.31.0.2/24 dev virt_eth98 ip link set up dev virt_eth98 ip ro add 172.31.0.0/16 via 172.31.0.1 ip netns exec ROUTER_$I ip addr add 172.31.0.1/24 dev virt_eth99 ip netns exec ROUTER_$I ip link set up dev virt_eth99 ip netns exec ROUTER_$I ip route add 0.0.0.0/0 via 172.31.0.2 ip netns exec ROUTER_${I} ip link set up dev lo ip netns exec ROUTER_${I} sysctl net.ipv4.icmp_ratelimit=10000000000 ip netns exec ROUTER_${I} sysctl net.ipv4.icmp_ratemask=0 for I in `seq 1 100` do echo "Virtual Router: " $I VR_IP="172.31."${I}".1" VR_GW="172.31."${I}".2" ip netns add ROUTER_${I} ip link add name virt_eth0 type veth peer name virt_eth1 ip link show ip link set dev virt_eth0 netns ROUTER_${I} ip link show dev virt_eth1 ip link set dev virt_eth1 netns ROUTER_$[$I-1] ip netns exec ROUTER_${I} ip addr add ${VR_IP}/24 dev virt_eth0 ip netns exec ROUTER_$[$I-1] ip addr add ${VR_GW}/24 dev virt_eth1 ip netns exec ROUTER_$[$I] ip link set up dev lo ip netns exec ROUTER_$[$I-1] ip link set up dev virt_eth1 ip netns exec ROUTER_$I ip link set up dev virt_eth0 ip netns exec ROUTER_${I} sysctl net.ipv4.icmp_ratelimit=10000000000 ip netns exec ROUTER_${I} sysctl net.ipv4.icmp_ratemask=0 done
Обратить внимание на
ip netns exec ROUTER_${I} sysctl net.ipv4.icmp_ratelimit=10000000000 ip netns exec ROUTER_${I} sysctl net.ipv4.icmp_ratemask=0
Иначе лимит на число ответов ICMP не дас увидеть маршрут
Маршрутизация
Т.к. мне лениво прописывать маршруты в каждом неймспейсе то поднимаю 100 экземпляров BGPd для того что бы обеспечить обмен маршрутами автоматически.
У quagga есть проблема с подняием многих экземпляров процессов т.к. сокет для взаимодействия между процессами задается на стадии компиляции. Потому пришлось сделать chroot что бы не собирать 100 экземпляров bgpd.
О том как именно помещать процессы в chroot думаю рассказывать не надо - это достаточно очевиднои этим методом пользуются уже много лет. Отличие только в том что сейчас у каждого процесса не только своя файловая система но и своя сетевая подсистема.
#!/bin/bash for I in `seq 1 100` do CHROOT_DIR="/etc/quagga/bgpd"${I} FILE="${CHROOT_DIR}/etc/quagga/bgpd"${I}".conf" echo $FILE echo "hostname bgpd" > $FILE echo "password zebra" >>$FILE echo "enable password zebra" >>$FILE echo "!" >>$FILE echo "!" >>$FILE echo "router bgp 10${I}" >>$FILE echo " bgp router-id 172.31.${I}.1" >>$FILE echo " network 172.31.$I.0/24" >>$FILE echo " network 172.31.$[$I+1].0/24" >>$FILE echo " neighbor 172.31.$[$I].2 remote-as 10$[$I-1]" >>$FILE echo " neighbor 172.31.$[$I+1].1 remote-as 10$[$I+1]" >>$FILE echo " neighbor 172.31.$[$I].2 next-hop-self" >>$FILE echo " neighbor 172.31.$[$I+1].1 next-hop-self" >>$FILE echo "!" >>$FILE echo "log stdout" >>$FILE chown quagga:quagga ${FILE} done for I in `seq 0 100` do CHROOT_DIR="/etc/quagga/bgpd"${I} umount ${CHROOT_DIR}/proc mount proc -t proc ${CHROOT_DIR}/proc/ chown quagga:quagga ${CHROOT_DIR}/var/run/quagga/ -Rc chown quagga:quagga ${CHROOT_DIR}/etc/quagga/ -Rc echo ip netns exec ROUTER_${I} /usr/sbin/chroot /etc/quagga/bgpd${I} /usr/lib/quagga/zebra -f /etc/quagga/zebra.conf --pid_file /var/run/quagga/zebra${I}.pid -d ip netns exec ROUTER_${I} /usr/sbin/chroot /etc/quagga/bgpd${I} /usr/lib/quagga/zebra -f /etc/quagga/zebra.conf --pid_file /var/run/quagga/zebra${I}.pid & sleep 1 echo ip netns exec ROUTER_${I} /usr/sbin/chroot /etc/quagga/bgpd${I} /usr/lib/quagga/bgpd -f /etc/quagga/bgpd${I}.conf --pid_file /var/run/quagga/bgpd${I}.pid ip netns exec ROUTER_${I} /usr/sbin/chroot /etc/quagga/bgpd${I} /usr/lib/quagga/bgpd -f /etc/quagga/bgpd${I}.conf --pid_file /var/run/quagga/bgpd${I}.pid & done
Связанные темы
http://wiki.sirmax.noname.com.ua/index.php/LXC