Comments 21
А не было идеи ни у кого всем договориться и включить диапазоны все адреса хецнеров и других крупных хостингов сразу в access deny? Кому нужно смотреть сайт с ip хостеров, кроме как боту или анонимайзеру?
Мне. У меня VPN на Хецнере.
Благодаря таким, как вы, я не могу ходить на auto.ru, Доброчан и кучу всего еще.
Ну и сколько таких как вы людей? Сайт не много потеряет, тем более можно добавить статический маршрут мимо ВПН и без проблем смотреть нужные сайты, я думаю для человека который пользуется ВПН, это не проблема.
Мне, нужен. Держу VPN у хецнера и на некоторых администрируемых ресурсах (в том числе WP), вход в админку разрешен только с IP адреса сервера.
fail2ban вам в помощь, люди для ленивых уже даже плагин сделали (правда насколько рабочий не знаю, т.к. обычно ручками — новый jail и регулярка для фильтра делается для fail2ban за пару минут)…
В настройке обязательно включите галочку «За прокси» — иначе он будет для всех определять ip вашего сервера и автомат блокировать всех.

Эта галочка случаем не использует заголовок X-Real-IP (X-Forwarded-For, и другие) вместо REMOTE_ADDR? Если так, то получился вредный совет, вместо полезного, и правильным выходом из ситуации будет корректная настройка веб сервера.
Проверил в коде плагина, да она использует
define('LIMIT_LOGIN_PROXY_ADDR', 'HTTP_X_FORWARDED_FOR');

Однако у меня без ее включения не работает корректно определение ip адреса. Быть может вы поделитесь почему это вредно и как поправить, буду очень благодарен!

Из описания плагина
What is this option about site connection and reverse proxy?
A reverse proxy is a server in between the site and the Internet (perhaps handling caching or load-balancing). This makes getting the correct client IP to block slightly more complicated.The option default to NOT being behind a proxy — which should be by far the common case.
Насколько я понял, у вас используется связка nginx+apache, в таком случае до апача коннекты от всех клиентов доходят от адреса сервера (или 127.0.0.1). Правильно в таком случае со стороны nginx выставлять соответствующие заголовки:
proxy_set_header X_REAL_IP $remote_addr;
proxy_set_header X_FORWARDED_FOR $proxy_add_x_forwarded_for;

А к апачу добавить модуль mod_rpaf2 и сказать ему, что реальный адрес пользователя находится в заголовке X_REAL_IP
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-REAL-IP

В RPAFproxy_ips указывается IP адрес сервера с nginx, если он находится на другим IP. Плюсом, после настройки модуля, в логах apache будут реальные адреса пользователей, а не адрес nginx или localhost.

В противном случае, если включить опцию доверия заголовку HTTP_X_FORWARDED_FOR, а веб сервер будет не за прокси, то атакующий сможет с использованием данного заголовка обмануть плагин, отправляя с каждым запросом разномные IP адреса.
Включить Limit Login Attempts и отключить XML RPC будет достаточно? Хочется какого-то быстрого универсального решения, на будущее.
да, достаточно. Я планирую на днях написать плагинчик, который делает сразу 3 действия:
1. limit logins
2. отключает XML RPC с вариантами, например, чтобы можно было или полностью опцию отключить или только pingback
3. переименование wp-login.php в выбранное имя

Там ничего сложного, но потом проще будет обновлять и дополнять в будущем кучи сайтов свои. Если напишу кину тут ссылку на репозиторий.
Плагин iThemes security (бывший Better WP security) всё это умеет (и ещё много всего). Разве что потяжелее будет.
спасибо, он действительно тяжеловесный и большой, но оттуда можно взять несколько идей и текстов
location ~* /(wp-login\.php|administrator|admin\.php) {
	set $humantest 0;
	if ($http_cookie !~* "humans=checktest") {
		set $humantest 1;
	}
	if ($args ~* (callback|logout|lostpassword)) {
		set $humantest 0;
	}
	if ($humantest = 1) {
		add_header Content-Type text/html;
		return 200 "<html><body><script>document.cookie='humans=checktest;path=/';location.reload();</script></body></html>";
	}
	error_page 404 = @fallback;
}


Код не мой, но позволяет без всяких танцев с плагинами избавится от всякой живности, родился он примерно год назад и зомби еще не научились его парсить…
Иногда у nginx «default_type» выставлен в что то отличное от «text/html», и тогда мы можем получить в ответ что-то типа такого:
HTTP/1.1 200 OK
...
Content-Type: application/octet-stream
Content-Length: 103
Connection: keep-alive
Keep-Alive: timeout=5
Content-Type: text/html
...

Некоторые браузеры не понимаю что это и предлагают «сохранить файл». Что бы такого не было, можно сделать так:
        location ~* /(wp-login\.php|administrator|admin\.php) {
                default_type text/html;
                set $humantest 0;
                if ($http_cookie !~* "humans=checktest") {
                        set $humantest 1;
                }
                if ($args ~* (callback|logout|lostpassword)) {
                        set $humantest 0;
                }
                if ($humantest = 1) {
                        return 200 "<html><body><script>document.cookie='humans=checktest;path=/';location.reload();</script></body></html>";
                }
                error_page 404 = @fallback;
        }

Если ставить код после (кода ниже) то не работает, а если перед, то PHP не исполняется. Куда его ставить?

   location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_read_timeout 120;
        include fastcgi_params;
    }
А я когда-то прописал в .htaccess:

#Защита от подбора пароля	
<Files wp-login.php>
Order Deny,Allow
Deny from all
allow from домашний_ip
allow from рабочий_ip
</Files>

# protect xmlrpc
<Files xmlrpc.php>
	Order Deny,Allow
	Deny from all
</Files>	


Если ip выдается динамически можно указать сеть провайдера.
Вызов удаленных процедур, за который отвечает xmlrpc.php, мне не нужен
Only those users with full accounts are able to leave comments. Log in, please.