How to install iptables on kali linux

Ручная настройка сети в linux

Настройка iptables: Самая простая конфигурация

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

В первую очередь, необходимо очистить загруженные правила:

iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

INPUT, OUTPUT, FORWARD — это три основные цепочки, по которым будут идти пакеты, входящие, исходящие и проходящие с интерфейса на интерфейс.

После этого необходимо задать политику по умолчанию. Их всего две — ACCEPT и DROP, принимать пакеты или не принимать. Для боевого сервера всегда необходимо выбирать DROP, а затем открывать всё, что необходимо и не более того.

Для задания таких политик необходимо предварительно разрешить соединения по SSH, будем считать, что мы не меняли стандартный порт (что обычно следует на боевых серверах делать сразу после установки SSH-сервера).

iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

И после этого уже можно приступать к изменению политик по умолчанию:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Для цепочки OUTPUT пока можно оставить политику по умолчанию ACCEPT, разрешающую исходящие соединения, к ней можно переходить после настройки цепочки INPUT, когда мы запретим входящие соединения. На многих серверах достаточно бывает правильно настроить цепочку INPUT, но мы рассмотрим позже также и настройку OUTPUT для более жесткой конфигурации.

Итак. В данный момент у нас открыт только порт SSH-сервера для входящих соединений, на все остальные порты соединения проходить не будут. Теперь надо добавить прием соединений на порты остальных сервисов, если они на вашем сервере запущены.

SMTP:

iptables -t filter -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT

DNS (обычно достаточно разрешить UDP, но можно также добавить и TCP):

iptables -t filter -A INPUT -p udp -m udp --dport 53 -j ACCEPT

HTTP:

iptables -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

POP3:

iptables -t filter -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT

HTTPS:

iptables -t filter -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

И так далее. Порты, которые необходимо открыть для того или иного сервиса, и протокол можно посмотреть в файле /etc/services, в котором перечислены все закрепленные за определенными сервисами порты.

Но это еще не всё. Порты открыты, сервисы доступны извне, но почта не работает и доменные имена не резолвятся. Дело в том, что при запросе DNS-серверов запрос отправляется с произвольного свободного порта из числа непривелегированных, точно так же, как и соединение с другим почтовым сервером. И ответ эти сервисы отправляют на тот же самый порт. А этот порт, как вы понимаете, у нас закрыт. Мы могли бы открыть этот порт, но мы не знаем, с какого порта будет исходящее соединение. Поэтому мы можем сделать самое простое, что может быть,- разрешить соединения с определенных портов удаленного компьютера:

SMTP:

iptables -t filter -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT

DNS:

iptables -t filter -A INPUT -p udp -m udp --sport 53 -j ACCEPT

Эти два правила разрешают входящие соединения с портов 25/tcp и 53/udp, поэтому, когда с этих портов приходят пакеты по соответствующему протоколу, они будут приняты. Если вы планируете обновлять систему, программное обеспечение или устанавливать пакеты, необходимые для работы, то вам придется разрешить соединения с 80 порта удаленных машин.

Вот теперь самая простая конфигурация iptables у нас готова.

После внесения правил в таблицы, необходимо их сохранить. Для этого можно воспользоваться, например, таким скриптом.

iptables-save and iptables-restore

The iptables/ip6tables commands provide a way to insert, delete and manage rules. However, the workflow isn’t particularly nice. First, you have to first list the existing rules. Next, you need to figure out where a new rule should go, and then write a command to insert the rule. Fortunately, iptables also comes with two commands, and . (The IPv6 equivalents are and ). These commands dump rules from all chains and filters into standard output. You can redirect it to a file like so:

iptables-save > iptables.rules

Now, you can edit this file comfortably with a text editor. When you’re done, you can apply these rules with:

iptables-restore < iptables.rules

You can also use them to persist iptables rules, as we’ll see in the next section.

Selecting interfaces

Since iptables matches packets to every rule in a chain, things can get really slow when there are a lot of rules. In such cases, it’s useful to exempt certain kinds of traffic.

For example, on a typical Nginx/PHP-FPM stack, Nginx communicates with PHP over localhost, which uses the . Similarly, PHP may connect to a database server like Redis using the loopback interface. It’s useless to filter these kinds of traffic, so you can allow it. The loopback interface is typically named and you can add a rule like this at the top of the INPUT chain:

iptables -A INPUT -i lo -j ACCEPT

The flag specifies the input interface. Here, we’ve assumed that the INPUT chain is empty and you’re adding the first rule. If that isn’t the case, you need to use the switch to add it at the top.

For the OUTPUT chain, you’ll need to use the flag, which stands for “output interface”. As an example, say you want to block the IP range 121.18.238.0/29, only when you’re on WiFi. If the WiFi interface is named , you can add a rule like the one below:

iptables -A OUTPUT -o wlan0 -d 121.18.238.0/29 -j DROP

Custom chains

Sometimes, you may need to do some complex processing on the same packet over and over. For example, say you want to allow SSH access just for a couple of IP ranges. With the types of rules we’ve seen so far, you’d have to do something like:

iptables -A INPUT -p tcp -m tcp --dport 22 -s 18.130.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -s 18.11.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j DROP

Unfortunately, this is a bit unwieldy and inefficient. A better way to organize these rules would be to use custom chains. First, you need to make a custom chain. We’ll name ours :

iptables -N ssh-rules

Then, you can add the rules for the IPs in the new chain. Of course, we aren’t limited to matching IPs — you can do just about anything here. However, since custom chains don’t have a default policy, make sure you end up doing something to the packet. Here, we’ve added a last line that drops everything else. There’s also the RETURN target, which allows you to return to the parent chain and match the other rules there — it’s similar to a non-terminating target.

iptables -A ssh-rules -s 18.130.0.0/16 -j ACCEPT
iptables -A ssh-rules -s 18.11.0.0/16 -j ACCEPT
iptables -A ssh-rules -j DROP

Now, you should put a rule in the INPUT chain that refers to it:

iptables -A INPUT -p tcp -m tcp --dport 22 -j ssh-rules

Using a custom chain carries many advantages. For example, you can entirely manage this chain through a script, and you don’t have to worry about interfering with the rest of the chain.

If you want to delete this chain, you should first delete any rules that reference to it. Then, you can remove the chain with:

iptables -X ssh-rules

О состояниях соединения

Существует множество протоколов, которым требуется двусторонняя коммуникация. К примеру, пользователю понадобилось поработать с SSH-соединением, ему придется внести правило сразу и в Output, и в Input.

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

Разрешим соединение типа SSH, приходящее через хост 120.120.120.120. Система будет отправлять данные по этому протоколу только, если сессия установлена.

Какие бывают правила

Для легкой работы с файрволом разработана тройка основных правил (команд):

1.Input.

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

2.Forward.

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

3.Output.

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

Примечание:

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

Примеры часто используемых команд iptables

Разобьем наши примеры на группы для удобства восприятия.

Общие команды

Просмотр правил с их номерами:

iptables -L —line-numbers

Для каждой таблицы смотреть правила нужно отдельно: 

iptables -t nat -L —line-numbers

Вывод правил с подробностями:

iptables -L -v

Удалить все правила:

iptables -F

Установить правила по умолчанию:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).

Разрешить все

Способ 1. С помощью добавления правила:

iptables -I INPUT 1 -j ACCEPT

iptables -I OUTPUT 1 -j ACCEPT

iptables -I FORWARD 1 -j ACCEPT

* данные три команды создадут правила, которые разрешают все входящие, исходящие и транзитные пакеты.

Способ 2. Чисткой правил:

iptables -F

iptables -S

* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).

Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):

service iptables stop

iptables stop

Работа с правилами

1. Добавить правило в конец списка:

iptables -A INPUT -p tcp —dport 25 -j ACCEPT

iptables -A INPUT -p tcp -s ! 192.168.0.25 —dport 993 -i eth0 -j ACCEPT

2. Добавить диапазон портов:

iptables -A INPUT -p tcp —dport 3000:4000 -j ACCEPT

