LINUX.ORG.RU
ФорумAdmin

nf_conntrack_tuple_taken 100% cpu

 ,


3

2

Привет всем! Прошу помощи и совета. Есть Nat/маршрутизатор на Debian. Почти каждый день сервер в разное время ложится в полку по cpu, через некоторое время 10-50мин. его попускает. perf top выявил в этот момент nf_conntrack_tuple_taken 100%. Проц i7-7700. Сетевая Intel I350-t4

Заранее спасибо за любые советы.

~# uname -r
4.9.0-3-amd64
# iptables -V
iptables v1.6.0
# ipset -v
ipset v6.30, protocol version: 6
# sysctl -a | grep conntrack
net.netfilter.nf_conntrack_acct = 0
net.netfilter.nf_conntrack_buckets = 409600
net.netfilter.nf_conntrack_checksum = 1
net.netfilter.nf_conntrack_count = 722614
net.netfilter.nf_conntrack_events = 1
net.netfilter.nf_conntrack_expect_max = 256
net.netfilter.nf_conntrack_generic_timeout = 600
net.netfilter.nf_conntrack_helper = 0
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_log_invalid = 0
net.netfilter.nf_conntrack_max = 1638400
net.netfilter.nf_conntrack_tcp_be_liberal = 0
net.netfilter.nf_conntrack_tcp_loose = 1
net.netfilter.nf_conntrack_tcp_max_retrans = 3
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_timestamp = 0
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.nf_conntrack_max = 1638400
# iptables-save
# Generated by iptables-save v1.6.0 on Thu Oct 26 20:20:05 2017
*mangle
:PREROUTING ACCEPT [8049016415:5035799096738]
:INPUT ACCEPT [20556383:1399056353]
:FORWARD ACCEPT [8010527052:5033150314691]
:OUTPUT ACCEPT [5970982:315886365]
:POSTROUTING ACCEPT [8011579861:5033182613315]
:balance - [0:0]
:new_conn - [0:0]
-A PREROUTING -m conntrack --ctstate NEW -j new_conn
-A PREROUTING -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A balance -m statistic --mode random --probability 0.50000000000 -j SET --add-set vlan2000 src
-A balance -m set --match-set uplink_list src -j RETURN
-A balance -m statistic --mode random --probability 1.00000000000 -j SET --add-set vlan2001 src
-A new_conn -m set --match-set ip_pools src -m set ! --match-set uplink_list src -j balance
-A new_conn -m set --match-set vlan2000 src -j CONNMARK --set-xmark 0x1/0xffffffff
-A new_conn -m set --match-set vlan2001 src -j CONNMARK --set-xmark 0x2/0xffffffff
-A new_conn -m set --match-set vlan2000 src -j SET --add-set vlan2000 src --exist
-A new_conn -m set --match-set vlan2001 src -j SET --add-set vlan2001 src --exist
COMMIT
# Completed on Thu Oct 26 20:20:05 2017
# Generated by iptables-save v1.6.0 on Thu Oct 26 20:20:05 2017
*filter
:INPUT DROP [19591862:1326290389]
:FORWARD ACCEPT [8005609010:5032866794927]
:OUTPUT ACCEPT [5970955:315883993]
:input_check - [0:0]
:input_new - [0:0]
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate NEW -j input_new
-A FORWARD -p tcp -m set --match-set blacklist dst -j REJECT --reject-with tcp-reset
-A FORWARD -m set --match-set blacklist dst -j REJECT --reject-with icmp-port-unreachable
-A input_check -m recent --update --seconds 600 --hitcount 3 --name DEFAULT --mask 255.255.255.255 --rsource -j LOG --log-prefix "iptables INPUT bruteforce: "
-A input_check -m recent --update --seconds 600 --hitcount 3 --name DEFAULT --mask 255.255.255.255 --rsource -j DROP
-A input_check -m recent --set --name DEFAULT --mask 255.255.255.255 --rsource -j ACCEPT
-A input_new -p tcp -m tcp --dport 62222 -j input_check
-A input_new -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A input_new -m set --match-set input_src src -j ACCEPT
COMMIT
# Completed on Thu Oct 26 20:20:05 2017
# Generated by iptables-save v1.6.0 on Thu Oct 26 20:20:05 2017
*nat
:PREROUTING ACCEPT [731335048:51842951878]
:INPUT ACCEPT [19609:2145677]
:OUTPUT ACCEPT [112016:5944261]
:POSTROUTING ACCEPT [4985233:199144045]
:dnat_post - [0:0]
:dnat_pre - [0:0]
-A PREROUTING -d x.x.x.x -m set --match-set dnat_ports dst -j dnat_pre
-A OUTPUT -d x.x.x.x -m set --match-set dnat_ports dst -j dnat_pre
-A POSTROUTING -m set --match-set ip_pools src -m set --match-set dnat_ports dst -j dnat_post
-A POSTROUTING -o vlan2001 -j SNAT --to-source x.x.x.x-x.x.x.x --persistent
-A POSTROUTING -o vlan2000 -j SNAT --to-source x.x.x.x-x.x.x.x --persistent
-A dnat_post -d 172.19.0.1/32 -p udp -m multiport --dports 80,443 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 172.19.0.1/32 -p tcp -m multiport --dports 80,443 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.194.123.7/32 -p tcp -m multiport --dports 6036,6037,6038,6039 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.194.126.9/32 -p tcp -m multiport --dports 50001,50002 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.10/32 -p tcp -m multiport --dports 50004,50005 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.166/32 -p tcp -m multiport --dports 50006,50007 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.166/32 -p udp -m multiport --dports 50006,50007 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.156/32 -p tcp -m multiport --dports 50008,50029 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.41/32 -p tcp -m multiport --dports 50009,50010,50012 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.41/32 -p tcp -m multiport --dports 80 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.180/32 -p tcp -m multiport --dports 50014,50015,50050 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.130/32 -p tcp -m multiport --dports 50016,50017,50025 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.181/32 -p tcp -m multiport --dports 50027,50028 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.194.126.7/32 -p tcp -m multiport --dports 50029,50030,50031,50032 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.216/32 -p tcp -m multiport --dports 50033,50034,50035,50036 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.1.223/32 -p tcp -m multiport --dports 50037,50038 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.1.253/32 -p tcp -m multiport --dports 50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.2.8/32 -p tcp -m multiport --dports 50050,50051,50054 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.2.9/32 -p tcp -m multiport --dports 50052,50053 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.1.2/32 -p tcp -m multiport --dports 50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 172.20.0.100/32 -p tcp -m multiport --dports 80 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 172.20.0.101/32 -p tcp -m multiport --dports 80 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 172.20.0.102/32 -p tcp -m multiport --dports 80 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 172.20.0.103/32 -p tcp -m multiport --dports 80 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 172.20.0.104/32 -p tcp -m multiport --dports 80 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.193.0.244/32 -p tcp -m multiport --dports 60001,60002,60003 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.194.130.5/32 -p tcp -m multiport --dports 50100:50200 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.194.129.17/32 -p tcp -m multiport --dports 50203:50213 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.194.101.97/32 -p tcp -m multiport --dports 25565,25567,25568,30000,30001,50069:50099,4254:4258 -j SNAT --to-source 172.19.0.6
-A dnat_post -d 10.194.101.97/32 -p udp -m multiport --dports 25565,25567,25568,30000,30001,50069:50099,4254:4258 -j SNAT --to-source 172.19.0.6
-A dnat_pre -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 172.19.0.1
-A dnat_pre -p udp -m multiport --dports 80,443 -j DNAT --to-destination 172.19.0.1
-A dnat_pre -p tcp -m multiport --dports 6036,6037,6038,6039 -j DNAT --to-destination 10.194.123.7
-A dnat_pre -p tcp -m multiport --dports 50001,50002 -j DNAT --to-destination 10.194.126.9
-A dnat_pre -p tcp -m multiport --dports 50004,50005 -j DNAT --to-destination 10.193.0.10
-A dnat_pre -p tcp -m multiport --dports 50006,50007 -j DNAT --to-destination 10.193.0.166
-A dnat_pre -p udp -m multiport --dports 50006,50007 -j DNAT --to-destination 10.193.0.166
-A dnat_pre -p tcp -m multiport --dports 50008,50029 -j DNAT --to-destination 10.193.0.156
-A dnat_pre -p tcp -m multiport --dports 50009,50010,50012 -j DNAT --to-destination 10.193.0.41
-A dnat_pre -p tcp -m multiport --dports 50013 -j DNAT --to-destination 10.193.0.41:80
-A dnat_pre -p tcp -m multiport --dports 50014,50015,50050 -j DNAT --to-destination 10.193.0.180
-A dnat_pre -p tcp -m multiport --dports 50016,50017,50025 -j DNAT --to-destination 10.193.0.130
-A dnat_pre -p tcp -m multiport --dports 50027,50028 -j DNAT --to-destination 10.193.0.181
-A dnat_pre -p tcp -m multiport --dports 50029,50030,50031,50032 -j DNAT --to-destination 10.194.126.7
-A dnat_pre -p tcp -m multiport --dports 50033,50034,50035,50036 -j DNAT --to-destination 10.193.0.216
-A dnat_pre -p tcp -m multiport --dports 50037,50038 -j DNAT --to-destination 10.193.1.223
-A dnat_pre -p tcp -m multiport --dports 50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049 -j DNAT --to-destination 10.193.1.253
-A dnat_pre -p tcp -m multiport --dports 50050,50051,50054 -j DNAT --to-destination 10.193.2.8
-A dnat_pre -p tcp -m multiport --dports 50052,50053 -j DNAT --to-destination 10.193.2.9
-A dnat_pre -p tcp -m multiport --dports 50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065 -j DNAT --to-destination 10.193.1.2
-A dnat_pre -p tcp -m multiport --dports 50066 -j DNAT --to-destination 172.20.0.101:80
-A dnat_pre -p tcp -m multiport --dports 50067 -j DNAT --to-destination 172.20.0.102:80
-A dnat_pre -p tcp -m multiport --dports 50068 -j DNAT --to-destination 172.20.0.103:80
-A dnat_pre -p tcp -m multiport --dports 50201 -j DNAT --to-destination 172.20.0.104:80
-A dnat_pre -p tcp -m multiport --dports 50202 -j DNAT --to-destination 172.20.0.100:80
-A dnat_pre -p tcp -m multiport --dports 60001,60002,60003 -j DNAT --to-destination 10.193.0.244
-A dnat_pre -p tcp -m multiport --dports 50100:50200 -j DNAT --to-destination 10.194.130.5
-A dnat_pre -p tcp -m multiport --dports 50203:50213 -j DNAT --to-destination 10.194.129.17
-A dnat_pre -p tcp -m multiport --dports 25565,25567,25568,30000,30001,50069:50099,4254:4258 -j DNAT --to-destination 10.194.101.97
-A dnat_pre -p udp -m multiport --dports 25565,25567,25568,30000,30001,50069:50099,4254:4258 -j DNAT --to-destination 10.194.101.97
COMMIT
# Completed on Thu Oct 26 20:20:05 2017
# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  25:          1          0          0          0   PCI-MSI 524288-edge      enp1s0f0
 26:          2          0 1260759450          0   PCI-MSI 524289-edge      enp1s0f0-rx-0
 27:          2 1596364080          0          0   PCI-MSI 524290-edge      enp1s0f0-rx-1
 28: 1608171634          0          0          0   PCI-MSI 524291-edge      enp1s0f0-rx-2
 29:          2          0          0 1431637657   PCI-MSI 524292-edge      enp1s0f0-rx-3
 30:          2          0 2248452719          0   PCI-MSI 524293-edge      enp1s0f0-tx-0
 31:          2 2685798284          0          0   PCI-MSI 524294-edge      enp1s0f0-tx-1
 32: 2407711073          0          0          0   PCI-MSI 524295-edge      enp1s0f0-tx-2
 33:          2          0          0 2681609538   PCI-MSI 524296-edge      enp1s0f0-tx-3
 36:          1          0          0          0   PCI-MSI 526336-edge      enp1s0f1
 37:          2  437882432          0          0   PCI-MSI 526337-edge      enp1s0f1-rx-0
 38:  401100044          0          0          0   PCI-MSI 526338-edge      enp1s0f1-rx-1
 39:          2          0          0  403086479   PCI-MSI 526339-edge      enp1s0f1-rx-2
 40:          2          0  441094187          0   PCI-MSI 526340-edge      enp1s0f1-rx-3
 41:          2  250815536          0          0   PCI-MSI 526341-edge      enp1s0f1-tx-0
 42:  265847277          0          0          0   PCI-MSI 526342-edge      enp1s0f1-tx-1
 43:          2          0          0  274199030   PCI-MSI 526343-edge      enp1s0f1-tx-2
 44:          2          0  270523776          0   PCI-MSI 526344-edge      enp1s0f1-tx-3

