Article ID: 9630, created on Dec 20, 2011, last review on May 10, 2014

  • Applies to:
  • Virtuozzo containers for Linux 4.6
  • Virtuozzo containers for Linux 4.0
  • Virtuozzo for Linux 3.x

Проблема

У этой проблемы может быть несколько симптомов, в том числе:
 
-          Не работают некоторые правила iptables.
 
-          При попытке создать правило iptables в таблице NAT или использовать модуль STATE возникает следующая ошибка:
 
# iptables -t nat -L
iptables v1.3.5: can't initialize iptables table `nat': Table does not exist (do you need to insmod?) Perhaps iptables or your kernel needs to be upgraded.
#

Причина

Обычно эта проблема возникает из-за того, что на физическом сервере PVC по умолчанию отключен модуль “conntracks”, в результате чего в стандартной установке iptables имеет незавершенное состояние.
Вы можете выяснить это, проверив, совпадает ли получаемый вами вывод с приведенным ниже:
 
# grep conntrack /etc/modprobe.conf
options ip_conntrack ip_conntrack_disable_ve0=1
#

Когда модуль “conntracks” отключен, таблица NAT отсутствует в iptables:
 
# cat /proc/net/ip_tables_names
mangle
filter
#

 
Из-за этого модули ip_nat и ipt_state невозможно использовать на физическом сервере.

Решение

Примечание: Функцию iptables STATE можно заменить путем добавления явных дополнительных правил для цепочек INPUT и OUTPUT.
 
Если вам не подходит такое решение или вам нужна функция таблицы NAT, продолжите чтение.
 
 
Перед включением модуля “conntracks” обязательно ознакомьтесь со следующими примечаниями и предупреждениями:
 
Предупреждение 1: На отслеживание соединений расходуется большой объем ресурсов.
 
Предупреждение 2: После включения “conntracks” физический сервер может стать полностью недоступен по сети в случае высокой сетевой нагрузки.
Это связано с тем, что количество слотов отслеживания соединений на одном физическом сервере ограничено. Включение модуля "conntracks" особенно опасно для физического сервера PVC, так как он выделяет два слота для каждого соединения с контейнером - один для внешнего соединения и второй для соединения физического сервера с контейнером. Таким образом, если контейнер откроет слишком много соединений, физический сервер не сможет создавать новые соединения.
Такая ситуация может возникнуть в результате DDoS-атаки на любой из контейнеров. Администратор физического сервера не сможет остановить его путем остановки контейнера или добавления правил iptables, потому что не сможет войти на сервер.
 
 
Как включить “conntracks”:
 
  1. Проверьте, все ли необходимые модули, загружены на физическом сервере:
    [root@pvcfl46x64 ~]# lsmod | grep ipt
    ipt_REDIRECT 34944 0
    iptable_nat 43404 0
    ip_nat 53520 4 ipt_REDIRECT,ip_nat_irc,ip_nat_ftp,iptable_nat
    ip_conntrack 101396 10 ip_conntrack_netbios_ns,ip_nat_irc,ip_nat_ftp,xt_helper,xt_conntrack,ip_conntrack_irc,ip_conntrack_ftp,xt_state,iptable_nat,ip_nat
    ipt_recent 43404 1
    ipt_LOG 39808 1
    ipt_TOS 35200 0
    ipt_ttl 34816 0
    ipt_TCPMSS 37248 0
    iptable_mangle 37888 1
    iptable_filter 37760 2
    ipt_tos 34560 0
    ipt_REJECT 39812 0
    ip_tables 57440 3 iptable_nat,iptable_mangle,iptable_filter
    x_tables 52744 21 ipt_REDIRECT,xt_helper,xt_conntrack,xt_state,iptable_nat,ipt_recent,ipt_LOG,ipt_TOS,xt_comment,xt_length,ipt_ttl,xt_tcpmss,ipt_TCPMSS,xt_multiport,xt_limit,ipt_tos,ipt_REJECT,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables
    [root@pvcfl46x64 ~]#
  2. Добавьте эти модули в конфигурацию iptables на сервере:
    [root@pvcfl46x64 ~]# egrep '^IPTABLES_MODULES=' /etc/sysconfig/iptables-config
    IPTABLES_MODULES="ipt_comment ipt_tcp iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT ipt_state ip_conntrack_netbios_ns"
    [root@pvcfl46x64 ~]#
  3. Внесите изменения в /etc/modprobe.conf и задайте ip_conntrack_disable_ve0=0:
    [root@pvcfl46x64 ~]# grep conntrac /etc/modprobe.conf
    options ip_conntrack ip_conntrack_disable_ve0=0
    [root@pvcfl46x64 ~]#
  4. Включите ведение журналов iptables, чтобы проверить, что все работает:
    [root@pvcfl46x64 ~]# egrep "^kern" /etc/syslog.conf
    kern.* /var/log/iptables.log
    [root@pvcfl46x64 ~]#
  5. Перезапустите iptables:
    [root@pvcfl46x64 ~]# service iptables restart
    Flushing firewall rules: [ OK ]
    Setting chains to policy ACCEPT: nat mangle filter [ OK ]
    Unloading iptables modules: [FAILED]
    Applying iptables firewall rules: [ OK ]
    Loading additional iptables modules: ipt_comment ipt_tcp iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT ipt_state[ OK ]track_netbios_ns
    [root@pvcfl46x64 ~]#
  6. Перезапустите syslog:
    [root@pvcfl46x64 ~]# service syslog restart
    Shutting down kernel logger: [ OK ]
    Shutting down system logger: [ OK ]
    Starting system logger: [ OK ]
    Starting kernel logger: [ OK ]
    [root@pvcfl46x64 ~]#
  7. Добавьте тестовое правило, например, для отслеживания новых SSH-соединений:
    [root@pvcfl46x64 ~]# iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name ssh_attempt --rsource -j LOG --log-prefix "SSH connection attempt: "
    [root@pvcfl46x64 ~]#
  8. Для экономии системных ресурсов отключите отслеживание других TCP-соединений:
    iptables -t raw -I PREROUTING ! --dport 22 -j NOTRACK
  9. Попробуйте войти на сервер по SSH, одновременно наблюдая за журналом:
    [root@pvcfl46x64 ~]# tail -f /var/log/iptables.log
    Mar 10 07:09:32 pvcfl46x64 kernel: SSH connection attempt: IN=eth0 OUT= MAC=00:1c:42:43:65:5c:00:1c:c0:46:1f:e5:08:00 SRC=192.168.33.58 DST=10.55.63.10 LEN=48 TOS=0x00 PREC=0x00 TTL=123 ID=40718 DF PROTO=TCP SPT=1478 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0

Часто задаваемый вопрос

Вопрос: Что именно делает эта опция?
 
Ответ: Эта опция контролирует отслеживание пакетов в среде сервера. Когда она отключена, пакеты принимаются, перенаправляются и т.д., но ядро не сохраняет никаких данных о соединениях пакета, так как воспринимает каждый пакет как самостоятельную единицу.
Эта опция также затрагивает NAT. В случае с NAT необходимо знать следующее: вам нужно определить первый пакет соединения и решить, какой из последующих пакетов принадлежит этому первому пакету, то есть какой пакет должен рассматриваться как "подключение".

e8e50b42231236b82df27684e7ec0beb d02f9caf3e11b191a38179103495106f 9b9439294978ca011521bd467a069524 36627b12981f68a16405a79233409a5e 35c16f1fded8e42577cb3df16429c57a 2897d76d56d2010f4e3a28f864d69223

Email subscription for changes to this article
Save as PDF