* в данном случае, от 3000 до 4000.

3. Вставить правило:

iptables -I FORWARD 15 -p udp -d 8.8.8.8 —dport 53 -i eth1 -j ACCEPT

4. Заблокировать определенный IP-адрес для подключения по 25 порту:

iptables -I INPUT 1 -s 1.1.1.1 -p tcp —dport 25 -j DROP

5. Разрешить несколько портов:

iptables -A INPUT -p tcp —match multiport —dports 20,21,25,80,8080,3000:4000 -j ACCEPT

Проброс портов (port forwarding)

Рассмотрим пример проброса одного порта и диапазона портов.

Один порт (одинаковые порты)

Существует два способа настройки.

1. Правила PREROUTING + POSTROUTING:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 —dport 22 -j DNAT —to-destination 192.168.1.15:22

iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 —sport 22 -j SNAT —to-source 19.8.232.80:22

* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

2. Правила PREROUTING + FORWARD:

iptables -t nat -A PREROUTING -p tcp -i eth1 —dport 22 -j DNAT —to-destination 192.168.1.15:22

iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Один порт (разные порты)

Рассмотрим ситуацию, когда мы слушаем один порт, а пробрасываем на другой.

iptables -t nat -A PREROUTING -p tcp -i eth1 —dport 8022 -j DNAT —to-destination 192.168.1.15:22

iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 8022 — порт для проброса, на котором будем слушать запросы; 22 — порт для проброса на внутренний адрес; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Диапазон портов

При необходимости пробросить диапазон портов, используем команды:

iptables -t nat -I PREROUTING -p tcp -m tcp —dport 1000:5000 -j DNAT —to-destination 192.168.1.15:1000-5000

iptables -A FORWARD -d 192.168.1.15 -i eth1 -p tcp -m tcp —dport 1000:5000 -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 1000:5000 — порты для проброса (от 1000 до 5000); 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Стартовая настройка

Мы можем начать настройку брандмауэра на сервере с этих команд.

Разрешаем SSH:

iptables -I INPUT -p tcp —dport 22 -j ACCEPT

Создаем правила для нормальной работы apt или yum:

iptables -I INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

Разрешаем ICMP (для выполнения команды ping):

iptables -I INPUT -p icmp -j ACCEPT

Разрешаем все входящие на адрес локальной петли:

iptables -I INPUT -i lo -j ACCEPT

Ставим политику запрета на входящие и разрешаем все исходящие:

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

Настройка по умолчанию

Если мы хотим вернуть настройки в первоночальное значение (разрешено все, правил нет), выполняем команды ниже.

Сначала ставим разрешающую политику для основных цепочек:

iptables -S

Ставим политику разрешения на входящие и исходящие:

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

Удаляем все правила во всех таблицах:

iptables -F

iptables -t nat -F

iptables -t mangle -F

Удаляем все цепочки, которые не используются:

iptables -X

Wrapping Up

I hope this comprehensive guide has helped you learn how to safely disable iptables firewall in Kali Linux when required. While disabling iptables opens up exposure, following the practices outlined helps minimize risks significantly.

Make sure to only disable filtering temporarily while testing, never leaving systems open permanently. Also take advantage of rules that allow just required ports rather than removing all filters.

Use iptables logging and reject capabilities even while disabled to give you visibility into traffic and block unwanted connections. Finally, leverage sandboxes like virtual machines to test disabling the firewall first before using in production.

By intelligently managing Kali‘s iptables firewall configurations for penetration tests, you can keep your systems secured while allowing tools to function smoothly. Thanks for reading and happy ethical hacking!

firewalld

firewalldfirewall-cmdzonestargettarget: defaultarget: defaulttarget: DROP%%REJECT%%firewall.html#tables_chains_diagramfirewalls.org zone options

system-config-firewall		# for static rule config of firewalld
firewall-config			# ?? gui??
systemctl status firewalld



cf in 
/usr/lib/firewallD	hold zone config, rules, etc.
/etc/firewalld/... 	system config.  bunch of xml files.


firewall-cmd --list-all-zones					# like UFW, can support zones like public, private, etc.