гм. а «conntrack -C» сколько в это время показывает ?

в dmesg нет ругани ?

А pps в это время какой ? Не ddos ли это...

можно попробовать увеличить net.netfilter.nf_conntrack_buckets

Если не поможет, то пытаться перенастраивать rps

PS

Почему бы не сократить адскую простыню из строк

A dnat_post .......... -j SNAT --to-source 172.19.0.6
строкой

A dnat_post -m set --match-set snat06 dst,dst -j SNAT --to-source 172.19.0.6

А «ipset snat06» перечислить все, что нужно натить

ipset create snat06 hash:ip,port
ipset add snat06 172.19.0.1,80
ipset add snat06 172.19.0.1,443
ipset add snat06 10.194.123.7,tcp:6036
ipset add snat06 10.194.123.7,tcp:6037
ipset add snat06 10.194.123.7,tcp:6038
ipset add snat06 10.194.123.7,tcp:6039
......

vel ★★★★★ ()
Последнее исправление: vel (всего исправлений: 1)

net.netfilter.nf_conntrack_buckets уже увеличен. Значит проблема глубже и хоже.

Проблема проста - хеширование дает неравномерное распределение в таблице и где-то образуется очень длинный список который просматривается линейно, да еще и в залоченом состоянии.

Как с этим бороться - пока непонятно.

