bigton
@bigton
Web-программист

Как оптимально с точки зрения производительности настроить iptables?

Всем привет!

На выделенном сервере крутиться MySQL и Redis, необходимо разрешить доступ к ним с доверенных IP.

Мои правила:
iptables -F

iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

iptables -A INPUT -s x.x.x.x -p tcp -m state --state NEW --dport 3306 -j ACCEPT
iptables -A INPUT -s x.x.x.x -p tcp -m state --state NEW --dport 6379 -j ACCEPT

iptables -P INPUT DROP 
iptables -P FORWARD DROP

ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP

В час пик в syslog падает большое количество ошибок вида:
Feb  2 22:03:04 cache kernel: [595850.616259] nf_conntrack: table full, dropping packet
Feb  2 22:03:09 cache kernel: [595855.555346] net_ratelimit: 806 callbacks suppressed

Подобного рода ошибки рекомендуется лечить следующим образом:
echo "net.netfilter.nf_conntrack_max=1048576" >> /etc/sysctl.conf
sysctl -p

Вопросы:
1. Если доверенным IP разрешить доступ ко всем портам и убрать правило --state ESTABLISHED,RELATED, то nf_conntrack использоваться не будет и ошибок переполнения таблицы не будет?
2. Не смотря на установку net.netfilter.nf_conntrack_max=1048576, после перезагрузки сервера параметр принимает исходное значение 65536, как этого избежать?
3. Какие дополнения к моим правилам iptables стоит внести?

Спасибо за ответы!
  • Вопрос задан
  • 4061 просмотр
Пригласить эксперта
Ответы на вопрос 3
bigton
@bigton Автор вопроса
Web-программист
Спасибо за помощь chupasaurus и arheops.

Чтобы ошибок не возникало нужно в /etc/sysctl.conf добавить строки
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 3600

В /etc/rc.local перед exit 0 добавить строки
echo 262144 > /sys/module/nf_conntrack/parameters/hashsize
sysctl -p

Таким образом мы увеличиваем максимальное количество контролируемых соединений до 1048576, просим не отслеживать соединения по которым в течении часа (3600) не было пакетов, увеличиваем размер hash-таблицы по принципу 1048576 / 4 = 262144, и заставляем всё это работать после перезагрузки сервера.

arheops предложил вообще отключить контроль соединений, это позволит увеличить производительность, но на текущей нагрузке я пока в этом не нуждаюсь. Но такая возможность есть.
Ответ написан
Комментировать
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
1. Нет, netfilter используется iptables в любом случае.
2. Добавить
echo 262144 > /sys/module/nf_conntrack/parameters/hashsize
перед exit 0 в /etc/rc.local (число - четверть от nf_conntrack_max). Ну и выполнить.
3. Уменьшить таймауты на соединения (список # sysctl -a | grep conntrack | grep timeout), но надо смотреть чем забивается netfilter.
Ответ написан
@arheops
у вас эта ошибка возникает на втором правиле. соответсвенно если вы имете на этом сервере только mysql и redis, то для ускорения вам просто надо их разрешить ПЕРЕД этим правилом както вот так.

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s x.x.x.x -m tcp -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -s x.x.x.x -m tcp -p tcp --dport 6379 -j ACCEPT

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

iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы