Jump to content
Калькуляторы

Перенос BGP(quagga) с FreeBSD на Linux проблема с маршрутизацией

Добрый день!

Переводим BGP с FreeBSD(8.0 STABLE) на Linux(Debian 2.6.33.20). Столкнулись с такой проблемой - при подключении более одного аплинка, перестает работатать часть ресурсов интернета. Опытным путем удалось установить: если трафик ходит в обе стороны через одного аплинка (один и тот же сетевой интерфейс), то работает. Если же трафик уходит через одного аплинка, а возвращается через другого (тисипидампом видим пакеты), то на интерфейсе, который смотрит в сторону сети виден только исходящий трафик от абонента, а входящего нету. Обратные маршруты в сеть при этом есть.

На FreeBSD такой проблемы не наблюдалось. Настройки BGP на Linux идентичны FreeBSD. ip_forwarding включен. В ядре дополнительных параметров не включали. Единственное, что в /etc/modprobe.d/blacklist.conf добавили:

blacklist ip_conntrack
blacklist nfnetlink
blacklist nf_conntrack_ipv4
blacklist nf_conntrack
blacklist nf_defrag_ipv4
blacklist iptable_nat
blacklist nf_nat

Чтобы не создавались стейты (меньше нагрузка на cpu).

Сначала погрешили на bonding, смотрящий в сеть. Разобрали - не помогло.

Погрешили на 10ГБ сетевуху (Intel Ethernet Server Adapter X520-DA2) - воткнулись в гигабитную сетевуху (Intel Corporation 82576 Gigabit Network Connection), повторили тест - не помогло.

Обе сетевухи тюним так:

/sbin/rmmod igb
/sbin/modprobe igb IntMode=2,2,2,2,2,2,2,2,2,2,2,2 InterruptThrottleRate=1,1,1,1,1,1,1,1,1,1,1,1 RSS=6,6,6,6,6,6,6,6,6,6,6,6 QueuePairs=1,1,1,1,1,1,1,1,1,1,1,1 LLIPort=80
/sbin/rmmod ixgbe
/sbin/modprobe ixgbe IntMode=2,2,2,2,2,2,2,2,2,2,2,2 InterruptThrottleRate=1,1,1,1,1,1,1,1,1,1,1,1 RSS=6,6,6,6,6,6,6,6,6,6,6,6 LLIPort=80

/usr/sbin/service networking restart

# изменить размеры буферов сетевых интерфейсов
/sbin/ethtool -G eth0  tx 2048
/sbin/ethtool -G eth0  rx 2048

/sbin/ethtool -G eth1  tx 2048
/sbin/ethtool -G eth1  rx 2048
/sbin/ethtool -G eth2  tx 2048
/sbin/ethtool -G eth2  rx 2048
/sbin/ethtool -G eth3  tx 2048
/sbin/ethtool -G eth3  rx 2048
......
# Для 10GB сетевухи
/sbin/ethtool -G eth9  tx 4096
/sbin/ethtool -G eth9  rx 4096
# отключить flow control на сетевых интерфейсах
/sbin/ethtool -A eth0  autoneg off rx off tx off
/sbin/ethtool -A eth1  autoneg off rx off tx off
/sbin/ethtool -A eth2  autoneg off rx off tx off
/sbin/ethtool -A eth3  autoneg off rx off tx off
.......
# Для 10GB сетевухи
/sbin/ethtool -A eth9  autoneg off rx off tx off
# изменить размер очереди передаваемых пакетов на сетевых интерфейсах
/sbin/ifconfig eth0  txqueuelen 10000
/sbin/ifconfig eth1  txqueuelen 10000
/sbin/ifconfig eth2  txqueuelen 10000
/sbin/ifconfig eth3  txqueuelen 10000
.......
# Для 10GB сетевухи
/sbin/ifconfig eth9  txqueuelen 10000
# распределяем по разным ЦП прерывания очередей сетевых интерфейсов
/sbin/ifconfig eth0 up
/bin/echo 1   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 2   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 4   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 8   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 10  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 20  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/sbin/ifconfig eth1 up
/bin/echo 40  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 80  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 100 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 200 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 400 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 800 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/sbin/ifconfig eth2 up
/bin/echo 1   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 2   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 4   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 8   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 10  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 20  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/sbin/ifconfig eth3 up
/bin/echo 40  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 80  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 100 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 200 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 400 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 800 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
......
# Для 10GB сетевухи
/sbin/ifconfig eth9 up
/bin/echo 1   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 2   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 4   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 8   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 10  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 20  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity

/etc/sysctl.conf

# Controls IP packet forwarding
net.ipv4.ip_forward = 1
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536
# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
#Увеличиваем максимальный размер памяти отводимой для TCP буферов
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
#Тюнинг буферов для TCP и UDP соединений (min, default, max bytes)
net.ipv4.tcp_rmem = 8192 8388608 16777216
net.ipv4.tcp_wmem = 8192 4194394 16777216
#Запрещаем кеширование статуса ssthresh
net.ipv4.tcp_no_metrics_save = 1
#размер backlog
net.core.netdev_max_backlog = 1000
#Увеличиваем число входящих соединений, которые могут стоять в очереди, прежде чем будут отброшены
net.core.somaxconn = 262144
#Размер буферов по умолчанию для приема и отправки данных через сокеты
net.core.wmem_default = 4194394
net.core.rmem_default = 8388608
net.ipv4.tcp_max_tw_buckets = 1440000

Edited by nicol@s

Share this post


Link to post
Share on other sites

Разобрались сами.

Были невнимательны. В sysctl.conf сделали:

net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

и все заработало

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this