lets-proxy2
lets-proxy2 copied to clipboard
Missing examples for starting the tool
as a user of your "cool" tool how can I understand how config file should look like?
Yeah I am having issues as well.
Hello :)
Minimal config is empty - you can start the program without config. In that case it listen 433 port and proxy all requests to 80 port.
Full config you can see here: latest version permanent link for stat now.
It is default config. If you want change some options you can write to config override options only, no need write full config.
Do I answer your questions?
Подскажите, пожалуйста, где именно нужно задать имя домена, на который получаем сертификат? И где задать периодичность частоты получения/обновления сертификата? Эти моменты у Вас как-то упущены; в конфиге есть белый список, чёрный список, поддомены, но нет явного задания домена или списка доменов. Я не нашёл, по крайней мере.
Ещё было бы интересно узнать подробно: как запустить lets-proxy2 в докер-контейнере? Конкретно: где именно lets-proxy хранит файлы сертификатов? (т.е. какие пути маппить наружу, чтобы сертификат сохранился после перезапуска контейнера?)
P.S. Опечатка в README.md:
"Самостоятельная проверка возможности выпуска сертификата перед его запросов (для исключения DoS-атак путем запросов с неправильными доменами)"
=>
"Самостоятельная проверка возможности выпуска сертификата перед его запросоМ (для исключения DoS-атак путем запросов с неправильными доменами)"
English below.
Здравствуйте.
Подскажите, пожалуйста, где именно нужно задать имя домена, на который получаем сертификат?
Имя домена для получения сертификата нигде не нужно задавать - он берётся сам из служебных полей SNI-запроса. В этот же момент делается запрос на получение сертификата.
Т.е. сертификат на каждый домен, с которым идёт обращение к серверу получается в момент первого обращения.
И где задать периодичность частоты получения/обновления сертификата?
Время ротации сертификата сейчас не настраивается. Сертификат начинает обновляться за 30 суток до его истечения если есть запросы к домену. Если запросов нет - то сертификат не обновляется и если закончится - то будет выпущен снова при первом запросе.
как запустить lets-proxy2 в докер-контейнере?
Достаточно просто запустить бинарник, а рядом в его рабочей папку положить config.toml с указанием IP-адреса сервера, на который нужно проксировать запросы:
cat config.toml
[Proxy]
DefaultTarget="1.2.3.4:80"
Если web-сервер крутится внутри того же контейнера и слушает 80-й порт, то конфиг не нужен.
По умолчанию прокси пересылает запросы на тот же IP, на котором запрос был принят на 80й порт.
Идея в том, что если уже есть настроеный сервис на 80-м порту, то рядом просто запускается бинарник lets-proxy без конфигов и просто работает.
Конкретно: где именно lets-proxy хранит файлы сертификатов?
Lets-proxy по-умолчанию хранит все данные в папке "storage" folder by default. внутри рабочей папки, можно смонтировать её.
Опечатка в README.md
Опечатку поправил, спасибо.
Questions and answers in English
How set domain name for receive certificate?
No need explicit setup domain main, it takes from request header.
How run lets-proxy2 in docker-container?
You have to run the binary with config.toml with destination for request proxy.
cat config.toml
[Proxy]
DefaultTarget="1.2.3.4:80"
If target we-server/service work in same container on port 80 - no need config. Main idea: if you have web standard web server on standard http port - you can run the lets-proxy binary without config and all will work fine.
Where setup refresh interval for certificates?
You can't do it now. Lets proxy start renew process for 30 days before certificate expire (if domain has traffic). If domain hasn't traffic - certificate will not be renew and will issue while first request if need.
Where lets-proxy store certificats
Lets-proxy store all data in "storage" folder by default.
typo in README.md
the typo fixed, thanks.
Спасибо Вам за ответы и за программу.
Хорошо бы добавить в документацию эти моменты насчёт взятия доменного имени из служебных полей SNI-запроса и времени ротации сертификата. Я не очень опытный админ, поэтому стал искать эти вещи в конфиге и, не найдя, был обескуражен.
И, если можно, ещё вопрос. Какой командой внутри докер-контейнера можно запускать lets-proxy2 в фоне? Обычно программы типа веб-серверов или сервер TurboVNC предоставляют такой функционал - запуск в фоне.
Мой докер-образ билдится на базе FROM ubuntu
./lets-proxy --service-name=lets-proxy --service-action=install
- насколько я понимаю, не работает в lets-proxy2.
root@host:~# /root/lets-proxy --service-name=lets-proxy --service-action=install flag provided but not defined: -service-name Usage of /root/lets-proxy: -acme-server string Override acme server -config string Path to config file. Internally expand glob syntax. (default "config.tom[l]") -debug Enable debug logging -print-default-config Write default config to stdout and exit. -test-acme-server Use test acme server, instead address from config -version print version and exit
Подскажите, пожалуйста, что происходит здесь? (На этом же хосте успешно получаю сертификат на домен при помощи CertBot). Порты 443 и 80 проброшены наружу (хотя 80 в итоге хотелось бы закрыть, если это вообще получится).
2024-04-01T20:17:17.463256004Z {"level":"info","ts":1712002637.4630606,"caller":"cmd/config.go:76","msg":"Read config","config_file":"config.tom[l]"} 2024-04-01T20:17:17.464700886Z {"level":"info","ts":1712002637.4645476,"caller":"cmd/config.go:182","msg":"Parse config file","config_file":"default"} 2024-04-01T20:17:17.465127987Z {"level":"info","ts":1712002637.4650352,"caller":"cmd/config.go:82","msg":"Parse configs finished","config_file":"config.tom[l]","readed_files":0,"max_read_files":10000} 2024-04-01T20:17:17.467482883Z 2024-04-01T20:17:17.465Z info cmd/log.go:71 Initialize log on level {"level": "info"} 2024-04-01T20:17:17.467695461Z 2024-04-01T20:17:17.467Z info cmd/main.go:110 StartAutoRenew program version {"version": "Version: 'v0.29.3+build-8191065039, Build time 2024-03-07 15:57:08+00:00, commit 3524e48dc4b264fdb383f058f20720e7c85bb7bc, 1.20', Os: 'linux', Arch: 'amd64'"} 2024-04-01T20:17:17.468007771Z 2024-04-01T20:17:17.467Z info cmd/main.go:190 Profiler disabled 2024-04-01T20:17:17.468508858Z 2024-04-01T20:17:17.468Z info cmd/main.go:119 Create storage dir {"dir": "storage"} 2024-04-01T20:17:17.468805310Z 2024-04-01T20:17:17.468Z info cmd/main.go:125 Acme directory {"url": "https://acme-v02.api.letsencrypt.org/directory"} 2024-04-01T20:17:17.729143719Z 2024-04-01T20:17:17.728Z info acme_client_manager/client_manager.go:365 Generate account key 2024-04-01T20:17:18.567623610Z 2024-04-01T20:17:18.567Z info acme_client_manager/client_manager.go:370 Register acme account 2024-04-01T20:17:18.567919863Z 2024-04-01T20:17:18.567Z info acme_client_manager/client_manager.go:327 Create acme account 2024-04-01T20:17:18.568597021Z 2024-04-01T20:17:18.568Z info acme_client_manager/client_manager.go:350 Marshal account state to json 2024-04-01T20:17:18.568999104Z 2024-04-01T20:17:18.568Z info cmd/main.go:128 Get acme client 2024-04-01T20:17:18.569385260Z 2024-04-01T20:17:18.569Z info domain_checker/ip_list_sources.go:29 Create ip checker {"IPSelfDetectMethod": "auto"} 2024-04-01T20:17:18.583234506Z 2024-04-01T20:17:18.582Z info domain_checker/ip_list_sources.go:66 Check aws metadata available {"available": false} 2024-04-01T20:17:18.585582826Z 2024-04-01T20:17:18.585Z error domain_checker/ip_list_sources.go:168 Request to external ip detector {"detector": "http://ifconfig.io/ip", "error": "Get "http://ifconfig.io/ip": dial tcp6 [2606:4700:e2::ac40:8f07]:80: connect: cannot assign requested address"} 2024-04-01T20:17:18.585607812Z github.com/rekby/lets-proxy2/internal/domain_checker.getIPByExternalRequest.func1 2024-04-01T20:17:18.585632580Z /home/runner/work/lets-proxy2/lets-proxy2/test-build/src/github.com/rekby/lets-proxy2/internal/domain_checker/ip_list_sources.go:168 2024-04-01T20:17:18.585640694Z github.com/rekby/lets-proxy2/internal/domain_checker.getIPByExternalRequest.func3 2024-04-01T20:17:18.585646660Z /home/runner/work/lets-proxy2/lets-proxy2/test-build/src/github.com/rekby/lets-proxy2/internal/domain_checker/ip_list_sources.go:201 2024-04-01T20:17:18.746003151Z 2024-04-01T20:17:18.745Z error domain_checker/ip_list_sources.go:168 Request to external ip detector {"detector": "http://ifconfig.io/ip", "error": "Get "http://ifconfig.io/ip": dial tcp6 [2606:4700:e2::ac40:8f07]:80: connect: cannot assign requested address"} 2024-04-01T20:17:18.746042180Z github.com/rekby/lets-proxy2/internal/domain_checker.getIPByExternalRequest.func1 2024-04-01T20:17:18.746050025Z /home/runner/work/lets-proxy2/lets-proxy2/test-build/src/github.com/rekby/lets-proxy2/internal/domain_checker/ip_list_sources.go:168 2024-04-01T20:17:18.746057626Z github.com/rekby/lets-proxy2/internal/domain_checker.getIPByExternalRequest.func3 2024-04-01T20:17:18.746064178Z /home/runner/work/lets-proxy2/lets-proxy2/test-build/src/github.com/rekby/lets-proxy2/internal/domain_checker/ip_list_sources.go:201 2024-04-01T20:17:18.906066251Z 2024-04-01T20:17:18.905Z info cmd/main.go:148 start metrics 2024-04-01T20:17:18.906549684Z 2024-04-01T20:17:18.906Z info tlslistener/config.go:48 Min tls version {"tls_version": "1.2"} 2024-04-01T20:17:18.906678228Z 2024-04-01T20:17:18.906Z info tlslistener/tlslistenershandler.go:81 StartAutoRenew handleListeners 2024-04-01T20:17:18.906915521Z 2024-04-01T20:17:18.906Z info proxy/config.go:106 Create same ip director {"port": 80} 2024-04-01T20:17:18.907164836Z 2024-04-01T20:17:18.906Z info proxy/config.go:134 Create headers director {"headers": {"X-Forwarded-For":"{{SOURCE_IP}}","X-Forwarded-Proto":"{{HTTP_PROTO}}"}} 2024-04-01T20:17:18.907365867Z 2024-04-01T20:17:18.907Z info cmd/main.go:168 Apply proxy config 2024-04-01T20:17:18.907580636Z 2024-04-01T20:17:18.907Z info proxy/http-proxy.go:65 Set transport to reverse proxy 2024-04-01T20:17:18.907704848Z 2024-04-01T20:17:18.907Z info proxy/http-proxy.go:72 Access log {"enabled": true} 2024-04-01T20:17:18.907842632Z 2024-04-01T20:17:18.907Z info proxy/http-proxy.go:81 Http builtin reverse proxy start 2024-04-01T20:17:26.614134828Z 2024-04-01T20:17:26.613Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "6a9666fd-4dce-4b62-b975-519080f09131", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:17:26.614199493Z 2024-04-01T20:17:26.614Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "6a9666fd-4dce-4b62-b975-519080f09131", "error": "have no certificate for domain"} 2024-04-01T20:17:26.614210787Z 2024/04/01 20:17:26 http: TLS handshake error from 10.66.66.2:47137: have no certificate for domain 2024-04-01T20:17:26.727983940Z 2024-04-01T20:17:26.727Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "07481ae5-e81e-4d80-a4c8-5d69280bf3cd", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:17:26.728008897Z 2024-04-01T20:17:26.727Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "07481ae5-e81e-4d80-a4c8-5d69280bf3cd", "error": "have no certificate for domain"} 2024-04-01T20:17:26.728014409Z 2024/04/01 20:17:26 http: TLS handshake error from 10.66.66.2:47138: have no certificate for domain 2024-04-01T20:18:22.970853153Z 2024-04-01T20:18:22.970Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "5a839456-823f-4f66-8011-6c1264b03e03", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:18:22.970900191Z 2024-04-01T20:18:22.970Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "5a839456-823f-4f66-8011-6c1264b03e03", "error": "have no certificate for domain"} 2024-04-01T20:18:22.970910403Z 2024/04/01 20:18:22 http: TLS handshake error from 10.66.66.2:47163: have no certificate for domain 2024-04-01T20:18:23.096879686Z 2024-04-01T20:18:23.096Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "31243d2a-467f-442f-a540-09466539e024", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:18:23.096919379Z 2024-04-01T20:18:23.096Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "31243d2a-467f-442f-a540-09466539e024", "error": "have no certificate for domain"} 2024-04-01T20:18:23.096929203Z 2024/04/01 20:18:23 http: TLS handshake error from 10.66.66.2:47164: have no certificate for domain
При этом браузер показывает такое:
А вот на всякий случай лог lets-proxy2, запущенного не в докере (запущено на этом же сервере, сертификат пытаемся получить на этот же домен):
root@jitsi:~/mm# ./lets-proxy {"level":"info","ts":1712003821.5061865,"caller":"cmd/config.go:76","msg":"Read config","config_file":"config.tom[l]"} {"level":"info","ts":1712003821.5159106,"caller":"cmd/config.go:182","msg":"Parse config file","config_file":"default"} {"level":"info","ts":1712003821.516234,"caller":"cmd/config.go:82","msg":"Parse configs finished","config_file":"config.tom[l]","readed_files":0,"max_read_files":10000} 2024-04-01T20:37:01.516Z info cmd/log.go:71 Initialize log on level {"level": "info"} 2024-04-01T20:37:01.516Z info cmd/main.go:110 StartAutoRenew program version {"version": "Version: 'v0.29.3+build-8191065039, Build time 2024-03-07 15:57:08+00:00, commit 3524e48dc4b264fdb383f058f20720e7c85bb7bc, 1.20', Os: 'linux', Arch: 'amd64'"} 2024-04-01T20:37:01.516Z info cmd/main.go:190 Profiler disabled 2024-04-01T20:37:01.516Z info cmd/main.go:119 Create storage dir {"dir": "storage"} 2024-04-01T20:37:01.516Z info cmd/main.go:125 Acme directory {"url": "https://acme-v02.api.letsencrypt.org/directory"} 2024-04-01T20:37:01.517Z info cmd/main.go:128 Get acme client 2024-04-01T20:37:01.517Z info domain_checker/ip_list_sources.go:29 Create ip checker {"IPSelfDetectMethod": "auto"} 2024-04-01T20:37:01.561Z info domain_checker/ip_list_sources.go:66 Check aws metadata available {"available": false} 2024-04-01T20:37:01.562Z info cmd/main.go:148 start metrics 2024-04-01T20:37:01.562Z info tlslistener/config.go:48 Min tls version {"tls_version": "1.2"} 2024-04-01T20:37:01.562Z info tlslistener/tlslistenershandler.go:81 StartAutoRenew handleListeners 2024-04-01T20:37:01.562Z info proxy/config.go:106 Create same ip director {"port": 80} 2024-04-01T20:37:01.562Z info proxy/config.go:134 Create headers director {"headers": {"X-Forwarded-For":"{{SOURCE_IP}}","X-Forwarded-Proto":"{{HTTP_PROTO}}"}} 2024-04-01T20:37:01.562Z info cmd/main.go:168 Apply proxy config 2024-04-01T20:37:01.562Z info proxy/http-proxy.go:65 Set transport to reverse proxy 2024-04-01T20:37:01.562Z info proxy/http-proxy.go:72 Access log {"enabled": true} 2024-04-01T20:37:01.562Z info proxy/http-proxy.go:81 Http builtin reverse proxy start 2024-04-01T20:37:16.321Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "59f29a67-0684-468c-ba3d-108b2b0559a3", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:37:16.322Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "59f29a67-0684-468c-ba3d-108b2b0559a3", "error": "have no certificate for domain"} 2024/04/01 20:37:16 http: TLS handshake error from 10.66.66.2:47373: have no certificate for domain 2024-04-01T20:37:16.420Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "e0db8bc1-5d55-444e-9783-8c48b7575122", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:37:16.420Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "e0db8bc1-5d55-444e-9783-8c48b7575122", "error": "have no certificate for domain"} 2024/04/01 20:37:16 http: TLS handshake error from 10.66.66.2:47374: have no certificate for domain 2024-04-01T20:37:27.784Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "e3462ad5-3eed-4127-84d8-92f89d5e3c23", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:37:27.784Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "e3462ad5-3eed-4127-84d8-92f89d5e3c23", "error": "have no certificate for domain"} 2024/04/01 20:37:27 http: TLS handshake error from 10.66.66.2:47379: have no certificate for domain 2024-04-01T20:37:27.890Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "a4c52990-5fb8-48dd-848f-9bec710f248b", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:37:27.891Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "a4c52990-5fb8-48dd-848f-9bec710f248b", "error": "have no certificate for domain"} 2024/04/01 20:37:27 http: TLS handshake error from 10.66.66.2:47380: have no certificate for domain 2024-04-01T20:37:31.098Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "29e75910-dce5-42c1-964a-893716cafd4a", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:37:31.100Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "29e75910-dce5-42c1-964a-893716cafd4a", "error": "have no certificate for domain"} 2024/04/01 20:37:31 http: TLS handshake error from 10.66.66.2:47381: have no certificate for domain 2024-04-01T20:37:31.208Z info cert_manager/manager.go:158 Domain name normalization {"connection_id": "9d8d29f9-d443-404b-afa0-b08402bf0487", "original": "", "domain": " (punycode:)", "error": "idna: invalid label """} 2024-04-01T20:37:31.208Z info tlslistener/tlslistenershandler.go:234 TLS Handshake {"connection_id": "9d8d29f9-d443-404b-afa0-b08402bf0487", "error": "have no certificate for domain"} 2024/04/01 20:37:31 http: TLS handshake error from 10.66.66.2:47382: have no certificate for domain
English below
Хорошо бы добавить в документацию эти моменты насчёт взятия доменного имени из служебных полей SNI-запроса и времени ротации сертификата. Я не очень опытный админ, поэтому стал искать эти вещи в конфиге и, не найдя, был обескуражен.
Спасибо за отзыв, дописал это в README.
И, если можно, ещё вопрос. Какой командой внутри докер-контейнера можно запускать lets-proxy2 в фоне? Обычно программы типа веб-серверов или сервер TurboVNC предоставляют такой функционал - запуск в фоне.
У lets-proxy нет специальной команды для запуска в фоне, можно запустить в отдельном контейнере и перенаправить запросы на другой контейнер - с веб-сервером через конфиг. Ну или организовать такой запуск самостоятельно.
English version
It will be good to add info about auto-detect domain to documentation
Yes, thanks. I have added the info to README
How to start lets-proxy2 at background?
Lets-proxy has no own program to run in background, you should do it yourself or create separate containers for lets-proxy2 and web-server.
Other requests will be in separate issue: #215