Я бы начал с поиска «виновника» - т.е. того кто создает очень много соединений ( через -m connlimit --connlimit-above ... )

vel ★★★★★ ()
Ответ на: комментарий от amd_amd

Возможно кто-то внутри «досит».

net.netfilter.nf_conntrack_count = 722614
net.netfilter.nf_conntrack_max = 1638400

ТС не один столкнулся с этой проблемой, но общего решения нет.

Если бы net.netfilter.nf_conntrack_count мониторится, то было бы понятно - аномалия или нет.

vel ★★★★★ ()
Ответ на: комментарий от vel

возможно кто то внутри травит, можно вычислить при помощи ettercap - он помимо что сам травит еще и вычислять это умеет, но я ниразу не вычислял - только травил, а в мануалах видел

amd_amd ★★★ ()
Последнее исправление: amd_amd (всего исправлений: 1)

Ну бородатые рекомендации говорят, что хеш к макс надо ставить 1/1, если память позволит. 1/4 многовато.

anonymous ()
Ответ на: комментарий от vel

conntrack -C в момент проблемы показывает те же самые показатели, которые начинают падать из-за потери производительности. Т.е. скачков количества сессий нет.

В логах ВСЕ чисто. Максимум что видно в момент проблемы, вчера например.

Oct 26 18:29:13 fibernet-router kernel: [163086.225243] perf: interrupt took too long (2502 > 2500), lowering kernel.perf_event_max_sample_rate to 79750

