IPTABLES

Переменная, для прохождения пакетов, по умолчанию в состоянии запрещенно.
Изменить временно(до первой перезагрузки) из командной строки sysctl net.ipv4.ip_forward=1

Для постоянной раскоментировать строчку #net.ipv4.ip_forward=1
в /etc/sysctl.conf
или можно создать файл /etc/sysctl.d/20-my-forward.conf со строчкой net.ipv4.ip_forward=1
В последних версиях Линукс iptables заменил nftables, речь о котором пойдет  на другой страничке.

Для установки iptables
apt install iptables

iptables -L #узнать правила

iptables -S #статус цепочек
Пример вывода:
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
удалить конкретное правило
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

iptables -F #очистить все правила
Удалить только определенную цепочку
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

хочу обратить внимание что правила имеют временный характер, и после перезагрузки пропадают. Для того что-бы они работали после ребута нужно поставить
apt install iptables-persistent
правила будут храниться в /etc/iptables/rules.v4 и для ipv6 /etc/iptables/rules.v6
iptables-save > /etc/iptables/rules.v4 # сохранить правила
iptables-restore < /etc/iptables/rules.v4 # загрузить правила
я предпочитаю работать с самим файлом предварительно сделав копию, бекапы наше ВСЁ, даже в мелочах.
cp /etc/iptables/rules.v4 /etc/iptables/old_rules.v4
Как я уже сказал, предпочитаю работать напрямую с файлом правил, так нагляднее и можно посидеть подумать, те кто предпочитает из командной строки то в конце распишу как это делать, а пока файл с правилами.
vim /etc/iptables/rules.v4
напоминалка: у vim есть замечательная связка с командой sed которая найдет и заменит значение :%s/оригинал/заменить_на/g пример :%s/abc/def/g

# ОТ ЭТОЙ точки и до конечной можно скопировать и вставить к себе, естественно коментарии удалить.

# Пример правил для шлюза локальной сети.
# Для непосредственного использования не годится!
# На шлюзе два сетевых интерфейса:
# eth1 --- локальный, IP 192.168.100.1
# eth0 --- глобальный, IP 192.168.50.42
# Все IP адреса и доменные имена вымышленные. Вместо них подставлять свои.

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

#
[0:0] -A PREROUTING -d 192.168.50.42/32 -p tcp -m tcp --dport 10300 -j DNAT --to-destination 192.168.100.5:10300
[0:0] -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j SNAT --to-source 192.168.50.42
#[0:0] -A POSTROUTING -o eth0 -s 192.168.100.0/24 -j MASQUERADE

#это если нет выделенного IP
COMMIT
# В сеции nat два правила. Первое --- пример DESTINATION NAT: все TCP пакеты,
# адресованные на реальный IP шлюза, на порт 10300, перенаправляются в локальную
# сеть, адрес получателя на IP "конверте" переписывается на адрес локального
# узла 192.168.100.5, на то-же порт 10300.
# Второе правило --- пример SOURCE NAT.
# Для всех пакетов, источником которых являются узлы локальной сети, переписывается
# адрес отправителя на IP "конверте", локальный адрес заменяется статическим
# реальным адресом внешнего интерфейса.
#########################################################################################################################

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:outtos - [0:0]
:pretos - [0:0]
COMMIT

#########################################################################################################################

# Таблица filter. Программа iptables, если не указать другой таблицы,
# будет размещать правила здесь.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:eth1_in - [0:0]
:eth1_out - [0:0]
:eth0_in - [0:0]
:eth0_out - [0:0]


# Политика фильтрации по умолчанию для трёх основных цепочек:
# --- для входящих в систему пакетов;
# --- для транзитных пакетов, следующих с интерфейса на интерфейс,
# минуя систему;
# --- для пакетов, исходящих из системы.
# Запрещено всё, что не разрешено. То есть в фильтрующих цепочках
# в идеале должны стоять разрешающие правила.
# Создание своих собственных цепочек в таблице filter. Для входящих и
# исходящих пакетов, применительно к каждому интерфейсу отдельно.
# Можно этого не делать, но так удобнее: у глобального интерфейса
# свои правила фильтрации, у локального --- свои.

[0:0] -A INPUT -i lo -j ACCEPT
# Локальный закольцовывающий интерфес безопасен, пропускаем все пакеты
# от него в систему.

[0:0] -A INPUT -p icmp -j ACCEPT
# Пропускать в систему все ICMP пакеты без ограничений. Можно и не ограничивать.

[0:0] -A INPUT ! -p icmp -m conntrack --ctstate INVALID -j DROP
# Для всех протоколом кроме icmp. Если состояние пакета определить не удалось (мусор), "молча" уничтожить его.

