Назад | Перейти на главную страницу

Непонимание с настройкой iptables

Можно ли так создать логику iptables?

  1. принять ssh, http, https
  2. разорвать соединение, если такой ip уже подключен (только 1 соединение на ip / 1 секунду).
  3. поместить в черный список (думаю, ipset), если более 50 подключений на ip / 1 секунду
  4. очищать черный список каждый час.

Если вы разместите готовый конфиг, я буду счастлив. Теперь я пытаюсь установить connlimit 50conn / 1 секунду, но вижу тысячи подключений.

Я предполагаю, что ограничения (вы упомянули в пунктах 2. и 3.) применяются к разрешенным подключениям к ssh / http / https.

Кроме того, я предполагаю, что вы хотите применить ограничение к исходному IP-адресу независимо от порта назначения (т.е. если мой IP-адрес заблокирован из-за попыток SSH, он также будет заблокирован для трафика HTTP / HTTPS).

В таком случае вам понадобятся:

# flush all rules
iptables -F
# delete all user-defined chains
iptables -X
# set default policies
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# allow packets from already estabilished connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP

# limit connection to SSH to 1 per IP
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 1 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
# dtto for http
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 1 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
# dtto for https
iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 1 --connlimit-mask 32 -j REJECT --reject-with tcp-reset

# create new chain called "my-limited-chain"
iptables -N my-limited-chain
# set limits (allow 50 connections, erase failed attempts at a speed 50 attempts per hour), accept satisfactory traffic
iptables -A my-limited-chain -m limit --limit 50/hour --limit-burst 50 -j ACCEPT
# drop traffic over the limits
iptables -A my-limited-chain -j DROP

# redirect new SSH/HTTP/HTTPS connections to my-limited-chain
iptables -A INPUT -p tcp --dport 22,80,443 -m state --state NEW -j my-limited-chain

Платить внимание кому:

  • ограничение трафика HTTP и HTTPS только одним подключением может привести к снижению производительности, поскольку большинство клиентов HTTP / S используют несколько подключений для ускорения загрузки веб-страниц с несколькими элементами.
  • этот фрагмент полностью игнорирует IPv6. Если вы пытаетесь форкнуть это решение для IPv6, будьте осторожны с --connlimit-mask, поскольку в IPv6 некоторые машины могут иметь 1 IPv6-адрес (--connlimit-mask 128), а некоторые машины могут (и должны) иметь даже 2 ^ 64 IPv6-адресов (--connlimit-mask 64).
  • с этими точными правилами, запрет на ограничение "50 / час" запретит мне устанавливать новые связи, но не закроет мои уже установленные связи