Как настроить брандмауэр с помощью Iptables на Ubuntu 12.04
Не используете Ubuntu 12.04?Выберите другую версию или дистрибутив.
Статус: Устарело
Эта статья охватывает версию Ubuntu, которая больше не поддерживается. Если вы в настоящее время управляете сервером на Ubuntu 12.04, мы настоятельно рекомендуем обновить систему или перейти на поддерживаемую версию Ubuntu:
- Обновите до Ubuntu 14.04.
- Обновление с Ubuntu 14.04 до Ubuntu 16.04
- Мигрировать данные сервера на поддерживаемую версию
Причина: Ubuntu 12.04 достигла конца срока поддержки (EOL) 28 апреля 2017 года и больше не получает обновления безопасности или обновления. Этот гайд больше не поддерживается.
Смотрите также:
Это руководство может по-прежнему быть полезным в качестве справочного материала, но может не работать на других версиях Ubuntu. Если доступно, мы настоятельно рекомендуем использовать руководство, написанное для той версии Ubuntu, которую вы используете. Вы можете использовать функцию поиска в верхней части страницы, чтобы найти более новую версию.
О Iptables
Чтобы сделать сервер более безопасным после первоначальной настройки, Ubuntu поставляется с iptables, который является стандартным файерволом дистрибутива. На начальном этапе, хотя файервол Ubuntu настроен, он настроен на разрешение всего входящего и исходящего трафика на виртуальном частном сервере. Чтобы включить более надежную защиту на сервере, мы можем добавить несколько базовых правил iptables.
Правила iptables исходят из ряда опций, которые можно комбинировать для создания каждого конкретного процесса. Каждый пакет, пересекающий брандмауэр, проверяется по каждому правилу по порядку. Как только он соответствует правилу, пакет выполняет связанное с ним действие, в противном случае он продолжается по линии.
Примечание: Этот учебник охватывает безопасность IPv4. В Linux безопасность IPv6 поддерживается отдельно от IPv4. Например, "iptables" поддерживает правила брандмауэра только для адресов IPv4, но у него есть аналог для IPv6 под названием "ip6tables", который можно использовать для поддержания правил брандмауэра для адресов сети IPv6.
Если ваш VPS настроен для IPv6, пожалуйста, не забудьте обезопасить как свои IPv4, так и IPv6 сетевые интерфейсы с помощью соответствующих инструментов. Для получения дополнительной информации о инструментах IPv6 обратитесь к этому руководству: Как настроить инструменты для использования IPv6 на Linux VPS
Команды Iptables
Хотя этот учебник рассмотрит ограниченное количество команд, которые обеспечат сервер базовой безопасностью, существует множество тонких и специфических случаев, которые можно реализовать с помощью iptables. Ниже приведены некоторые из самых полезных команд для разработки файрвола для вашего VPS, но имейте в виду, что это короткий список и существует множество других вариантов.
-A: (Append), adds a rule to iptables
-L: (List), shows the current rules
-m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command.
--cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid
-p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all".
--dport: (port), refers to the the port through which the machine connects
-j: (jump), this command refers to the action that needs to be taken if something matches a rule perfectly. It translates to one of four possibilities:
-ACCEPT: the packet is accepted, and no further rules are processed
-REJECT: the packet is rejected, and the sender is notified, and no further rules are processed
-DROP: the packet is rejected, but the sender is not notified, and no further rules are processed
-LOG: the packet is accepted but logged, and the following rules are processed
-I: (Insert), adds a rule between two previous ones
-I INPUT 3: inserts a rule to make it the third in the list
-v: (verbose), offers more details about a ruleСоздание правил Iptables:
Если вы введете следующее, вы сможете увидеть текущие правила iptables:
sudo iptables -LОни должны выглядеть вот так:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destinationЕсли у вас есть другой набор правил или вы хотите начать с чистого листа, вы всегда можете вернуть правила к значениям по умолчанию, очистив и удалив все их:
sudo iptables -FКроме того, если вы хотите ускорить свою работу с iptables, вы можете добавить -n в команду. Эта опция отключает DNS-поиск и препятствует попыткам команды найти обратный адрес каждого IP в наборе правил. Вы можете использовать это, чтобы, например, просмотреть список правил:
iptables -L -nБазовый файрвол
В настоящее время текущие правила позволяют все соединения, как входящие, так и исходящие. Безопасностные меры отсутствуют полностью. При составлении таблицы имейте в виду, что как только пакет будет ПРИНЯТ, ОТКЛОНЕН или ОТБРОШЕН, дальнейшие правила не обрабатываются. Следовательно, правила, которые идут первыми, имеют приоритет перед последующими.
При создании правил мы должны убедиться, что не заблокируем случайно SSH (метод, через который мы подключились к серверу).
Для начала давайте убедимся, что все текущие соединения разрешены, все соединения на момент создания правила останутся онлайн:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTМы можем продолжить и разобрать это по частям:
- -A указывает iptables добавить правило в таблицу.
- ВВОД назначает это правило как часть цепочки ввода.
- m conntrack, за которым следует --cstate ESTABLISHED,RELATED, гарантирует, что результат этого правила будет применяться только к текущим соединениям и к тем, которые с ними связаны
- -j ACCEPT указывает пакету ПЕРЕЙТИ к приему, и соединения все еще сохраняются.
После того как мы убедимся, что все текущие подключения к виртуальному частному серверу могут оставаться активными без перебоев, мы можем приступить к блокировке других небезопасных подключений.
Предположим, что мы хотим заблокировать весь входящий трафик, кроме того, который поступает на 2 распространённых порта: 22 для SSH и 80 для веб-трафика. Мы продолжаем, разрешая весь трафик на указанных портах с помощью следующих команд:
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPTsudo iptables -A INPUT -p tcp --dport 80 -j ACCEPTВ обеих этих командах опция -p обозначает протокол, по которому осуществляется соединение, в данном случае tcp, тогда как --dport указывает порт, через который передается пакет.
После того как мы гарантировали, что желаемый трафик пройдет через брандмауэр, мы можем завершить процесс, заблокировав весь оставшийся трафик от доступа к нашему виртуальному серверу. Поскольку это последнее правило в списке, весь трафик, который соответствует любому из предыдущих правил в iptables, не будет затронут и будет обрабатываться так, как мы настроили ранее.
Давайте создадим правило, чтобы заблокировать весь оставшийся трафик:
sudo iptables -P INPUT DROPС этим мы можем увидеть, как выглядят наши обновленные правила:
sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http Мы почти закончили. Однако нам не хватает еще одного правила. Нам нужно предоставить нашему VPS доступ к петлевой сети. Если бы мы добавили это правило сейчас без дополнительных условий, оно оказалось бы в конце списка и, поскольку следовало бы за правилом блокировки всего трафика, никогда не вступило бы в силу.
Чтобы противостоять этой проблеме, нам нужно поставить это правило первым в списке, используя опцию INPUT :
sudo iptables -I INPUT 1 -i lo -j ACCEPT- -I INPUT 1 размещает это правило в начале таблицы
- lo относится к интерфейсу обратной связи
- -j ACCEPT тогда гарантирует, что трафик обратной петли будет принят
Теперь мы закончили создание базового файрвола. Ваши правила должны выглядеть так (мы можем увидеть детали iptable, набрав -v):
sudo iptables -L -vChain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
1289 93442 ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
2 212 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
pkts bytes target prot opt in out source destination Однако, как только виртуальный сервер перезагрузится, правила iptables будут стерты. Следующий шаг будет посвящен сохранению и восстановлению правил iptables.
Сохранение правил Iptables
Хотя правила iptables действуют, они будут автоматически удалены при перезагрузке сервера. Чтобы убедиться, что они остаются в силе, мы можем использовать пакет под названием IP-Tables persistent.
Мы можем установить это с помощью apt-get:
sudo apt-get install iptables-persistentВо время установки у вас спросят, хотите ли вы сохранить правила iptables как для правил IPv4, так и для правил IPv6. Скажите «да» для обоих.
Ваши правила будут сохранены в /etc/iptables/rules.v4 и /etc/iptables/rules.v6.
После завершения установки запустите iptables-persistent с помощью команды:
sudo service iptables-persistent startПосле любой перезагрузки сервера вы увидите, что правила остаются на месте.