pps в районе 100Kpps. Так же скачков нет и начинает падать в момент.

A dnat_post -m set --match-set snat06 dst,dst -j SNAT --to-source 172.19.0.6

Так и сделаю, люблю связку ipset+iptables, почему-то сам не увидел такую оптимизацию)))

Я бы начал с поиска «виновника» - т.е. того кто создает очень много соединений ( через -m connlimit --connlimit-above ... )

А можно ли как-то посмотреть количество сессий не общее а по ip?

Через -m connlimit --connlimit-above интересно какое выбрать значение, что есть нормальное для обычного хомяка? Может вообще просто зарезать количество сессий с одного ip?

Возможно кто-то внутри «досит».

Перед маршрутизатором стоит еще BRAS для pppoe/ipoe, ядро постарей конечно. На нем проблемы нет, а если бы досили изнутри должно было бы так же вылезти ?! conntrack на нем так же не отключен, отличие разве что в нате и мангл балансировке.

Кстати

bras# conntrack -C
81268
nat# conntrack -C
267003
Разве не должно быть примерно одинаковое?

Ну бородатые рекомендации говорят, что хеш к макс надо ставить 1/1, если память позволит. 1/4 многовато.

Может 1/4 маловато по сравнению 1/1. Ну не знаю, я просто пропорционально увеличил дефолтные размеры до нужных значений и там как раз 1/4.

