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

Пакеты падают при использовании iptables NAT

Мы используем NAT, созданный с помощью iptables. Однако при большом количестве подключений (или сеансов) через сервер NAT пакеты начинают сбрасываться. В системном журнале нет журнала и т. Д. Я думаю, это вызвано конфигурацией sysctl, но я не знаю, как исправить или увеличить количество разрешенных подключений.

Изменить: глубоко сожалею о том, что не предоставил дополнительную информацию. Итак, информация ниже;

NAT основан на 64-битном Ubuntu 12.04 LTS. На сервере NAT есть два интерфейса, у одного публичный IP, у другого локальный IP. Локальная IP-подсеть - 255.255.0.0.

Изменить 2: О «партиях»: я действительно понятия не имею, сколько, но я знаю, что это стандартная версия Ubuntu. То есть мы еще ничего не настраивали.

Спасибо

Вы не говорите, в какой системе вы используете iptables.

Если вы используете FreeBSD, он хранит сетевые пакеты в кластерах mbuf.

Вы можете настроить количество кластеров mbuf с помощью: sysctl kern.ipc.nmbclusters = 65536

Установив его на 65000, вы будете использовать 144 МБ памяти, и вы не должны превышать это значение без настройки адресного пространства.

Тогда это открывает вопрос об адресном пространстве в ядре. На i386 память ядра установлена ​​на 1 ГБ. Вы можете увеличить до 2 Гб в файле конфигурации ядра:

options KVA_PAGES=512

На amd64 значение по умолчанию составляет 2 ГБ, и его нельзя настроить.

Вы можете увеличить объем физической памяти (по умолчанию 320 МБ), установленный в /boot/loader.conf

vm.kmem_size=1G

Это краткое изложение отличного отчета Игоря Сысоева, которое можно найти здесь: http://rerepi.wordpress.com/2008/04/19/tuning-freebsd-sysoev-rit/

Вы достигнете вышеуказанных пределов до ограничения количества портов в 64 КБ. Если ваш сервер является действительно загруженным брандмауэром, это вполне вероятно. Если вы используете Linux, может потребоваться аналогичная настройка.

Первый ответ был связан с FreeBSD. Проблемы те же, но параметры в Ubuntu разные:

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

300 серверов за NAT и всего 600 правил - это не слишком большое количество. Если это всего лишь группа серверов с небольшим входящим и исходящим трафиком, это должно быть прогулкой по парку. Если какой-либо из серверов имеет большой входящий или исходящий трафик, все может быстро испортиться.

Первая проблема, которую нужно решить, - это сколько «лотов». Цифры, которые вы пока показали, не страшны. И вы действительно должны убедиться, что у вас большие числа, прежде чем начинать настраивать сетевой стек с помощью sysctl. Будьте очень осторожны с этим.

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

wc -l /proc/net/tcp

Или, чтобы получить еще больше статистики, вы можете сделать netstat -s (Linux) или netstat -m (FreeBSD). Это сообщит вам используемые в настоящее время числа. Имея эту информацию под рукой, вы можете решить, нужно вам настраивать или нет.

Наиболее частая проблема с занятыми NAT - это net.ipv4.netfilter.ip_conntrack_max который определяет, сколько подключений вы отслеживаете. Вы можете увидеть, сколько записей находится в таблице отслеживания, с помощью:

sysctl net.netfilter.nf_conntrack_count

Проверьте установленный вами текущий максимум:

sysctl net.ipv4.netfilter.ip_conntrack_max

По умолчанию AFAIK - 65536. Вы можете увеличивать это число по мере необходимости, если у вас есть для него память.

Давидго упоминает 64К портов. Вы можете проверить количество настроенных эфемерных портов, используя:

sysctl net.ipv4.ip_local_port_range

Может, здесь нужно увеличить количество портов.

Интересно узнать, как быстро вы отбрасываете закрывающиеся сокеты. Это может привести к зависанию сокетов, и на загруженном сервере вы захотите освободить их быстрее:

sysctl net.ipv4.tcp_fin_timeout

Вы можете освободить порты быстрее, уменьшив значение thie до 25, может быть, 10 секунд.

Это, как обычно, те, которые нужно настроить, но есть и другие важные:

sysctl -a | grep conntrack | grep timeout

Вы можете установить все параметры, используя sysctl командовать или редактировать /etc/sysctl.conf

Ваши результаты могут отличаться, но чтобы дать вам представление, приведенные ниже числа были установлены на достаточно загруженном сервере:

net.ipv4.netfilter.ip_conntrack_max                     = 196608
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 86400

net.ipv4.tcp_tw_recycle                                 = 0
net.ipv4.tcp_tw_reuse                                   = 0
net.ipv4.tcp_orphan_retries                             = 1
net.ipv4.tcp_fin_timeout                                = 10
net.ipv4.tcp_max_orphans                                = 8192

net.ipv4.ip_local_port_range                            = 32768    61000

Вы не сообщили, что такое «много» соединений, и не предоставили нам подробностей об оборудовании, поэтому сложно дать окончательный ответ.

Возможно, вы столкнулись с жестким ограничением NAT, поскольку существует ограниченное количество (около 64 КБ) портов, и каждое соединение требует своего собственного порта в реализации Linux. Вы можете смягчить / преодолеть это, используя несколько IP-адресов (не уверен, что это вариант для вас) или, возможно, используя прозрачный прокси, если многие соединения являются HTTP)

Кроме того, что вы подразумеваете под «серверными пакетами»? Если вы имеете в виду «пакеты», вы можете обнаружить, что это ограничение не является ограничением NAT, а скорее может быть ограничением размера вашего Интернет-соединения или ограничением количества пакетов, которые может обработать подключенный маршрутизатор. [Более подробная информация может помочь нам и здесь]