firewall-cmd --get-active-zones
firewall-cmd --get-default-zone

firewall-cmd --zone=public --list-all				# list all rules that is applicable to the "public" zone



firewall-cmd --get-services					# list canned service like httpd

firewall-cmd --zone=public --add-port=4000/tcp            	# allow port 4000 from anywhere, runtime
firewall-cmd --zone=public --add-port=4000/tcp --permanent	# allow port 4000 from anywhere, config

firewall-cmd --zone=public --remove-port=4000/tcp            	# undo the add above

firewall-cmd --reload						# read from config, presumably drop anything that is runtime and not in --permanent

firewall-cmd --runtime-to-permanent			# save config that were done without --permanent

firewall-cmd --direct --get-all-chains				# direct interaction with iptables
firewall-cmd --direct --get-all-rules


# eg for removing subnet or host from a specific zone
firewall-cmd --zone=internal --remove-source 128.3.0.0/16 --permanent
firewall-cmd --zone=trusted  --remove-source 128.3.7.87   --permanent
firewall-cmd --zone=trusted  --remove-source 128.3.7.87                # rm running config is more important
## ansible add it to internal


Linode intro to firewallD on CentOS

Precedence
  1. Sources (list of IP) are processed first.
  2. Interfaces (eg eno1, enp94s0f0) are applied second
  3. In a zone, target: default means kick the packet upstair (typically means ACCEPT if the service is listed, DROP/REJECT otherise?)
  4. the default zone is not the same as target: default default zone is often what Network Manager assign when the network is joined. firewalld allow explicitly defining which one is the default zone (eg set it to DMZ)
  5. iptables -S would be good friend for debugging
  6. rich rules are low level iptable rules, not recommended in firewallD, unless no pre-defined service for it. it is processed within a zone.
  • Linux Journal Zone Config on FirewallD
  • RHEL7 firewallD Zones

tmp
public.xml firewalld direct edit of

  {rule family="ipv4"}
    {source address="10.229.192.0/24" /}
    {service name="ssh" /}
    {accept/}
  {/rule}

  {rule family="ipv4"}
    {source address="10.229.192.0/24" /}
    {to-port="104" /}
    {accept/}
  {/rule}