http://i.piccy.info/i9/be5586091d4a1b02ff07add150881ba1/1509090818/52555/1191...

fet4 ()
Последнее исправление: fet4 (всего исправлений: 1)
Ответ на: комментарий от fet4

А можно ли как-то посмотреть количество сессий не общее а по ip?

типа «top 20»

conntrack -L | awk '{X[$5]++}END{for(i in X) printf "%6d %s\n",X[i],i}' | sort -rn | head -20

если заменить $5 на $6, то получишь «top 20» адресов назначения

И еще. У тебя есть строка в nat

-A PREROUTING -d x.x.x.x -m set --match-set dnat_ports dst -j dnat_pre
IMHO это плохо т.к. не указан интерфей через который приходят такие пакеты.

Если x.x.x.x - внутренний адрес, то пофиг, а если x.x.x.x внешний адрес, то результат может оказаться очень странным.

vel ★★★★★ ()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

Я так понял для надежности и однозначности правила лучше строить с максимально возможным набором аргументов?!

Кажется я нашел дырку\недоработку своего фаервола откуда и «росли ноги». Сравнив количество сессий на бордере и брасе, разница огромна была. Потом добавил

:FORWARD DROP [1887072:124037305]
:forward_new - [0:0]
-A FORWARD -m conntrack --ctstate INVALID -j DROP
-A FORWARD -p tcp -m set --match-set blacklist dst -j REJECT --reject-with tcp-reset
-A FORWARD -m set --match-set blacklist dst -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m conntrack --ctstate NEW -j forward_new
-A forward_new -i vlan10 -m set --match-set ip_pools src -j ACCEPT
-A forward_new -o vlan10 -m set --match-set ip_pools dst -j ACCEPT
Чем ограничел исключительно форвард своих клиентов.

И стало

# conntrack -C
26477
А было около 300 000, а вечером вообще под 1М.

Будем мониторить ситуацию.

fet4 ()
Ответ на: комментарий от fet4

Я так понял для надежности и однозначности правила лучше строить с максимально возможным набором аргументов?!

Про надежность - не могу сказать. Число аргументов зависит он сложности реализуемой логики.

А вот число правил влияет на скорость. Как только число правил превышает некоторый предел ( зависящий от размера кеша ), так сразу начинает падать производительность.

-A FORWARD -m conntrack --ctstate INVALID -j DROP

Это очень полезная вещь.

Я не совсем понимаю вот эту логику

