Користувальницькькі налаштування

Налаштування сайту


iptables

iptables

NAT

# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -s <LAN_IP>/24 -j ACCEPT
# iptables -t nat -A POSTROUTING -o wan0 -j SNAT --to <WAN_IP>

wan0 – сетевой интерфейс, подключённый к интернету

MASQUARADE FIXME

Проброс порта

# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -s <LAN_IP>/24 -j ACCEPT
# iptables -t nat -A PREROUTING -i wan0 -o eth0 -p tcp --dport 22 -j DNAT --to <LAN_SERVER_IP>:22

Перенаправление порта

Представим ситуацию, что у нас есть сервис, ожидающий входящих соединений на порту 1111. А нам нужно, чтобы другие программы могли подключаться к порту 2222, но при этом соединяться с этим сервисом. Для этого мы можем перенаправить пакеты, приходящие в порт 2222, в нужный нам порт – 1111.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j REDIRECT --to-port 1111

Ещё часто уточняют1), что это правило не будет работать для локальных подключений. Поэтому для них надо добавить ещё одно отдельно:

iptables -t nat -A OUTPUT -o lo -p tcp --dport 2222 -j REDIRECT --to-port 1111

Ограничение числа соединений в некоторый порт

Чтобы ограничить максимально допустимое число соединений с некоторого IP-адреса в некоторый порт нашего сервера, можно воспользоваться правилом -m connlimit:

iptables -I INPUT --src <IP_ADDRESS> -p tcp --dport <PORT_NUMBER> -m connlimit --connlimit-above <MAX_CONNECTIONS> -j DROP

Для ограничения суммарного числа соединений с некоторого диапазона IP-адресов, можно применить маску. Для этого существует параметр --connlimit-mask. Например:

iptables -I INPUT --src <IP_ADDRESS> -p tcp --dport <PORT_NUMBER> -m connlimit --connlimit-above <MAX_CONNECTIONS> --connlimit-mask 24 -j DROP

Это ограничит суммарное число соединений в порт номер <PORT_NUMBER> с некоторого диапазона адресов, заданного 24-битной маской. Например, если в качестве <IP_ADDRESS задать IP-адрес 162.211.231.29, то под это правило подпадут все адреса из диапазона 162.211.231.xxx

Разумеется, частным случаем маски является маска длиной 0 бит, которая позволяет охватить одним правилом все допустимые IP-адреса:

iptables -I INPUT 1 -p tcp --dport <PORT_NUMBER> -m connlimit --connlimit-above <MAX_CONNECTIONS> --connlimit-mask 0 -j DROP

Как видно, в таком случае базовый IP-адрес можно и вовсе не указывать.

Предотвращение DDoS-атаки

Взято отсюда: Limit number of connections [DoS prevention]

iptables -N conn-flood
iptables -I INPUT 1 -p tcp --syn -j conn-flood
iptables -A conn-flood -m limit --limit 7/s --limit-burst 20 -j RETURN
iptables -A conn-flood -j DROP
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp -j DROP

Согласно источнику, эта конфигурация ограничивает число соединений до 7 в секунду, допуская в общей сложности 20 соединений (+1 icmp).

Для ограничения числа соединений на всех портах и для всех протоколов в единицу времени, можно использовать следующие правила:

iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED -m recent --set -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m recent --update --seconds 3 --hitcount 20 -j DROP

Они вводят ограничение до 19 соединений за 3 секунды.

Предотвращение сканирования портов

Чтобы предотвратить сканирование портов, рекомендуют2) использовать следующие правила:

iptables  -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP
iptables  -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

iptables  -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables  -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables  -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

iptables  -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables  -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables  -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables  -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

в том числе сканирование nmap:

iptables -A INPUT -p tcp -i eth0 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 10 -j DROP
iptables -A FORWARD -p tcp -i eth0 -m state --state NEW -m recent --set
iptables -A FORWARD -p tcp -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 10 -j DROP

Эти правила должны отбрасывать пакеты, если в течение 30 секунд пользователь подключается более 10 раз.

LOG

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

iptables -I FORWARD 2 --dst 192.168.24.0/16 -j LOG

Такая команда вставит в цепочку FORWARD вторым по порядку правило записывать все обращения к IP-адресам из диапазона 192.168.0.0192.168.255.255 в системный журнал.

systemd

При использовании systemd необходим файл /etc/iptables/iptables.rules. Соответствующая служба так и называется – iptables. Поэтому запустить её можно так же, как и любую другую службу:

systemctl start iptables

Догадки

Похоже, что правила -p tcp --syn и -p tcp -m state --state NEW значат одно и то же. Вроде бы, флаг SYN в TCP-пакете обозначает, что это первый пакет последовательности. А стало быть, состояние такого соединения должно быть NEW. Не очень тщательная проверка показала, что правила

iptables -I INPUT -p tcp -m state --state NEW -j ACCEPT

и

iptables -I INPUT -p tcp --syn -j ACCEPT

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

iptables.txt · В останнє змінено: 2020/05/20 21:23 by wombat