Це стара версія документу!
# 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
# 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
Чтобы ограничить максимально допустимое число соединений с некоторого 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-адрес можно и вовсе не указывать.
Взято отсюда: 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 секунды.
Чтобы записывать определённые события в системный журнал, можно использовать такие команды:
iptables -I FORWARD 2 --dst 192.168.24.0/16 -j LOG
Такая команда вставит в цепочку FORWARD
вторым по порядку правило записывать все обращения к IP-адресам из диапазона 192.168.0.0
– 192.168.255.255
в системный журнал.
Похоже, что правила -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
срабатывают одинаково. В то же время, когда они оба присутствуют в одной цепочке, срабатывает только одно из них – то, что стоит первым в цепочке.