Linux: работа с сетью (маршрутизация, arp, performance, etc)

Общее
  • Общая концепция – “net-tools deprecated, use iproute2” из-за ряда проблем с net-tools. Из крутого iproute2 позволяет с помощью netns делать в Linux полноценные vrf.
ifconfig sucks
On Linux, ifconfig is an archaic network interface configuration command. The implementation commonly encountered, "net-tools", has a number of problems which make it more and more unsuitable.

ifconfig = ip a (address)
route = ip r (route)
arp = ip n (neighbour)
  • При этом никто не мешает его поставить обратно 🙂 И многие так и делают (слайды Juniper).
apt-get install net-tools

 

Маршрутизация (routing)

Смотрим, включена ли маршрутизация на Linux. При необходимости включаем до перезагрузки или постоянно.

# sysctl -a | grep ip_f
net.ipv4.ip_forward = 1

# sysctl -w net.ipv4.ip_forward=1 # до перезагрузки
# vi /etc/sysctl.conf
net.ipv4.ip_forward=1 # постоянно, добавляем строку в файл (снимаем коммент)

Смотрим маршруты

netstat -rn
ip route

ip route add/del или route add/del – добавляем/удаляем маршрут в оперативной памяти. После перезагрузки вернется как было.

# ip route
sudo ip route add default via 172.16.0.1
sudo ip route del default via 172.16.0.1
sudo ip route add 172.1.2.0/24 via 172.1.4.1

# via interface
route add -net 192.168.0.0/16 dev eth1

# route
sudo route add -net 172.16.0.0 netmask 255.255.255.0 gw 172.17.0.1
sudo route add -net 172.16.0.0 netmask 255.255.255.0 dev eth1
sudo route add -net 172.19.0.4 netmask 255.255.255.255 gw 172.16.1.131
sudo route del -net 0.0.0.0 netmask 0.0.0.0
sudo route del -net 11.0.0.0 netmask 255.0.0.0

Если пишет про неправильный gateway при прописывании маршрута через интерфейс – значит на хосте отсутствует интерфейс, который находится в одном broadcast domain с прописываемым gateway.

$ sudo ip route add 172.18.0.5/32 via 172.17.115.251 dev ens6
Error: Nexthop has invalid gateway.

Трафик может не маршрутизироваться устройством не только из-за выключенного роутинга (net.ipv4.ip_forward), но так же если не созданы по какой-то причине маршруты в локальные подсети.

# ip r
default via 172.31.1.1 dev enp7s0
172.31.1.0/24 dev enp7s0 proto kernel scope link src 172.31.1.1

# ip a
7: enp5s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.17.0.2/32 scope global enp5s0f1
4: enp5s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.0.0.2/32 scope global enp5s0f0

# sudo ip route add 172.17.0.0/24 dev enp5s0f1
# sudo ip route add 172.0.0.0/24 dev enp5s0f0
# ip r
default via 172.31.1.1 dev enp7s0
172.0.0.0/24 dev enp5s0f0 scope link
172.17.0.0/24 dev enp5s0f1 scope link
172.31.1.0/24 dev enp7s0 proto kernel scope link src 172.31.1.1

Для статических (перманентных) маршрутов можно прописать их в файле /etc/network/interfaces (подробнее тут).

post-up ip route add default via 172.17.0.1
post-up ip route add 11.0.0.0/16 via 172.55.1.1
ARP

ip n – просмотр arp

ip -s -s neigh flush all – чистка arp, удаление всех записей

arp -d 192.168.1.1 – Удаление конкретной записи вариант 1

ip neigh del 172.0.1.2 dev eth1 – Удаление конкретной записи вариант 2

прописываем static arp, три разных варианта

arp -s 172.0.0.1 b7:b7:b7:b7:b7:b7

ip neigh add 172.0.0.1 lladdr b7:b7:b7:b7:b7:b7 dev ens6f0

ifconfig en0 ether b7:b7:b7:b7:b7:b7 # вариант с использованием ifconfig

ARP утилита показывает намного больше чем просто ARP таблицу: есть таблица коммутации с портами/MAC.

~$ arp
Address HWtype HWaddress Flags Mask Iface
broadcast.msk.hoztnode. ether 00:1e:67:06:a1:10 C eth0
gw.msk.hoztnode.net ether 28:8a:1c:ea:ff:f0 C eth0

~$ arp
Address HWtype HWaddress Flags Mask Iface
192.168.149.3 ether 00:1c:7f:66:dc:9f C eth1
10.10.10.10 ether 00:50:56:8f:11:86 C eth0
10.10.11.10 ether 00:50:56:8f:28:4a C eth0
10.10.12.10 ether 00:00:5e:00:01:01 C eth0
192.168.149.2 ether 00:1c:7f:66:dc:9f C eth1
192.168.149.1 ether 00:1c:7f:67:a8:47 C eth1
sw1 ether 68:bd:ab:32:47:80 C eth0
sw2 ether c4:7d:4f:bd:0a:80 C eth0

 

ip route lookup (get)

По DST IP получаем next hop, interface и local IPIF.

# ip route get 1.1.1.1
1.1.1.1 via 172.16.1.1 dev enp7s0 src 172.16.1.29 uid 0
cache
# ip route get 8.8.8.8
8.8.8.8 via 172.16.1.1 dev enp7s0 src 172.16.1.29 uid 0
cache

 

Тюнинг параметров сетевого ядра

Отключение отправки ICMP redirects – напр. в схеме router on a stick не перенаправляем клиента на реальный шлюз сети, если нам нужно перехватывать/изменять трафик на промежуточном маршрутизаторе сети (между клиентами и реальным шлюзом). Как альтернатива можно использовать sysctl для временных или постоянных изменений параметров – пример см. поиском по ip_forward.

echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# sysctl
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0

Отправка TCP keepalive.

# echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes
Настройка TCP (алгоритмы)

подробнее в TCP

Оптимизация performance

Оптимизация Linux для увеличения производительности маршрутизации на базе linux-kernel (без использования dpdk/snabb) позволяет достичь производительности line rate 40gbps (в сумме у DUT 4х10G; тестили spirent testcenter по RFC 2544) совокупно со сложным функционалом на борту за небольшой прайс на базе серверного решения:

Что

  • More than a year in operaHon in the University Campus Network – 40 Gb/s
    • Full BGP
    • Multiple routing tables
    • CGN
    • Firewall
  • Performance improvement 80 Gb/s
  • Traffic shaping
  • DDoS protection
  • Price < 10 000 EUR

Как

  • распределение очередей по прерываниям
  • увеличение приёмных буферов
  • директивное выделение ядер на конкретные процессы
  • Disable SELinux in /etc/sysconfig/selinux
  • Disable rpfilter on all forwarding interfaces
  • Set performance scaling governor for all CPUs
  • Enable disabled offloads
  • Set the maximum number of TX and RX queues
  • Disable irqbalance daemon and assign each IRQ exclusively
  • Enable Hyper-Threading
  • Disable Nepilter
  • Disable RX Flow Control

Пример распределение stream TRex по ядрам. Позволяет избежать out of ordering.

Demonstrate how to assign a stream to a specific core. Core pinning was developed to avoid possible out of order for packets of the same stream.
The following example demonstrates 2 continuous streams S0 and S1 which are pinned to cores 0 and 1 respectively.

 

Leave a Reply