Я установил nginx в качестве почтового прокси, но у меня возникли проблемы с обнаружением реального IP-адрес клиента
в скрипте аутентификации php, вызываемом nginx через auth_http
.
Меня не интересует получение реального IP-адреса на вышестоящем почтовом сервере.
Это мой стек:
- Cloudflare управляет DNS
- Остальное все обрабатывается с помощью Docker.
докер-compose.yml:
версия: '3.9'
Сервисы:
трафик:
имя_контейнера: трафик
изображение: трафик: v2.6.0
порты:
- "80:80"
- "443:443"
- "465:465"
- "993:993"
- "995:995"
...
этикетки:
- traefik.enable=true
- traefik.http.routers.traefik-public-https.tls=true
...
тома:
- /var/run/docker.sock:/var/run/docker.sock:ro
...
команда:
--providers.docker
--providers.docker.exposedbydefault=false
--entrypoints.http.address=:80
--entrypoints.https.address=:443
--entrypoints.entrypoint-nginx-mail-465.address=:465
--entrypoints.entrypoint-nginx-mail-993.address=:993
--entrypoints.entrypoint-nginx-mail-995.address=:995
--entrypoints.entrypoint-forwardedHeaders-trustedIPs.forwardedHeaders.trustedIPs=${TRAEFIK_TRUSTED_IPS}
...
нгинкс:
имя_контейнера: nginx
изображение: nginx:1.21
тома:
- ${PWD}/sys/nginx/vhosts:/etc/nginx/conf.d
- ${PWD}/sys/nginx/custom.d:/etc/nginx/custom.d
...
этикетки:
- traefik.enable=true
- traefik.tcp.routers.router-nginx-mail-465.entrypoints=entrypoint-nginx-mail-465
- traefik.tcp.routers.router-nginx-mail-465.rule=HostSNI(`*`)
- traefik.tcp.routers.router-nginx-mail-465.tls=true
- traefik.tcp.routers.router-nginx-mail-465.tls.certresolver=le
- traefik.tcp.routers.router-nginx-mail-465.service=service-nginx-mail-465
- traefik.tcp.services.service-nginx-mail-465.loadbalancer.server.port=587
- traefik.tcp.routers.router-nginx-mail-993.entrypoints=entrypoint-nginx-mail-993
- traefik.tcp.routers.router-nginx-mail-993.rule=HostSNI(`*`)
- traefik.tcp.routers.router-nginx-mail-993.tls=true
- traefik.tcp.routers.router-nginx-mail-993.tls.certresolver=le
- traefik.tcp.routers.router-nginx-mail-993.service=service-nginx-mail-993
- traefik.tcp.services.service-nginx-mail-993.loadbalancer.server.port=143
- traefik.tcp.routers.router-nginx-mail-995.entrypoints=entrypoint-nginx-mail-995
- traefik.tcp.routers.router-nginx-mail-995.rule=HostSNI(`*`)
- traefik.tcp.routers.router-nginx-mail-995.tls=true
- traefik.tcp.routers.router-nginx-mail-995.tls.certresolver=le
- traefik.tcp.routers.router-nginx-mail-995.service=service-nginx-mail-995
- traefik.tcp.services.service-nginx-mail-995.loadbalancer.server.port=110
...
php-fpm:
имя_контейнера: php-fpm
изображение: битнами/php-fpm:7.4
userns_mode: 'хост'
этикетки:
- traefik.enable=false
...
.env:
#https://www.cloudflare.com/ips
# Последнее обновление: 8 апреля 2021 г.
TRAEFIK_TRUSTED_IPS=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/ 13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22,2400:cb00::/32,2606:4700::/32,2803:f800::/32,2405:b500::/32,2405:8100: :/32,2a06:98c0::/29,2c0f:f248::/32
...
sys/nginx/vhosts/00-main.conf:
сервер {
слушать [::]:80;
слушать 80;
имя_сервера локальный хост;
корень /приложение/public;
индекс index.php;
расположение ~/\. {
отрицать все;
}
расположение ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
включить fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
sys/nginx/custom.d/mail.conf:
почта {
имя сервера _;
auth_http localhost:80/proxy.php;
proxy_pass_error_message включено;
imap_capabilities IMAP4 IMAP4rev1 LOGIN-REFERRALS SASL-IR ENABLE IDLE ID LITERAL+;
pop3_capabilities CAPA RESP-CODES USER TOP AUTH-RESP-CODE PIPELINING UIDL;
smtp_capabilities КОНВЕЙЕРНАЯ ПЕРЕДАЧА "РАЗМЕР ***" ETRN РАСШИРЕННЫЕ КОДЫ СОСТОЯНИЯ 8BITMIME DSN CHUNKING;
...
сервер {
слушать 110;
протокол поп3;
включается;
auth_http_header X-Auth-порт 110;
auth_http_header User-Agent "Прокси POP3";
}
сервер {
слушать 143;
имап протокола;
включается;
auth_http_header X-Auth-порт 143;
auth_http_header User-Agent "IMAP-прокси";
}
сервер {
слушать 587;
протокол smtp;
включается;
auth_http_header X-Auth-порт 587;
auth_http_header User-Agent "SMTP-прокси";
}
}
getallheaders() внутри proxy.php:
множество (
'User-Agent' => 'IMAP-прокси',
'X-Auth-Порт' => '143',
'Клиент-Ip' => '172.27.0.2',
'Аутентификация-Вход-Попытка' => '1',
'Протокол авторизации' => 'imap',
'Аутентификация-Pass' => '***',
'Авторизация пользователя' => '***',
'Auth-Method' => 'обычный',
«Хост» => «локальный хост»,
'Длина содержания' => '',
'Тип контента' => '',
)
$_SERVER внутри proxy.php:
множество (
'HTTP_USER_AGENT' => 'IMAP-прокси',
'HTTP_X_AUTH_PORT' => '143',
'HTTP_CLIENT_IP' => '172.27.0.2',
'HTTP_AUTH_LOGIN_ATTEMPT' => '1',
'HTTP_AUTH_PROTOCOL' => 'изображение',
'HTTP_AUTH_PASS' => '***',
'HTTP_AUTH_USER' => '***',
'HTTP_AUTH_METHOD' => 'обычный',
'HTTP_HOST' => 'локальный хост',
'REDIRECT_STATUS' => '200',
'SERVER_NAME' => 'локальный хост',
'SERVER_PORT' => '80',
'СЕРВЕР_АДРЕС' => '127.0.0.1',
'REMOTE_PORT' => '49360',
'REMOTE_ADDR' => '127.0.0.1',
'SERVER_SOFTWARE' => 'nginx/1.21.3',
'ШЛЮЗ_ИНТЕРФЕЙС' => 'CGI/1.1',
'REQUEST_SCHEME' => 'http',
'СЕРВЕР_ПРОТОКОЛ' => 'HTTP/1.0',
'DOCUMENT_URI' => '/proxy.php',
'REQUEST_URI' => '/',
'SCRIPT_NAME' => '/proxy.php',
'CONTENT_LENGTH' => '',
'CONTENT_TYPE' => '',
'REQUEST_METHOD' => 'ПОЛУЧИТЬ',
'QUERY_STRING' => '',
'FCGI_ROLE' => 'ОТВЕТЧИК',
'PHP_SELF' => '/proxy.php',
...
)