Iptables v1.4.14: не удается инициализировать таблицу iptables `nat ': таблица не существует (вам нужно insmod?)
Я пытаюсь установить правила iptable, и я получил следующее сообщение об ошибке, когда я использую iptable:
iptables v1.4.14: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Я использую:
cat /etc/debian_version
7.4
uname -a
Linux myserver 2.6.32-22-pve #1 SMP Mon Jul 15 08:36:46 CEST 2013 x86_64 GNU/Linux
uname -r
2.6.32-22-pve
Это виртуальный сервер, размещенный поставщиком услуг.
Что я могу сделать, чтобы решить эту проблему?
Ответы
Ответ 1
Наконец, мой поставщик услуг ответил:
Это ограничение используемой системы виртуализации (OpenVZ), возможны основные правила iptables, но не те, кто использует nat Таблица.
Если это действительно проблема, мы можем предложить вам перейти на другую системную виртуализацию (KVM), когда мы начнем предлагать нашим клиентам.
SO Мне пришлось перенести мой сервер на новую систему...
Ответ 2
У меня была та же проблема, и это сработало:
sudo modprobe ip_tables
sudo echo 'ip_tables' >> /etc/modules
http://www.howtoforge.com/forums/showthread.php?t=3196
Ответ 3
Может быть, полезно добавить, что если вы видите это сообщение об ошибке, и вы не используете какой-то ограниченный контейнерный хостинг (например, OpenVZ), то проблема может быть в том, что в ядре отсутствуют nat-модули. Чтобы проверить запуск:
modinfo iptable_nat
Что должно печатать местоположение модуля, если оно печатает ERROR, тогда вы знаете, что это ваша проблема. Существуют также зависимые модули, такие как nf_nat, которые могут отсутствовать, поэтому вам придется копать глубже, если модуль iptable_nat существует, но не работает. Если он отсутствует, вам нужно будет получить еще одно ядро и модули, или если вы откатываетесь самостоятельно, убедитесь, что в конфигурации ядра содержится CONFIG_IP_NF_NAT=m
(для IPv4 NAT).
Для информации соответствующий модуль ядра обычно находится в одном из следующих мест:
ls /lib/modules/`uname -r`/kernel/net/netfilter/
ls /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/
И если вы используете IPv6, посмотрите также:
ls /lib/modules/`uname -r`/kernel/net/ipv6/netfilter/
Ответ 4
Краткая версия:
запустите iptables на хосте перед тем, как запустить его на виртуальном сервере (я уверен, что это какой-то контейнер LXC или OpenVZ здесь).
Длинная версия:
Проблема связана с тем, что модуль ip_table загружается по требованию. Итак, после перезагрузки на любой машине, на которой нет правил iptables, загружаемых во время загрузки, модуль ip_tables не загружается (нет требования к модулям == модуль не загружен). Следовательно, контейнеры LXC или OpenVZ не могут использовать iptables (поскольку они совместно используют ядро хоста, но не могут изменять, какие модули загружаются), пока хост каким-то образом не загрузил модуль ip_tables.
Ответ 5
У меня была такая же проблема с Debian 8. Я мог бы исправить это, перезапустив систему. Похоже, что ошибка может произойти, если изображение ядра было обновлено, и после этого система не была перезапущена.
Ответ 6
"Функциональность IP conntrack оказывает некоторое негативное влияние на производительность (от 0 до 10%), поэтому их лучше отключить по умолчанию".
Это необходимо для nat
https://serverfault.com/questions/593263/iptables-nat-does-not-exist
Ответ 7
проверьте, включена ли функция включения/выключения:
cat /dev/net/tun
если ok увидит что-то:
cat: /dev/net/tun: File descriptor in bad state
Ответ 8
Если вы используете кукольный, он может установить /proc/sys/kernel/modules_disabled
в 1, что препятствует дальнейшей загрузке модуля.
Когда машина перезагружается, она возвращается к 0, что позволяет изменять, например, загружать модули iptables. Через некоторое время марионетка вернет ее к 1, чтобы защитить систему от корневых наборов ядра.
Поэтому любые модули, которые нам понадобятся, должны загружаться во время или вскоре после загрузки.
Ответ 9
Это решение из официальной вики:
vzctl set $CTID --netfilter full --save
https://openvz.org/VPN_via_the_TUN/TAP_device#Troubleshooting
Ответ 10
Имена таблиц чувствительны к регистру, поэтому вы должны использовать нижний регистр nat вместо NAT верхнего регистра.
Например:
iptables -t nat -A POSTROUTING -s 192.168.1.1/24 -o eth0 -j MASQUERADE