Skip to content

iptables

Install ipdables with nft

apt install iptables

https://habr.com/ru/company/ruvds/blog/580648/

Check iptables uses nft

iptables -V
iptables v1.8.7 (nf_tables)
ls -lh /etc/alternatives/iptables*
lrwxrwxrwx 1 root root 22 Aug  7 15:34 /etc/alternatives/iptables -> /usr/sbin/iptables-nft
lrwxrwxrwx 1 root root 30 Aug  7 15:34 /etc/alternatives/iptables-restore -> /usr/sbin/iptables-nft-restore
lrwxrwxrwx 1 root root 27 Aug  7 15:34 /etc/alternatives/iptables-save -> /usr/sbin/iptables-nft-save

To update alternatives

update-alternatives --config iptables

Keep rules after reboot

apt install iptables-persistent
systemctl is-enabled netfilter-persistent.service

Check persistent rules

cat /etc/iptables/rules.v4

After you add new rule you should save it to persistent rule

iptables-save > /etc/iptables/rules.v4

https://www.cyberciti.biz/faq/how-to-save-iptables-firewall-rules-permanently-on-linux/

Show rules

iptables -L -v -n --line-numbers

Add SSH from specific address

iptables -A INPUT -p tcp ! -s 11.11.11.11 --dport 22 -j DROP

OR

iptables -A INPUT -p tcp -s 11.11.11.11/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Allow HTTP

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Allow ICMP

iptables -A INPUT -p icmp -j ACCEPT

Allow local

iptables -A INPUT -i lo -j ACCEPT 
iptables -A OUTPUT -o lo -j ACCEPT

https://selectel.ru/blog/setup-iptables-linux/

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

Insert rule on specific position

iptables -I INPUT 1 -s 11.11.11.11 -j ACCEPT

Set default rule for incoming

iptables -P INPUT DROP

Delete rule

iptables -D INPUT 5

https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands

iptables and firewalld

CentOS 8 uses nftables, which by itself isn't surprising. It ships with the nft version of the iptables commands, which means when you use the iptables command it actually maintains a set of compatibility tables in nftables.

iptables --version
iptables v1.8.2 (nf_tables)

However...

Firewalld - which is installed by default - has native support for nftables, so it doesn't make use of the iptables compatibility layer.

So while iptables -S INPUT shows you:

iptables -S INPUT
-P INPUT ACCEPT

What you actually have is:

nft list table inet firewalld
nft list ruleset

chain filter_INPUT {
        type filter hook input priority 10; policy accept;
        ct state established,related accept
        iifname "lo" accept
        jump filter_INPUT_ZONES_SOURCE
        jump filter_INPUT_ZONES
        ct state invalid drop
        reject with icmpx type admin-prohibited  <-- HEY LOOK AT THAT!
}

The solution here (and honestly probably good advice in general) is:

systemctl disable --now firewalld

With firewalld out of the way, the iptables rules visible with iptables -S will behave as expected.

iptables can only confirm the table with the specified keywords. If nftables is running behind firewalld, the rules displayed in iptables are incorrect! So use nft instead of iptables to check the rules

Limit to 32 connections per client

iptables -A INPUT -p tcp --syn --dport ${LISTENING_PORT} -m connlimit --connlimit-above 32 -j REJECT --reject-with tcp-reset

просмотреть все правила iptables

iptables -L -n -v

Show specific NAT table

iptables -t nat --line-numbers -n -L
iptables [-t ТАБЛИЦА] -A ЦЕПОЧКА ПАРАМЕТРЫ_ПАКЕТА -j ДЕЙСТВИЕ

Цепочки: - INPUT - пакеты предназначающиеся Вашему узлу. То есть входящий трафик. Транзитный трафик сюда не попадает. - FORWARD - пакеты которые предназначены для другого узла, то есть транзитный трафик. - OUTPUT - пакеты, которые уходят от нашего узла, или исходящий трафик. Транзитный трафик сюда не попадает. - -A - добавление нового правила в цепочку. Правило будет добавлено в конец цепочки. - -I - добавление правила не в конец,а туда куда вы укажите. - -D - удаление правила. - -F - сброс всех правил цепочки. - -N - создание пользовательской цепочки. - -X - удаление пользовательской цепочки.

iptables delete all rules

iptables -F # table "filter" is a default table
iptables -t nat -F
iptables -t mangle -F

фильтрация пакета по источнику

iptables -A INPUT -s 192.168.133.133 -j DROP

фильтрация пакета по назначению

iptables -A OUTPUT -d 192.168.156.156 -j DROP

фильтрация по протоколу и порту источника

iptables -A INPUT -p tcp --sport 80 -j ACCEPT

фильтрация по протоколу и порту назначения

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Действия: - ACCEPT - разрешить пакет. - DROP - уничтожить пакет. - REJECT - будет отправлено ICMP сообщение, что порт недоступен. - LOG - информация об этом пакете будет добавлена в системный журнал (syslog). Не прерывает цепочку. - Модули (-m модуль параметр) - -m state - NEW - пакет устанавливающий новое соединение. - ESTABLISHED - пакет от уже установленного соединения. - RELATED - пакет устанавливающий новое соединение от уже установленного (ESTABLISHED) соединения (пример: установка FTP-data соединения из FTP-control соединения). - INVALID - говорит о том, что пакет не может быть идентифицирован и поэтому не может иметь определенного статуса

iptables -A INPUT -s 192.168.0.1 -m mac --mac-source 00:65:3F:ED:12:98 -j DROP

Пример, защищенной настройки iptables

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
iptables -A INPUT DROP

The first rule records the IP address of each attempt to access port 22 using the recent module. The second rule checks to see if that IP address has attempted to connect 4 or more times within the last 60 seconds, and if not then the packet is accepted. Note this rule would require a default policy of DROP on the input chain.

В CentOS править нужно /etc/sysconfig/iptables в котором и содержатся правила, для сохранения после перезагрузки

Secure SSH

iptables -A INPUT -p tcp --dport 22 -m recent --set --name ssh --rsource
iptables -A INPUT -p tcp --dport 22 -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh --rsource -j ACCEPT

Пример правил для NAT

iptables -A INPUT -p tcp --dport 2382 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dst $EXT_IP --dport 2382 -j DNAT --to-destination $INT_IP:8082
iptables -t nat -A POSTROUTING -p tcp --dst $INT_IP --dport 2382 -j SNAT --to-source $EXT_IP

для DHCP - сервера

iptables -I INPUT -i eth0 -p udp --dport 67 --sport 68 -j ACCEPT

для сохранения правил

service iptables save

NAT to lower port for non-root process

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

Добавление определения портов для сетевых сервисов

nano /etc/services

zabbix_agent  10050/tcp
zabbix_trap   10051/tcp