[0:0] -A INPUT -d 255.255.255.255/32 -j DROP
# Уничтожение широковещательных пакетов на всех интерфейсах. Если правило работает, то умирают все сервисы к примеру dhcp

[0:0] -A INPUT -d 192.168.100.255/32 -j DROP
# Уничтожение широковещательных пакетов на локальной сети.

[0:0] -A INPUT -d 158.56.124.115/32 -j DROP
# запрещаем прием от определенного IP, молча все пакеты убиваем.

[0:0] -A INPUT -i eth0 -j eth0_in
# Пакеты поступившие на глобальный интерфейс, направляются в свою цепочку.

[0:0] -A INPUT -i eth1 -j eth1_in
# Для пакетов поступивших на локльный интерфейс тоже есть своя цепочка.
# Дальше никакой пакет просто не пройдёт, но если пройдёт, то в
# соответствии с политикой будет уничтожен.
#########################################################################################################################

# Далее --- фильтрация транзитных пакетов, следующих с одного интерфейса
# на другой. Правила должны быть максимально точными и "узкими".
# Беспорядочный транзитных пропуск пакетов опасен!!!
[0:0] -A FORWARD -p icmp -j ACCEPT
# Пропуск пингов и понгов, а также пакетов программы traceroute.
# Свободный пропуск пингов и понгов может нести в себе угрозу!!! лучше ставить DROP
[0:0] -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Транзитные пакеты, принадлежащие уже установленной сессии пропустить
# беспрепятственно.
[0:0] -A FORWARD -i eth1 -p tcp -m multiport --dports 22 -j ACCEPT
# Транзитные TCP пакеты, направляемые на порт 22, пропускать
# беспрепятственно. Опасно!
[0:0] -A FORWARD -s 192.168.100.67/32 -d online.payment-system.com -i eth1 -p tcp -m multiport --dports 80,443 -j ACCEPT
# Хорошее правило. От конкретного узла локальной сети беспрепятсвенно
# пропускать HTTP и HTTPS пакеты на адрес, связанный с доменным именем
# какой-то платёжной системы. Преобразование имени в адрес осуществляется
# единожды, при загрузке правил. Если платёжная система сменит IP адрес,
# правила будет необходимо перезагрузить.
# ниже дополнительные правила для другой машины
[0:0] -A FORWARD -s 192.168.100.68/32 -d taxcom.ru -i eth1 -p tcp -m multiport --dports 22,110,587,5110 -j ACCEPT
[0:0] -A FORWARD -s 192.168.100.68/32 -d 55.66.77.88 -i eth1 -p tcp --dport 443 -j ACCEPT


# Пакеты, не соответствующие разрешающим правилам, неминуемо
# доберутся до этой точки, и попадут на правило, отправляющее
# информацию в системный журнал.
[0:0] -A FORWARD -j LOG --log-prefix "iptables:FORWARD:REJECT:" --log-level 6

# Фильтрация пакетов исходящих из системы. Для шлюза локальной сети,
# при наличии толики здравого смысла, фильтровать тут практически
# нечего.
[0:0] -A OUTPUT -o lo -j ACCEPT
[0:0] -A OUTPUT ! -p icmp -m conntrack --ctstate INVALID -j REJECT
[0:0] -A OUTPUT -p icmp -j ACCEPT
[0:0] -A OUTPUT -o eth0 -j eth0_out
[0:0] -A OUTPUT -o eth1 -j eth1_out


#Рассмотрим по интерфейсам (eth1 - local. eth0 - wan)
[0:0] -A eth1_in -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[0:0] -A eth1_in -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP

# Уничтожение явно фальшивых пакетов, у которых флаг не соответствует состоянию.
#
[0:0] -A eth1_in -p tcp -m conntrack --ctstate NEW -m multiport --dports 22,110,587,3128 -j ACCEPT
# К шлюзу позволен удалённый доступ по SSH. На шлюзе работает SQUID, и это очен правильно.
# И "по своместительству" шлюз ещё и почтовым сервером работает, пропускаем все пакеты
# POP3 и SMTP.

[0:0] -A eth1_in -s 192.168.100.24/32 -p tcp -m conntrack --ctstate NEW -m multiport --dports 20,21 -j ACCEPT
# На шлюзе есть и FTP, но доступ к нему из локальной сети открыт не всем.
#
[0:0] -A eth1_in -p udp -m conntrack --ctstate NEW -m udp -m multiport --dports 53,123 -j ACCEPT
# На шлюзе работает DNS-серврер и сервер времени NTP. Это правильно, и всем локальным узлам
# можно пользоваться его услугами.

