Строка hosts.deny слишком длинная или слишком большой файл?
У меня около 50 тыс. Ip-адресов, запрещенных в файле hosts.deny, сгенерированных скриптом с максимум 7 адресами в строке, и получаю эту ошибку:
warning: /etc/hosts.deny, line 4429: missing newline or line too long
Линия 4429 находится здесь посередине:
ALL: 96.47.225.95, 96.47.225.96, 96.47.225.97, 96.47.225.98, 96.47.225.99, 96.56.113.123, 96.8.112.149
ALL: 98.126.161.178, 98.15.206.118, 98.159.4.16, 98.197.212.67, 98.83.135.94, 98.94.6.213, 98.94.6.78
ALL: 99.167.89.146, 99.177.96.73, 99.235.84.25, 99.244.9.103, 99.49.94.70
в чем дело?
Обновить:
Предупреждение появляется только тогда, когда в момент установления соединения файл hosts.deny записывается одновременно. (ввод / вывод, блокировка, fopen для записи, fopen для проблемы чтения).
1 ответ
На мой взгляд, не имеет смысла иметь такой большой файл `/etc/hosts.deny'по нескольким причинам:
- активность ботнета может исходить от возможных допустимых IP-адресов источников, и обычно бесполезно блокировать IP-адрес, который может быть просто временным общедоступным IP-адресом взломанного домашнего компьютера с динамическим адресом.
- Есть лучшие инструменты для этой работы, такие как
denyhosts
,fail2ban
,psad
и т.д... это обеспечит некоторую защиту от злодеев, не попадая в ловушку, упомянутую в предыдущем абзаце.
Теперь, если вам действительно нужно сохранить такой файл, вы можете попробовать использовать файл, как описано в hosts_access(5)
Manpage, под PATTERNS
раздел:
СХЕМЫ
The access control language implements the following patterns: · A string that begins with a `/´ character is treated as a file name. A host name or address is matched if it matches any host name or address pattern listed in the named file. The file format is zero or more lines with zero or more host name or address patterns separated by whitespace. A file name pattern can be used anywhere a host name or address pattern can be used.
Я попробовал и сгенерировал список:
# echo 123.{1..255}.{1..255}.{1..254} > /etc/list
Добавил его в /etc/hosts.deny
файл:
# echo 'ALL: /etc/list' >> /etc/hosts.deny
Перепробовал некоторые соединения и проверил мои логи. Я не смог воспроизвести упомянутое вами предупреждение.