internal (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 10.15.0.0/16 192.168.1.0/24
  services: ssh
  ports: 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
Masquerade/NAT

Masquerade (ie, perform NAT):
eg Simple NAT-router, route internal zone traffic with RFC 1918 private IP range to public zone (internet).
Just need to add masquerade to the public zone, ie perform NAT on all packets coming in and out.

firewall-cmd --add-masquerade --zone=public --permanent


DNAT = Destination NAT.   Think of Port forwarding.
eg Expose web server to the public world.

firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.199.10


blog

Changing the default policy

Previously, we’ve explained the concept of a default policy. By default, the default chains have a default policy of accepting all traffic. This is also something that you can see in the list of rules:

Chain INPUT (policy ACCEPT)
...
Chain FORWARD (policy ACCEPT)
...
Chain OUTPUT (policy ACCEPT)
..

You can change the default policy with the switch. Perhaps you’re configuring iptables for your home computer, and you don’t want any local programs to receive inbound connections. Once you’ve set iptables to accept packets from related and established connections, you can switch the INPUT chain’s policy to DROP with:

iptables -P INPUT DROP

Keep in mind that you should first accept packets from established and related connections before using this rule! If you don’t, you’ll find out that you can’t use any internet based applications, becuase the responses coming in through the INPUT chain will be dropped.

Что такое Iptables?

Подсистема iptables и Netfilter уже достаточно давно встроена в ядро Linux. Все сетевые пакеты, которые проходят через компьютер, отправляются компьютером или предназначены компьютеру, ядро направляет через фильтр iptables. Там эти пакеты поддаются проверкам и затем для каждой проверки, если она пройдена выполняется указанное в ней действие. Например, пакет передается дальше ядру для отправки целевой программе, или отбрасывается.

Виды пакетов

Все пакеты делятся на три типа: входящие, исходящие и проходящие. Входящие — это те, которые были отправлены на этот компьютер, исходящие — отправленные из этого компьютера в сеть. А проходящие — это пакеты, которые просто должны быть пересланы дальше, например, если ваш компьютер выступает в качестве маршрутизатора.

Соответственно в фильтре iptables все пакеты делятся на три аналогичные цепочки:

  • Input — обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
  • forward — эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Как я уже говорил, такое наблюдается на маршрутизаторах или, например, если ваш компьютер раздает wifi;
  • output — эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping losst.pro или когда вы запускаете браузер и пытаетесь открыть любой сайт.

Но если вы думаете что можно просто полностью закрыть цепочку Input для увеличения безопасности, то вы очень сильно ошибаетесь. При работе сети используются обе цепочки input и output. Например, вы пытаетесь выполнить ping, данные отправляются через output, но ответ приходит через input. То же самое происходит при просмотре сайтов и других действиях. А вот цепочка forward может вообще не использоваться если ваш компьютер не является маршрутизатором. Так что настройка iptables должна выполняться очень аккуратно.

Правила и действия

Перед тем как перейти к созданию списка правил iptables нужно рассмотреть как они работают и какие бывают. Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:

  • ACCEPT — разрешить прохождение пакета дальше по цепочке правил;
  • DROP — удалить пакет;
  • REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
  • LOG — сделать запись о пакете в лог файл;
  • QUEUE — отправить пакет пользовательскому приложению.

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

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

  • prerouting — в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
  • postrouting — сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.

Но это еще не все. У нас еще есть таблицы iptables, с которыми тоже желательно разобраться.

Настройка Nftables на Linux

Nftables — это инструмент, с помощью которого идет настройка фаервола Netfilter. Для настройки он использует конфиг — /etc/nftables.conf и команду nft. А также Nftables может быть запущен как служба.

Служба и конфиг nftables

В системе Debian 11 и Ubuntu 22.04 по умолчанию существует служба nftables, что облегчает управление файрволлом. Вы можете выполнять следующие команды:

  • — включить автозагрузку службы
  • — отключить автозагрузку службы
  • — запустить службу
  • — остановить службу
  • — перезагрузить службу

По умолчанию эта служба выключена и перед добавлением правил в файрволл, её нужно включить. При запуске служба читает конфиг /etc/nftables.conf и запускается с указанными там правилами.

По умолчанию конфиг выглядит так:

$ cat /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
        chain input {
                type filter hook input priority filter;
        }

        chain forward {
                type filter hook forward priority filter;
        }

        chain output {
                type filter hook output priority filter;
        }
}

Давайте разберем его:

  • — конфиг выполнен в виде скрипта, а в качестве оболочки будет использован /usr/sbin/nft;
  • — первым делом выполняется команда, которая очистит фаервол от всех правил;
  • — блок в котором мы описываем таблицу filter. Ключевое слово inet означает что таблица создана для ipv4 и ipv6

    chain input { } — блок описывающий правила для input;

    . Здесь содержаться 3 вложенных блока для разделения правил на разные цепочки:

    • — этот блок для forward;
    • — а этот для output;

В каждой цепочке есть правило, которое её описывает:

type filter hook input (или forward или output) priority filter;

Цепочку вы можете назвать как угодно (chain input, или chain my_input, или chain in), но вот фраза определит эту цепочку как input для таблицы filter. Поменяйте input на forward или output, чтобы поменять тип цепочки.

Редактировать этот конфиг вручную не нужно, для этого есть специальная команда (nft), с помощью которой можно добавлять свои таблицы, цепочки и правила. А также удалять или редактировать их. Но так как в системе уже есть конфиг в котором есть таблица filter и цепочки input, forward и output, то нам остаётся лишь добавлять правила (rule). В этой статье я не буду рассматривать добавление таблиц и цепочек.

Просмотр действующих правил

Чтобы посмотреть правила, которые применяются прямо сейчас, выполните команду:

$ sudo nft list ruleset
table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }
}

Если у вас команда ничего не показала, то скорее всего у вас выключена служба nftables и вам нужно её запустить.

