Поиск по сайту:

Как настроить брандмауэр с помощью Iptables в Ubuntu 12.04


Статус: устарело

В этой статье рассматривается версия Ubuntu, которая больше не поддерживается. Если вы в настоящее время используете сервер под управлением Ubuntu 12.04, мы настоятельно рекомендуем обновить или перейти на поддерживаемую версию Ubuntu:

  • Обновите Ubuntu до версии 14.04.
  • Обновление Ubuntu 14.04 до Ubuntu 16.04
  • Перенесите данные сервера в поддерживаемую версию.

Причина:

См. вместо этого:

Об Iptables

Чтобы сделать сервер более безопасным после первоначальной настройки, Ubuntu поставляется с iptables, который является брандмауэром по умолчанию в дистрибутиве. В самом начале, несмотря на то, что брандмауэр Ubuntu настроен, он разрешает весь входящий и исходящий трафик на виртуальный частный сервер. Чтобы включить более надежную защиту на сервере, мы можем добавить несколько основных правил iptables.

Правила iptables состоят из набора опций, которые можно комбинировать для создания каждого конкретного процесса. Каждый пакет, пересекающий брандмауэр, проверяется каждым правилом по порядку. Как только он соответствует правилу, пакет следует связанному с ним действию, в противном случае он продолжается дальше по линии.

Примечание. В этом руководстве рассматривается безопасность IPv4. В Linux безопасность IPv6 поддерживается отдельно от IPv4. Например, \iptables\ поддерживает правила брандмауэра только для адресов IPv4, но у него есть аналог IPv6, называемый ip6tables\, который можно использовать для поддержки правил брандмауэра для сетевых адресов IPv6.

Если ваш VPS настроен для IPv6, не забудьте защитить сетевые интерфейсы IPv4 и IPv6 с помощью соответствующих инструментов. Дополнительные сведения об инструментах IPv6 см. в этом руководстве: How To Configure Tools for Use IPv6 on the 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

Мы можем пойти дальше и разбить это:

  1. -A указывает iptables добавить правило к таблице.
  2. INPUT обозначает это правило как часть цепочки ввода.
  3. m conntrack с последующим --cstate ESTABLISHED,RELATED гарантирует, что результат этого правила будет применяться только к текущим подключениям, а связанные с ними разрешены
  4. -j ACCEPT указывает, что пакет должен быть принят JUMP, и соединения остаются на месте.

После того, как мы убедимся, что все текущие подключения к виртуальному частному серверу могут оставаться непрерывными, мы можем приступить к блокировке других небезопасных подключений.

Предположим, что мы хотим заблокировать весь входящий трафик, кроме тех, которые приходят на 2 общих порта: 22 для SSH и 80 для веб-трафика. Мы продолжаем, разрешив весь трафик на назначенных портах с помощью следующих команд:

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo 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

  1. -I INPUT 1 помещает это правило в начало таблицы
  2. lo относится к петлевому интерфейсу
  3. -j ACCEPT гарантирует, что петлевой трафик будет принят

Теперь мы закончили создание базового брандмауэра. Ваши правила должны выглядеть так (мы можем увидеть детали iptable, набрав -v):

sudo iptables -L -v
Chain 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 Permanent.

Мы можем установить его с помощью 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

После любой перезагрузки сервера вы увидите, что правила остаются в силе.