-A balance -m statistic --mode random --probability 0.50000000000 -j SET --add-set vlan2000 src
-A balance -m set --match-set uplink_list src -j RETURN
-A balance -m statistic --mode random --probability 1.00000000000 -j SET --add-set vlan2001 src
-A new_conn -m set --match-set ip_pools src -m set ! --match-set uplink_list src -j balance
-A new_conn -m set --match-set vlan2000 src -j CONNMARK --set-xmark 0x1/0xffffffff
-A new_conn -m set --match-set vlan2001 src -j CONNMARK --set-xmark 0x2/0xffffffff
-A new_conn -m set --match-set vlan2000 src -j SET --add-set vlan2000 src --exist
-A new_conn -m set --match-set vlan2001 src -j SET --add-set vlan2001 src --exist
т.е. допускается попадание src в оба набора ?

-A balance -m set --match-set uplink_list src -j RETURN явно лишнее

В чем смысл этих правил ?

-A new_conn -m set --match-set vlan2000 src -j SET --add-set vlan2000 src --exist
-A new_conn -m set --match-set vlan2001 src -j SET --add-set vlan2001 src --exist

Я бы понял если было бы написано

-A balance -m statistic --mode random --probability 0.50000000000 -j SET --add-set vlan2000 src
-A balance -m set ! --match-set vlan2000 src -j SET --add-set vlan2001 src
-A new_conn -m set --match-set ip_pools src -m set ! --match-set uplink_list src -j balance
-A new_conn -m set --match-set vlan2000 src -j CONNMARK --set-xmark 0x1/0xffffffff
-A new_conn -m set --match-set vlan2001 src -j CONNMARK --set-xmark 0x2/0xffffffff

Мониторинг полезная вещь.

vel ★★★★★ ()
Ответ на: комментарий от vel
# Вытягиваю новые соединения от клиентов
-A PREROUTING -i vlan10 -m conntrack --ctstate NEW -m set --match-set ip_pools src -j new_conn

# Запускаю на балансировку тех. кого нет не в одном списке аплинков
-A new_conn -m set ! --match-set uplink_list src -j balance

# 50% от всех новых соединений чьих src нет не в одном списке добавляю src в список vlan2000
-A balance -m statistic --mode random --probability 0.50000000000 -j SET --add-set vlan2000 src

# Снова проверю есть ли src есть хоть где-нибудь выхожу из балансировки 
-A balance -m set --match-set uplink_list src -j RETURN

# Кто остался добавляю их src в список vlan2001 
-A balance -m statistic --mode random --probability 1.00000000000 -j SET --add-set vlan2001 src

# Поставим всем соединения чьи src есть в списке vlan2000 марку 1
-A new_conn -m set --match-set vlan2000 src -j CONNMARK --set-xmark 0x1/0xffffffff

# Поставим всем соединения чьи src есть в списке vlan2001 марку 2
-A new_conn -m set --match-set vlan2001 src -j CONNMARK --set-xmark 0x2/0xffffffff

# Т.к. списки аплинков с таймаутом 10мин. нужно для того чтобы хранить в списке только активные ip в динамике, чтобы не чистить, 
поддерживаем src в списке если есть новые соединения обновляя timeout. 
Иначе через 10мин. клиент возможно перескочит на другой канал.
-A new_conn -m set --match-set vlan2000 src -j SET --add-set vlan2000 src --exist
-A new_conn -m set --match-set vlan2001 src -j SET --add-set vlan2001 src --exist

# Переносим маркировку соединений в маркировку пакетов.
-A PREROUTING -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff

-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Только что взял 10 ip с одного списка и выполнил test в другом, дубликатов не оказалось.

# ipset list vlan2000 | wc -l
243
# ipset list vlan2001 | wc -l
210
-A balance -m statistic --mode random --probability 0.50000000000 -j SET --add-set vlan2000 src
-A balance -m set ! --match-set vlan2000 src -j SET --add-set vlan2001 src

В принципе и так можно если два канала связи. Если более уже неудобно так исключать.

fet4 ()
Последнее исправление: fet4 (всего исправлений: 2)
Ответ на: комментарий от fet4