Видим почти-что наш конфиг, но без двух строк ( и ). То есть команда показывает нам только таблицы, цепочки и правила. А что такое policy accept и почему этого не было записано в конфиге, разберём ниже в этой статье.

Прохождение цепочки

Пакет, попавший в цепочку, начинает проходить правила указанные в ней сверху вниз. Фаервол сравнивает пакет с первым правилом, затем со вторым и так далее. Если фаервол определит правило для этого пакета, то с пакетом будет выполнено действие:

  • drop — пакет будет уничтожен;
  • accept — пакет сразу же покинет эту цепочку и пойдет дальше, то есть нижние правила уже не будут рассмотрены.

А если фаервол не найдет в данной цепочке подходящего правила для пакета, то фаервол выполнит действие с пакетом, которое указано в политике (policy accept или policy drop).

Прохождение пакетом цепочки input

Сейчас во всех цепочках политика accept, и нет других правил. Это означает что все пакеты разрешены во все стороны (нет никаких правил и политика разрешает прохождение пакетов).

Если изменить политику на drop, то будет обратная ситуация. Нет никаких правил, а политика будет отбрасывать все пакеты.

Обычно для цепочки input добавляют некоторые разрешающие правила, а затем меняют политику на drop. Таким образом всё что мы не разрешили будет запрещено. А цепочку output вообще не трогают, оставляя политику accept. То есть к нашему серверу можно подключиться только определённым образом, а сам сервер может отправлять пакеты куда захочет (например в интернет).

Если в конфиге /etc/nftables.conf мы не обозначили политику для цепочек, то будет использован accept. Именно это и показывает команда nft list ruleset.

Protocols and modules

So far, we’ve seen examples of blocking IPs. However, you can do a lot more, by using modules and protocol based matching.

We’ll begin with a simple example. Say, you want to block all incoming TCP traffic. This isn’t too useful, but it’s an useful starting point. You simply need to specify the protocol with like so:

iptables -A INPUT -p tcp -j DROP

You can also specify other protocols such as or . To work with ICMP traffic on , you’ll need to use as the protocol.

Let us consider a more useful example this time. Say, you need to block SSH access for an IP range. You have to first match all TCP traffic, like we did in the example above. Then, to check the destination port, you should first load the module with . Next, you can check if the traffic is intended to the SSH destination port by using . Thus, the entire command would be:

iptables -A INPUT -p tcp -m tcp --dport 22 -s 59.45.175.0/24 -j DROP

Now, perhaps you want to block SSH and VNC access for the IP range. While you can’t specify multiple ports with the module, you can do so with the module. Then, you can specify the port numbers with . The final command would be:

iptables -A INPUT -p tcp -m multiport --dports 22,5901 -s 59.45.175.0/24 -j DROP

Let us consider another example. Say, you want to block ICMP address mask requests (type 17). First, you should match ICMP traffic, and then you should match the traffic type by using in the module:

iptables -A INPUT -p icmp -m icmp --icmp-type 17 -j DROP

In the next section, we’re going to look at a very important module: the connection tracking module. In addition, we’re also going to look at other modules later in this article.

How Can I See Firewall Rules in Ubuntu?

Before making any changes to your firewall, it is best practice to view the existing rule set and understand what ports are already open or closed. To list all firewall rules, run the following command.

If this is a brand new Ubuntu 16.04 installation, you may see there are no rules defined! Here is an example “empty” output with no rules set:

If you’re running Ubuntu 16.04 on a Liquid Web VPS, you’ll see we’ve already configured a basic firewall for you. There are usually three essential sections to look at in the iptables ruleset. When dealing with iptables rulesets, they are called “chains”, particularly “Chain INPUT”, “Chain FORWARD”, and “Chain OUTPUT”. The input chain handles traffic coming into your server while the output chain handles the traffic leaving your server. The forwarding chain handles server traffic that is not destined for local delivery. As you can surmise, the traffic is forwarded by our server  to its intended destination.

Понравилась статья? Поделиться с друзьями:
Цифровой взгляд 👁
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: