Я пытаюсь повысить производительность своего сервера, настроив 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 происходит то, что происходит.
При использовании правила notrack происходит следующее:
Итак, как это исправить? Либо вы должны явно разрешить трафик ответов, не полагаясь на отслеживание состояния, либо вам нужно более избирательно подходить к правилам 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-пакет уходит, не отслеживается, а затем отклоняется первым правилом.
Для работы второго правила необходимо включить отслеживание или добавить правила, разрешающие входящий трафик из «хороших» источников.