Я добавил несколько тысяч IP-адресов, упакованных в несколько классов / 24, в ящик CentOS, и из-за этого меня сканируют днем и ночью. Поскольку этот сервер будет рабочей лошадкой, и он должен будет быть доступен только по SSH (измененный порт SSH) и http / s, я в конечном итоге заблокировал почтовые порты и ответы на ping. Это решило проблему большого времени отклика по протоколу http / s, но iptables увеличил нагрузку на сервер.
Я получаю:
top - 22:01:30 up 2 days, 10:17, 3 users, load average: 1.99, 2.23, 2.07
Tasks: 198 total, 2 running, 195 sleeping, 0 stopped, 1 zombie
Cpu(s): 1.0%us, 5.1%sy, 0.0%ni, 85.0%id, 0.0%wa, 0.0%hi, 8.8%si, 0.0%st
Mem: 16638532k total, 2692948k used, 13945584k free, 206992k buffers
Swap: 8193140k total, 0k used, 8193140k free, 2093204k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7091 root 23 0 25704 23m 512 R 72.5 0.1 0:02.26 iptables
28507 root 15 0 10236 3308 2684 S 4.5 0.0 0:51.00 sshd
Как я могу решить эту проблему, если сервер работает очень медленно даже при выполнении базовых операций, например при принятии команды через SSH? В ближайшие месяцы я буду искать аппаратный брандмауэр, но до тех пор проблема должна быть решена с помощью программного решения.
Есть несколько вещей, которые вы можете сделать для оптимизации ваших iptables:
Удалите правила, которые ничего не делают. Любое правило без цели ( -j <something>
) ничего не делает с пакетом, поэтому, если вы не используете эти правила для учета, они бесполезны и должны быть удалены.
Разделите правила на цепочки. Пакет должен соответствовать каждому правилу до тех пор, пока он не найдет цель или конец цепочки, в которой он использует политику. Если вы создаете цепочки для групп IP-адресов, которые могут быть сопоставлены с простым правилом, вы можете значительно уменьшить количество правил, которые нужно сравнивать для каждого пакета. Что-то вроде этого:
:group0 ACCEPT [0:0]
:group1 ACCEPT [0:0]
:group2 ACCEPT [0:0]
:group3 ACCEPT [0:0]
:group4 ACCEPT [0:0]
-A INPUT -d 10.0.0.0/24 -j group0
-A INPUT -d 10.0.0.1/24 -j group1
-A INPUT -d 10.0.0.2/24 -j group2
-A INPUT -d 10.0.0.3/24 -j group3
-A INPUT -d 10.0.0.4/24 -j group4
-A group0 -d 10.0.0.1 -i ! lo -p tcp -m tcp --sport 80
...etc
А потом поставить все правила для 10.0.0.0/24
в group0
цепь. Предположим, у вас есть одно правило для каждого из 65 536 IP-адресов в 10.0.0.0/16
, наихудшее количество сравнений, которое пакет должен был бы пройти в этой настройке, составляет 512. Намного лучше, чем 65 536 сравнений. каждый пакет должен пройти, если все они находятся в одной цепочке. Это не обязательно должен быть диапазон IP-адресов назначения, который вы разделяете, это может быть номер порта или любой другой аспект пакета, с которым IPTables может сопоставить.
Если вы используете это для целей учета, используйте порт зеркалирования на вашем коммутаторе, чтобы отправить копию всего этого трафика в отдельный ящик. Основной брандмауэр маршрутизации должен работать с минимальным количеством правил, обеспечивающих ваши цели безопасности. (Также может быть лучший способ обработки бухгалтерского учета, отличный от iptables, но это не моя область.)
Ставьте цели для каждого правила. Если только ты не хотеть чтобы соответствовать всем трем из следующих правил, вы могли бы также иметь -j ACCEPT
по каждому правилу. Если вы хотите сопоставить все из них, поставьте ACCEPT на последнем. Таким образом, вам не придется сравнивать правила, которые никогда не будут совпадать.
-A acctboth -s 93.xyx.40.250 -i ! lo -p tcp -m tcp --dport 80
-A acctboth -s 93.xyx.40.250 -i ! lo -p tcp
-A acctboth -s 93.xyx.40.250 -i ! lo
Объедините правила. Поскольку логика вашего брандмауэра очень проста, вы можете заменить все это примерно 10 правилами - только те, которые имеют -j TARGET
.
Удалите повторяющиеся и повторяющиеся правила. Эти правила не выглядят упорядоченными или организованными. Я был бы удивлен, если бы у вас где-то не было повторяющихся правил. Я также был бы удивлен, если бы с несколькими тысячами IP-адресов некоторые из ваших правил касались IP-адресов, которых у вас больше нет. Найдите их и удалите.
Не совмещайте цепи для ВХОДА и ВЫХОДА. Положите -s <IP>
правила в цепочке OUTPUT и -d <IP>
правил в цепочке INPUT и избавьтесь от -j acctboth
правила и acctboth
цепь. Опять же, это вдвое сокращает количество правил, которые необходимо проверить перед обнаружением совпадения.
Закажите правила так, чтобы в первую очередь указывались наиболее часто совпадающие цели. Вы можете увидеть удобочитаемые числа с помощью iptables -L -nv
и сырые числа с iptables -L -nvx
. Если у вас есть пакеты, которые больше выигрывают от низкой задержки (например, пакеты на порту 22), помещайте их в список раньше, чем пакеты, которые выигрывают меньше (например, порт 25).
Добавьте аппаратный брандмауэр. У MIkrotik есть потрясающие новые - СЕРЬЕЗНО, 2 ядра на каждый сетевой порт, работающие на частоте 1,2 ГГц.
А пока вы можете попробовать оптимизировать свои правила iptable. Вот и все - если обработка правил занимает так много времени, оптимизируйте их, чтобы они были быстрее.