1.

-A new_conn -m set ! --match-set uplink_list src -j balance
-A balance -m set --match-set uplink_list src -j RETURN
Вторая строка никогда не выполняется.

2.

-A balance -m statistic --mode random --probability 0.50000000000 -j SET --add-set vlan2000 src
-A balance -m set --match-set uplink_list src -j RETURN
-A balance -m statistic --mode random --probability 1.00000000000 -j SET --add-set vlan2001 src
Если бы во второй строке проверялся набор vlan2000, то это было бы понятно.

3.

# Т.к. списки аплинков с таймаутом 10мин. нужно для того чтобы хранить в списке только активные ip в динамике, 
поддерживаем src в списке если есть новые соединения обновляя timeout. 
Иначе через 10мин. клиент возможно перескочит на другой канал.
-A new_conn -m set --match-set vlan2000 src -j SET --add-set vlan2000 src --exist
-A new_conn -m set --match-set vlan2001 src -j SET --add-set vlan2001 src --exist

В new_conn мы попадаем только первым пакетом соединения, в balance мы возможно добавляем src в vlan2000 и обязательно в vlan2001. "--add-set vlan2001 src --exist" в таком случае ничего не дает.

Если бы в balance попадали в случае когда src нет в vlan2000 и vlan2001, то тогда обе эти строки имели бы смысл.

IMHO balance должна быть вида

-A balance -m set ! --match-set vlan2000 src -m statistic --mode random --probability 0.50000000000 -j SET --add-set vlan2000 src
-A balance -m set ! --match-set vlan2000 src -j SET --add-set vlan2001 src

vel ★★★★★ ()
Ответ на: комментарий от vel

Стоп uplink_list_set это список list:set в котором списки vlan2000,vlan2001.

fet4 ()
Ответ на: комментарий от fet4

Тогда все становится на свои места.

Теперь остается ждать повторения проблемы.

vel ★★★★★ ()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

Тишина, всплесков не было за это время. Проблему можно считать решенной.

fet4 ()
Ответ на: комментарий от fet4

Есть еще вопрос по nat.

Правильно ли используются правила. На интерфейсе vlan2000 висит Ip 93.x.x.219. Аплинк роутит на этот ip сетку из ip 93.x.x.208-93.x.x.215 собственно в которую произвожу nat.

-A POSTROUTING -o vlan2000 -j SNAT --to-source 93.x.x.208-93.x.x.215 --persistent
Вопрос в чем, сам интерфейсный ip 93.x.x.219 используется для проброса портов внутрь сети, так вот не перекрывает ли правило выше исходящие пакеты с vlan2000 которые пришли на 93.x.x.219.

Так же если вы помните у меня есть балансировка по исходящему адресу и возможно ip на который пробрасывается порты с 1-го канала маршрутизируется через 2. Для исключения этой ситуации - новые соединения пришедшие на интерфейс должны уйти с него же, использую правила ip rule

 ip rule
0:      from all lookup local
10:     from all lookup static
100:    from 37.x.x.99 lookup vlan2001
100:    from 37.x.x.100 lookup vlan2001
100:    from 93.x.x.219 lookup vlan2000
100:    from all iif vlan2000 lookup vlan2000
100:    from all iif vlan2001 lookup vlan2001
100:    from all oif vlan2000 lookup vlan2000
100:    from all oif vlan2001 lookup vlan2001
1000:   from all fwmark 0x2 lookup vlan2001
1000:   from all fwmark 0x1 lookup vlan2000
32766:  from all lookup main
32767:  from all lookup default

fet4 ()
Ответ на: комментарий от fet4

IMHO маловероятно сделать так, что бы совпали протокол (tcp), локальный адрес, локальный порт, удаленный адрес и удаленный порт для разных коннектов SNAT и DNAT.

vel ★★★★★ ()
Ответ на: комментарий от vel

Т.е. если использовалось правило DNAT на входе. то SNAT его не перекроет что логично?!

fet4 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.