Вы находитесь здесь: version6.ru » IPv6-only ресурсы в lighttpd
Различия
Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
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