Минимум настроек правил iptables для работу вебсервера LAMP (Linux, Apache|Nginx, MySQL, PHP):
iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -j REJECT --reject-with icmp-host-unreachable
Показанный выше пример — суперминимализм.
Посмотрите на первую команду:
iptables -A INPUT -i lo -j ACCEPT
Она говорит фаерволлу: “Принимать любой трафик на loopback интерфейс ”.
Далее
iptables -A INPUT -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT
Используется специальный модуль называемый ‘conntrack’, который отслеживает установку соединения. Это правило указывает на то что нужно принимать уже установленные и связанные с ними соединения.
Следующее правило:
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
предписывает принимать весь трафик на порту 22 (порт по умолчанию для SSH).
Следуюее правило:
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
принимать трафик HTTP на порту 80.
Последнее правило в этом списке:
iptables -A INPUT -j REJECT –reject-with icmp-host-unreachable
использует специальную директиву для цепочки — “REJECT”, которая отклоняет пакеты. Указанные ICMP пакеты будут отклонены с сообщением “host unreachable” которое разрывает подключение к серверу.
Теперь о тех вещах которые были намеренно опущены. Если ваш сервер не выступает внешним сервером базы данных MySQL для других серверов вам не требуется разрешать трафик MySQL. Поэтому в правилах нет разрешающего подключения к MySQL (локальный трафик mysql обрабатывается по правилу трафика для loopback интерфейса добавленного первой строкой). PHP нет смысла слушать что-то снаружи, так как он слушает только 127.0.0.1:9000 (по умолчанию, например, в PHP 5.3.x, на Ubuntu Precise), или вообще через UNIX сокет /var/run/php-fpm.sock (как это сделано в PHP 5.4.x, на Ubuntu Quantal и позже). То есть PHP трафик будет только локальный, и будет так же покрывать потребности по его разрешению первым правилом. Так что не требуется отдельного правила для трафика PHP.
В правилах нет фильтрации ICMP пакетов — таких как PING. Это минимальная настройка, для того чтобы потом её можно было доработать под себя. В этих настройках нет настроек фильтрации ICMP трафика, он будет резаться! С одной стороны это хорошо, вы не получите от кого-то здоровенный пинг (Pings of Death), и не будете фонить на всю сеть изнутри сети, с другой — если вам это понадобится сделать — вам придется заняться настройкой самим.
Подробное описание работы с iptables можно прочитать тут: http://www.opennet.ru/docs/RUS/iptables/