Назад | Перейти на главную страницу

Попытка сделать iptables без сохранения состояния вызывает непредвиденную фильтрацию

Я пытаюсь повысить производительность своего сервера, настроив iptables так, чтобы он не отслеживал состояние TCP-соединения. Я смотрю это руководство: http://cotdp.com/2011/07/nginix-on-a-256mb-vm-slice-24000-tps/

Однако, если я сделаю что-либо из следующего, все исходящие соединения будут отключены:

удалите это правило: INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT добавляя эти:

iptables -t raw -I OUTPUT -j NOTRACK
iptables -t raw -I PREROUTING -j NOTRACK

Сразу после внесения любого из этих изменений "ping google.com" возвращает ошибку о невозможности найти "google.com" (т. Е. DNS перестает разрешаться).

Вот правила, которые загружаются при загрузке, но затем fail2ban добавляет другие правила:

*filter
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp --dport ssh -j ACCEPT
-A INPUT -p tcp --dport http -j ACCEPT
-A INPUT -p tcp --dport https -j ACCEPT
-A INPUT -p tcp --dport smtp -j ACCEPT
-A INPUT -p tcp --dport ssmtp -j ACCEPT
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT

Вот результат iptables --list:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
fail2ban-ssh  tcp  --  anywhere             anywhere            multiport dports ssh 
fail2ban-ssh-ddos  tcp  --  anywhere             anywhere            multiport dports ssh 
fail2ban-pam-generic  tcp  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             loopback/8          reject-with icmp-port-unreachable 
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssmtp 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain fail2ban-pam-generic (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            

Chain fail2ban-ssh (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            

Chain fail2ban-ssh-ddos (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            

Отслеживание соединений Linux не только отслеживает TCP-соединения, но также отслеживает псевдо-соединения UDP и многое другое.

Без правил notrack происходит то, что происходит.

  • Ваша система отправляет DNS-запрос, при этом создается запись отслеживания соединения.
  • DNS-сервер генерирует ответ
  • Ответ соответствует вашему правилу "принять установленное и связанное с ним".

При использовании правила notrack происходит следующее:

  • Ваша система отправляет DNS-запрос, но не создает запись отслеживания соединения.
  • DNS-сервер генерирует ответ
  • Ответ не соответствует вашему правилу "принять установленные и связанные".
  • Ответ проваливается и попадает в ваше правило универсального отклонения.

Итак, как это исправить? Либо вы должны явно разрешить трафик ответов, не полагаясь на отслеживание состояния, либо вам нужно более избирательно подходить к правилам notrack.

Для DNS явное разрешение ответного трафика, вероятно, разумно. Вы знаете, что такое ваш DNS-сервер, и, вероятно, ему доверяете.

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

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

iptables -t raw -I OUTPUT -p tcp --sport http -j NOTRACK
iptables -t raw -I PREROUTING -p tcp --dport http -j NOTRACK

У вас есть правило, которое блокирует весь входящий трафик:

-A INPUT -j REJECT

И вы прекращаете отслеживание подключений, поэтому правило приема пакетов установленных подключений больше не работает:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Итак, ваш DNS-пакет уходит, не отслеживается, а затем отклоняется первым правилом.

Для работы второго правила необходимо включить отслеживание или добавить правила, разрешающие входящий трафик из «хороших» источников.