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

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


iptables

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Наступна ревізія
Попередня ревізія
iptables [2014/02/04 19:42]
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
 +
 +срабатывают одинаково. В то же время, когда они оба присутствуют в одной цепочке,​ срабатывает только одно из них -- то, что стоит первым в цепочке.
 +
 +  ​