Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

lighttpd-ipv6-only [2011-07-13 06:14 UTC]
rm
lighttpd-ipv6-only [2011-07-29 08:37 UTC] (текущий)
rm
Строка 2: Строка 2:
// Впервые опубликовано 2011-07-13 // // Впервые опубликовано 2011-07-13 //
-Иногда может возникнуть необходимость предоставить доступ к администрируемому вами веб-ресурсу только по протоколу IPv6. К примеру, ваш провайдер предоставляет бесплатный IPv6-доступ на скорости 100 мегабит, при этом IPv4 тоже есть, но он платный и в разы более медленный. В этой ситуации у вас есть возможность выкладывать тяжёлый контент (к примеру организовать файловое зеркало популярного opensource-проекта), но давать доступ к нему вы хотели бы только IPv6-клиентам. Как это лучше всего сделать (при использовании [[http://www.lighttpd.net/|lighttpd]])?+Иногда может возникнуть необходимость предоставить доступ к администрируемому вами веб-ресурсу только по протоколу IPv6. К примеру, ваш провайдер предоставляет бесплатный IPv6-доступ на скорости 100 мегабит, при этом IPv4 тоже есть, но он платный и в разы более медленный. В этой ситуации у вас есть возможность выкладывать тяжёлый контент (скажем, организовать файловое зеркало популярного opensource-проекта), но давать доступ к нему вы хотели бы только IPv6-клиентам. Как это лучше всего сделать (при использовании на веб-сервере [[http://www.lighttpd.net/|lighttpd]])?
===== Отдельный домен или поддомен ===== ===== Отдельный домен или поддомен =====
-Простейшее решение - создать альтернативный домен (или поддомен, к примеру ''ipv6.example.com''), на котором прописать только AAAA-записи. Сами же материалы, которые должны быть доступны только по IPv6, разместить в каталоге virtual host, соответствующем этому домену.+Простейшее решение -- создать альтернативный домен (или поддомен, к примеру ''ipv6.example.com''), на котором прописать только AAAA-запись. Сами же материалы, которые должны быть доступны только по IPv6, разместить в каталоге virtual host, соответствующем этому домену.
У этого способа есть несколько недостатков: У этого способа есть несколько недостатков:
-  * Если ваш веб-сервер слушает также и на IPv4, клиенты могут в своих файлах ''/etc/hosts'' прописать в соответствие этому домену ваш IPv4-адрес, и таким образом получить доступ к нужному им виртуальному хосту, даже подключаясь к серверу по IPv4; +  * Если ваш веб-сервер слушает также и на IPv4, клиенты смогут в своих файлах ''/etc/hosts'' прописать в соответствие этому домену ваш IPv4-адрес, и таким образом получить доступ к нужному им виртуальному хосту, даже подключаясь к серверу по IPv4; 
-  * Необходимость размещать IPv6-ресурсы на отдельном домене, что не всегда удобно;+  * Необходимость размещать IPv6-ресурсы на отдельном домене, а это не всегда удобно;
  * Нет возможности выдать пытающимся подключиться к такому домену, но не имеющим IPv6-доступа пользователям, понятное сообщение об ошибке (к примеру: "данный сайт доступен только по IPv6, установите/настройте его по этой инструкции [ссылка]"). Браузер просто выдаст им своё сообщение "Адрес не найден".   * Нет возможности выдать пытающимся подключиться к такому домену, но не имеющим IPv6-доступа пользователям, понятное сообщение об ошибке (к примеру: "данный сайт доступен только по IPv6, установите/настройте его по этой инструкции [ссылка]"). Браузер просто выдаст им своё сообщение "Адрес не найден".
===== Проверка клиентского адреса ===== ===== Проверка клиентского адреса =====
-Гораздо более гибкий способ заключается в проверке адреса, с которого подключается клиент. В простейшем варианте, отличать IPv6 от IPv4 очень просто по наличию в последнем точек. :) Можно было бы наоборот, смотреть на наличие двоеточия в IPv6, но такой вариант менее надёжен, т.к. в зависимости от настройки, ваша ОС и сервер могут работать с IPv6-mapped IPv4-адресами, и все IPv4 будут видны вам во всех логах и проверках как ''::ffff:a.b.c.d'' (соотв-но проверка на двоеточия будет проходить всегда).+Гораздо более гибкий способ заключается в проверке адреса, с которого подключился клиент. В простейшем варианте, отличать IPv6 от IPv4 можно по наличию в последнем точек. :) Можно и наоборот, смотреть на наличие двоеточия в IPv6, но такой вариант менее надёжен, т.к. в зависимости от настройки, ваша ОС и сервер могут работать с т.н. IPv6-mapped IPv4-адресами, и все клиентские IPv4 будут видны вам в логах и проверках как ''::ffff:a.b.c.d'' (соотв-но двоеточие в адресе будет присутствовать всегда).
-Также есть возможность переопределить выдаваемую страницу с сообщением об ошибке на произвольный собственный HTML-файл.+Также, при использовании этого способа lighttpd даёт возможность [[http://redmine.lighttpd.net/wiki/lighttpd/Server.errorfile-prefixDetails|переопределить]] отображаемую клиенту страницу с сообщением об ошибке на произвольный HTML-файл.
-По поводу выдаваемого кода HTTP, мне видится два варианта:+По поводу выдаваемого кода HTTP для подключающихся по IPv4 клиентов, мне видится два варианта:
  * ''403 Forbidden'', с собственным текстом сообщения в HTML-странице ("403 No IPv4 Allowed" :).   * ''403 Forbidden'', с собственным текстом сообщения в HTML-странице ("403 No IPv4 Allowed" :).
-  * ''303 See Other'', среди существующих кодов ответов HTTP, этот малоизвестный код редиректа показался мне более всего подходящим для перенаправления части посетителей на страницу с информацией о том, почему им не доступен ресурс, который они пытались открыть. К сожалению, возможность переопределять коды редиректов появилась только начиная с ветки lighttpd 1.5, я же пока пользуюсь 1.4, поэтому данный вариант не тестировал.+  * ''303 See Other'', среди существующих кодов ответа HTTP, этот малоизвестный код редиректа показался мне более всего подходящим для перенаправления части посетителей на страницу с информацией о том, почему им не доступен ресурс, который они пытались открыть. К сожалению, возможность переопределять код редиректа появилась только начиная с ветки lighttpd 1.5, я же пока пользуюсь 1.4, поэтому данный вариант не тестировал.
-==== Пример ====+==== Запрет IPv4-доступа ====
Запрещаем IPv4-доступ к каталогу ''goodies/'' на сайте ''example.com'': Запрещаем IPv4-доступ к каталогу ''goodies/'' на сайте ''example.com'':
-<file /var/www/error-ipv6only-403.html>+<file html /var/www/error-ipv6only-403.html>
<html><body> <html><body>
<h1>403 No IPv4 Allowed</h1> <h1>403 No IPv4 Allowed</h1>
Строка 32: Строка 32:
</file> </file>
-<file /etc/lighttpd/lighttpd.conf> +<file perl /etc/lighttpd/lighttpd.conf> 
-$HTTP["host"] =~ "^(example\.com)" {+$HTTP["host"] == "example.com" {
  $HTTP["url"] =~ "^/goodies.*" {   $HTTP["url"] =~ "^/goodies.*" {
    $HTTP["remoteip"] =~ "\." {     $HTTP["remoteip"] =~ "\." {
Строка 40: Строка 40:
    }     }
  }   }
 +}
</file> </file>
Сохраняем конфиг, перезапускаем веб-сервер, и всё готово. :) Сохраняем конфиг, перезапускаем веб-сервер, и всё готово. :)
Строка 48: Строка 49:
HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden
<...> <...>
-<html><body> 
-<h1>403 No IPv4 Allowed</h1> 
-<p>Sorry, this is an IPv6-only resource. Please get yourself IPv6 if you want to access it.</p> 
-</body></html> 
$ curl -I6 http://example.com/goodies/ $ curl -I6 http://example.com/goodies/
Строка 57: Строка 54:
<...> <...>
</code> </code>
 +
 +==== Ограничение скорости ====
 +Помимо полного запрета доступа с IPv4, lighttpd также предоставляет нам возможность вместо этого [[http://redmine.lighttpd.net/wiki/lighttpd/Docs:TrafficShaping|ограничить его скорость]] любой величиной, начиная от 32 КБ/сек. К примеру, вместо полного запрета выставляем суммарный лимит скорости всех IPv4-соединений, загружающих файлы из каталога ''goodies/'', в 256 КБ/сек:
 +
 +<file perl /etc/lighttpd/lighttpd.conf>
 +$HTTP["host"] == "example.com" {
 +  $HTTP["url"] =~ "^/goodies.*" {
 +    $HTTP["remoteip"] =~ "\." {
 +      server.kbytes-per-second = 256
 +    }
 +  }
 +}
 +</file>

lighttpd-ipv6-only.1310537664.txt.gz · Последние изменения: 2011-07-13 06:14 UTC От rm
Personal Tools