[0:0] -A eth1_in -j LOG --log-prefix "iptables:eth1_in:REJECT:" --log-level 6
# Разрешающие правила кончились. Записываем в журнал, но уничтожать пакет
# "молча", в соответствии с политикой, нельзя: в локальной сети работают
# наши коллеги, нужно им дать знать, что их запрос выполнить нельзя.
[0:0] -A eth1_in -j REJECT

[0:0] -A eth1_out -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

[0:0] -A eth0_in -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[0:0] -A eth0_in -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP
[0:0] -A eth0_in -p tcp -m conntrack --ctstate NEW -m multiport --dports 22,25 -j ACCEPT
[0:0] -A eth0_in -s 10.5.4.0/24 -p tcp -m conntrack --ctstate NEW -m multiport --dports 20,21,10300 -j ACCEPT

#разрешаем к этим портам только из определенной подсети

[0:0] -A eth0_in -j LOG --log-prefix "iptables:eth0_in:DROP:" --log-level 6

[0:0] -A eth0_out -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT


#Копировать до этой точки.



Ручной ввод из командной строки

Если Вы хотите запретить принимать любой трафик на этом сервере, введите команду:
iptables --policy INPUT DROP

Чтобы вернуть трафик назад к ACCEPT, сделайте следующее:
iptables --policy INPUT ACCEPT


Аналогичные команды подойдут и для работы с цепочками OUTPUT и FORWARD:
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP


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

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Разрешение портов
Если у Вас на сервере запущен веб-сервер, тогда Вы должны разрешить 80 порт Вашему межсетевому экрану для того, чтобы сервер мог его прослушивать или отвечать на него. Сделаем это с помощью следующей команды:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Где:
-A — это добавление нового правила в список.
INPUT — изменения касаются цепочки INPUT.
-P — указывает на протокол. В данном случае, на TCP.
--dport — порт назначения. По умолчанию любой веб-сервер запущен на 80 порте.

Точно также Вы можете разрешить порт SSH:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT


Блокировка портов
Чтобы заблокировать порт 135, вводим:
iptables -A INPUT -p tcp --dport 135 -j DROP

Если Вы хотите заблокировать возможность подключаться по SSH с Вашего сервера к другому хосту или серверу, введите следующую команду:
iptables -A OUTPUT -p tcp --dport 22 -j DROP
В результате никто не сможет использовать Ваш сервер для старта SSH-подключения. При этом цепочка OUPUT будет фильтровать, а DROP — сбрасывать любое исходящее TCP-подключение к другим хостам.

Разрешение IP-адресов и портов
Чтобы разрешить IP-адреса и порты, необходимо ввести следующую команду:
iptables -A INPUT -p tcp -s 0/0 --dport 22 -j ACCEPT


Вы хотите разрешить определенный IP-адрес, используйте эту команду
iptables -A INPUT -p tcp -s 12.12.12.12/32 --dport 22 -j ACCEPT
В примере выше Вы разрешаете только IP-адресу 12.12.12.12 подключиться к порту SSH. Остальные IP-адреса не смогут подключитьcя к 22 порту.

Если Вы хотите заблокировать IP-адрес, измените ACCEPT на DROP таким образом:
iptables -A INPUT -p tcp -s 12.12.12.0/24 --dport 22 -j DROP
Эта команда не разрешит подключаться к 22 порту устройствам с IP-адресами с 12.12.12.1 по 12.12.12.255.

Блокировка ICMP
Если Вам нужно заблокировать запрос ICMP (ping) от и к Вашему серверу, введите следующие команды:
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
Эта команда заблокирует отправку ICMP-пакетов к другому хосту. Попробуйте пропинговать google.com — у Вас ничего не получится!

Чтобы заблокировать входящий ping-запрос, введите следующие команды в терминале:
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
Теперь сервер не будет отвечать на ping-запросы.

Как предотвращать DDoS-атаки
Чтобы не допустить этот вид атаки, воспользуйтесь следующей командой:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
Где:
--limit 20/minute — максимальная средняя частота положительных результатов. После этого числа можно указывать единицы: `/second', `/minute', `/hour', `/day'; значение по умолчанию — 3/hour. Лимит настраивайте в зависимости от своих требований.
--limit-burst number — ограничивает исходное число пропускаемых пакетов. Это число увеличивается на единицу каждый раз, когда ограничение на частоту положительных результатов не достигается. Это происходит столько раз, сколько указано в данном параметре. Значение по умолчанию — 5.

Блокировка сканирования порта
iptables -N block-scan
iptables -A block-scan -p tcp —tcp-flags SYN,ACK,FIN,RST -m limit —limit 1/s -j RETURN
iptables -A block-scan -j DROP

Где block-scan — это название новой цепочки.