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

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


iptables

Розбіжності

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

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

Both sides previous revision Попередня ревізія
Наступна ревізія
Попередня ревізія
iptables [2016/11/09 21:06]
wombat Заголовки на уровень выше + systemd
iptables [2020/05/20 18: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
 +
 +срабатывают одинаково. В то же время, когда они оба присутствуют в одной цепочке,​ срабатывает только одно из них -- то, что стоит первым в цепочке.
 +
 +  ​
iptables.txt · В останнє змінено: 2020/05/20 18:23 by wombat