Я использую Webmin для администрирования моего домашнего сервера.
Вместо того, чтобы запускать его на порту по умолчанию (https: // myhost: 10000), Я хотел разместить его в подпапке (https: // myhost / webmin /). Это отлично работает при использовании Apache (файлы конфигурации Apache прилагаются ниже). Однако обычно я использую lighttpd, и я хотел сделать то же самое (запустить Webmin в подпапке) с lighttpd. Однако он не работает должным образом. Всякий раз, когда я иду в https: // myhost / webmin /, Я получаю сообщение:
Error - Bad Request
This web server is running in SSL mode. Try the URL https://localhost:10000/ instead.
Так что я немного глубже изучил проблему. Вместо запуска Webmin я использовал netcat для прослушивания порта 10000. При использовании lighttpd я получаю:
myhost@myhost:~$ nc -l 10000
GET /webmin/ HTTP/1.0
Host: myhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Cookie: testing=1
Cache-Control: max-age=0
X-Forwarded-For: 192.168.159.1
X-Host: myhost
X-Forwarded-Proto: https
Тогда как при использовании Apache я получаю:
myhost@myhost:~$ nc -l 10000
ÌÈOPù¶°$óI¢ÚH,-ånú? ÆÀ2´ûZÀÀ
98ÀÀ5
À ÀÀ
ÀÀ 32EDÀÀ/AÀÀÀ
ÀÿD
42
#PuTTYPuTTYPuTTY^C
Как видите, вероятно, это рукопожатие SSL. Прерывание netcat на этом этапе также показывает сообщение об ошибке Apache «Причина: ошибка во время установления связи SSL с удаленным сервером», поэтому я почти уверен, что здесь действительно происходит установление связи SSL.
Это означает, что Webmin прав, полученный запрос - это не HTTPS, а HTTP-запрос.
Возникает вопрос, почему Apache правильно использует HTTPS для проксирования, тогда как lighttpd использует HTTP с некоторыми X-Forwarded-Proto для проксирования? Как я могу добиться аналогичного SSL-проксирования с помощью lighttpd?
Для записи, все изменения в файлах конфигурации, которые я сделал. Я добавил следующие строки в / etc / webmin / config:
webprefix=/webmin
webprefixnoredir=1
referer=myhost
Я добавил следующее для lighttpd в lighttpd.conf (что вызывает ошибку выше):
$HTTP["url"] =~ "^/webmin" {
proxy.server = ( "/webmin/" =>
( (
"strip-request-uri" => "/webmin",
"host" => "127.0.0.1",
"port" => 10000,
"fix-redirects" => 1
) ) )
}
И я использую следующий файл конфигурации для Apache (который работает правильно):
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
ProxyPass /webmin/ https://myhost:10000/
ProxyPassReverse /webmin/ https://myhost:10000/
SSLProxyEngine On
<Proxy *>
allow from all
SSLRequireSSL
</Proxy>
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>
</IfModule>
Неважно, теперь он работает.
Ой, подождите, вы думали, это все? Нет, друзья Server Fault и пользователи поисковых систем, вот руководство по настройке lighttpd с Webmin, работающим в подпапке. Наслаждайтесь!
Цель этого руководства - настроить установку lighttpd вместе с Webmin, чтобы можно было получить доступ к интерфейсу Webmin по адресу *http: // myhost / webmin.
На момент написания этого руководства текущая версия Webmin была 1.580, а используемая версия lighttpd - 1.4.28. Я предполагаю, что вы уже установили оба. Имя «myhost» всегда обозначает имя хоста машины, на которой работает lighttpd.
Как упоминалось в официальном руководстве для Apache, вам необходимо добавить следующие строки в / etc / webmin / config:
webprefix=/webmin
webprefixnoredir=1
referer=myhost
Да, вы не ослышались, и, как Шейн Мэдден упомянул в комментарии выше, это не небезопасно, поскольку общение выглядит так:
client <----SSL----> myhost <--Loopback--> myhost:10000
Webmin будет связываться с экземпляром lighttpd, запущенным на myhost, через устройство обратной связи, которое находится внутри машины, что обычно можно контролировать только с привилегиями суперпользователя. Связь между клиентом и lighttpd по-прежнему будет с использованием SSL.
Итак, а как отключить SSL в Webmin? Просто отредактируйте следующую строку в /etc/webmin/miniserv.conf:
ssl=0
Добавьте следующие строки в ваш /etc/lighttpd/lighttpd.conf:
$HTTP["url"] =~ "^/webmin" {
magnet.attract-physical-path-to = ( "/var/www/webmin/conf/webmin-rewrite.lua" )
proxy.server = ( "" =>
( (
"host" => "127.0.0.1",
"port" => 10000,
) ) )
}
Как видите, мы проверяем, начинается ли URL с «/ webmin», и перенаправление на экземпляр Webmin прослушивает 127.0.0.1:10000. Однако Webmin не ожидает наличия дополнительного пути «... / webmin» в URL-адресе запроса, поэтому мы должны удалить его из URL-адреса. Однако, поскольку мы находимся в условном $ HTTP ["url"] - условном, мы не можем использовать какие-либо методы перезаписи URL, представленные mod_rewrite. (В противном случае мы бы просто сказали "strip-request-uri" => "/ webmin", но это не сработает. Это известная проблема, которая не решает проблему в lighttpd 1.4. См. Также документацию по mod_rewrite.) Однако мы можем используйте mod_magnet, чтобы переписать URL-адрес в сценарии LUA.
Создайте /var/www/webmin/conf/webmin-rewrite.lua со следующим содержимым:
subfolder = "/webmin"
n = string.len(subfolder)
if string.sub(lighty.env["request.uri"], 1, n) == subfolder then
lighty.env["request.uri"] = string.sub(lighty.env["request.uri"], n+1)
end
Это удаляет префикс «/ webmin» из URL-адресов запроса.
Это уже почти работает, однако в коде перенаправления Webmin все еще есть ошибка, о которой также упоминалось Вот. В /usr/share/webmin/miniserv.pl измените строку
&write_data("Location: $prot://$host$portstr$in{'page'}\r\n");
к
&write_data("Location: $prot://$host$config{'subfolder_prefix'}$in{'page'}\r\n");
И в /etc/webmin/miniserv.conf добавьте строку:
subfolder_prefix=/webmin
Это исправляет перенаправление входа в систему Webmin, и все готово!
Начиная с lighttpd версии 1.5, вы, вероятно, можете заменить скрипт LUA на mod_proxy_core, поскольку он способен переписывать URL-адреса запросов. Однако я этого не пробовал.
Кроме того, поскольку нет необходимости получать доступ к порту 10000 извне, я предлагаю заблокировать его:
iptables -A INPUT -i eth0 -p tcp --dport 10000 -j REJECT --reject-with tcp-reset
Однако эта команда может отличаться в зависимости от вашей локальной конфигурации.