Почти, но не совсем. Созданные вами правила сначала отвергают соединения выше 50 из x.1
и x.2
, а затем отвергают любые соединения выше 5 из любого места, включая x.1
и x.2
. Вам нужно иметь правило ACCEPT
для этих двух источников перед общим ограничителем.
Возможно, проще всего будет инвертировать соответствие на connlimit
:
-A INPUT -p tcp -s x.x.x.1 --syn -m connlimit --connlimit-upto 50 -j ACCEPT
-A INPUT -p tcp -s x.x.x.2 --syn -m connlimit --connlimit-upto 50 -j ACCEPT
-A INPUT -p tcp --syn -m connlimit --connlimit-upto 5 -j ACCEPT
-A INPUT -p tcp --syn -j REJECT
Возможно, вы захотите поместить эти правила в отдельную цепочку, чтобы не повторять общие части (-p tcp --syn
), и с отдельной цепочкой вы также можете заменить ACCEPT
на RETURN
, если вы хотите выполнить другую фильтрацию после этих правил. Тогда принимающее правило должно появиться в другом месте.
По умолчанию connlimit
работает по адресу источника, так что это должно быть то, что вы хотите. Хотя обратите внимание, что iptables
не имеет понятия "вход в систему", так что если вы хотите ограничить вход на уровне приложения, вам придется делать это там.
Чтобы предотвратить блокировку, вы можете убедиться, что у вас есть отдельное правило для разрешения административного доступа с вашей машины (возможно, SSH, по крайней мере, уже установленные соединения). Другой возможностью может быть использование cron
или at
для сброса правил брандмауэра в известную конфигурацию через некоторое время, так что даже если вы получите блокировку, это не продлится долго. Вам просто нужно будет не забыть удалить эту защиту, когда вы закончите.