Я настраиваю iptables для создания нескольких хостов в кластере серверов. Обычно будут разрывы подключения от нескольких серверов к одной системе. Наттинг необходим, чтобы получатели могли занести в белый список источник запросов. Конфигурация очень проста:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Из-за большого количества сообщений меня беспокоит, что количество открытых подключений (или подключений за очень короткое время) к одному месту назначения вызовет проблему, заключающуюся в том, что на хосте nat больше нет доступных портов для открытия подключений к единственной цели. система.
Есть ли способ регистрировать сообщения, когда происходит такой случай?
Если что-то подобное произойдет, есть ли способ распознать это при настройке журналирования для такой таблицы маршрутизации сообщений?
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
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4,1.2.3.5,9.8.7.6
Любая помощь высоко ценится.
Phylu
У вас есть две возможные проблемы:
В обоих случаях важно отметить, что отличает одно TCP-соединение от другого, а именно:
Когда 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 и использовать обычную маршрутизацию.