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

Настройка iptables и ведение журнала сброшенных пакетов из-за отсутствия портов при использовании маскарадинга

Я настраиваю iptables для создания нескольких хостов в кластере серверов. Обычно будут разрывы подключения от нескольких серверов к одной системе. Наттинг необходим, чтобы получатели могли занести в белый список источник запросов. Конфигурация очень проста:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Из-за большого количества сообщений меня беспокоит, что количество открытых подключений (или подключений за очень короткое время) к одному месту назначения вызовет проблему, заключающуюся в том, что на хосте nat больше нет доступных портов для открытия подключений к единственной цели. система.

  1. Есть ли способ регистрировать сообщения, когда происходит такой случай?

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

iptables -t nat -I POSTROUTING -j LOG
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
421K   25M LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4
603K   36M MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0
  1. Можно ли избежать отбрасывания пакетов, добавив несколько статических IP-адресов и используя SNAT вместо маскировки, как показано ниже?
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4,1.2.3.5,9.8.7.6

Любая помощь высоко ценится.

Phylu

У вас есть две возможные проблемы:

  1. У инициатора подключения закончились исходные порты?
  2. Заполнит ли NAT-устройство свою таблицу отслеживания подключений?

В обоих случаях важно отметить, что отличает одно TCP-соединение от другого, а именно:

  • Исходный IP-адрес
  • Исходный порт
  • IP-адрес назначения
  • Порт назначения

Когда Linux-машина инициирует TCP-соединение, она выбирает локальный порт из диапазона портов, указанного в sysctl net.ipv4.ip_local_port_range (что также относится к соединениям IPv6 TCP). По умолчанию это 32000 61999Это означает, что машина может установить 28232 одновременных TCP-соединения с любым конкретным целевым хостом и комбинацией портов. Маловероятно, что вам придется повышать это значение, но при необходимости вы можете установить его до предела 1024 65535, что дает 64512 возможных одновременных подключений.

[root@mistfall ~]# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768    60999
[root@mistfall ~]# sysctl -w net.ipv4.ip_local_port_range="1024 65535"
net.ipv4.ip_local_port_range = 1024 65535

В случае устройства NAT, оно ведет таблицу отслеживания соединений, в которой отслеживаются исходные адреса и порты каждого соединения, а также адреса и порты с NAT. Размер этой таблицы по умолчанию зависит от того, сколько оперативной памяти имеет система. Проверьте sysctl net.netfilter.nf_conntrack_max чтобы узнать, что он установлен в вашей системе.

[root@mistfall ~]# sysctl net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_max = 262144

Если необходимо увеличить его, вы должны также увеличить размер хэш-таблицы conntrack, которая является хеш-таблицей, которая ускоряет поиск в таблице conntrack. Эмпирическое правило здесь состоит в том, что он должен быть степенью двойки, 1/4 размера таблицы conntrack, установленной выше. Он установлен как опция модуля, поэтому вам нужно будет поместить его в файл, например. /etc/modprobe.d/nf_conntrack.conf. Например, если вы установите net.netfilter.nf_conntrack_max до 524288, вы также должны установить:

options nf_conntrack expect_hashsize=131072 hashsize=131072

Вы можете проверить текущий размер таблицы conntrack в доступном только для чтения sysctl net.netfilter.nf_conntrack_count:

[root@localhost ~]# sysctl net.netfilter.nf_conntrack_count
net.netfilter.nf_conntrack_count = 3635

Обратите внимание, что если вы используете MASQUERADE / SNAT, вам также нужно беспокоиться о том, что на устройстве NAT исчерпываются исходные порты при подключении к месту назначения. Лучше всего избегать NAT, если это вообще возможно, не только здесь, но везде (и кажется маловероятным, что вам действительно нужен NAT здесь; вы торгуете небольшим неудобством правил брандмауэра для огромной проблемы). Вам следует полностью отказаться от NAT и использовать обычную маршрутизацию.