Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Both sides previous revision Попередня ревізія Наступна ревізія | Попередня ревізія | ||
iptables [2014/02/05 00:20] wombat Создан раздел "Догадки" |
iptables [2020/05/20 21:23] (поточний) wombat Перенаправление порта |
||
---|---|---|---|
Рядок 1: | Рядок 1: | ||
+ | ====== 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 | ||
+ | |||
+ | Ещё часто уточняют((https://askubuntu.com/a/579540/298881 , https://askubuntu.com/a/595955/298881 , https://wiki.debian.org/Firewalls-local-port-redirection)), что это правило не будет работать для локальных подключений. Поэтому для них надо добавить ещё одно отдельно: | ||
+ | |||
+ | 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-атаки ====== | ||
+ | |||
+ | Взято отсюда: [[http://otland.net/threads/limit-number-of-connections-dos-prevention.103408/ | 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 секунды. | ||
+ | |||
+ | |||
+ | ====== Предотвращение сканирования портов ====== | ||
+ | |||
+ | Чтобы предотвратить сканирование портов, рекомендуют((https://www.ossramblings.com/using_iptables_rate_limiting_to_prevent_portscans)) использовать следующие правила: | ||
+ | |||
+ | 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.0'' -- ''192.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 | ||
+ | |||
+ | срабатывают одинаково. В то же время, когда они оба присутствуют в одной цепочке, срабатывает только одно из них -- то, что стоит первым в цепочке. | ||
+ | |||
+ | |