0

我认为我的环境中存在配置错误的问题,我想听听您对此的看法。解决它的建议或帮助将非常受欢迎。

描述: 我在通过虚拟主机名使用 jwilder/nginx-proxy 容器访问 LDAP Admin 时遇到问题,而通过具有暴露端口的真实 linux 主机名访问工作正常。使用有效的通配符证书通过 HTTPS 访问。

环境: 我在 linux (CentOS 7) 上运行 docker,我想设置一个带有 jwilder/nginx-proxy 的 docker 容器和另外两个 docker 容器:一个用于 openLdap,第二个用于 phpLdapAdmin。因此,对我的 ldapadmin 的访问将通过 nginx,而不会暴露端口。

到目前为止完成的步骤:

1.创建容器——nginx代理

docker run -d -p 80:80 -p 443:443 \
  -v /home/admin/nginx/certs:/etc/nginx/certs \
  -v /var/run/docker.sock:/tmp/docker.sock:ro \
  --name proxy \
  jwilder/nginx-proxy

2.创建容器——ldap

docker run --name ldap -p 636:636 \ 
 -v /home/admin/nginx/certs:/container/service/slapd/assets/certs \
 -v /data/slapd/database:/var/lib/ldap \
 -v /data/slapd/config:/etc/ldap/slapd.d \
 --hostname ldap.company.com \
 --add-host=ldap.company.com:192.168.168.168 \
 --env LDAP_ORGANISATION='Company ltd' \
 --env LDAP_DOMAIN='company.com' \
 --env LDAP_ADMIN_PASSWORD='Password' \
 --detach osixia/openldap:1.2.2 \

而不是“192.168.168.168”是我的真实公共IP地址

然后成功搜索LDAP

docker exec ldap \
  ldapsearch -x -H ldap://ldap.company.com \
  -b dc=company,dc=com \
  -D "cn=admin,dc=company,dc=com" \
  -w Password\

3.创建容器phpldapadmin

docker run \
 --name ldapadmin \
 --env PHPLDAPADMIN_LDAP_HOSTS=ldap.company.com \ 
 --expose 389 \
 -e VIRTUAL_HOST=ldap.company.com \
 -e VIRTUAL_PORT=389 \
 --volume /home/admin/nginx/certs:/container/service/phpldapadmin/assets/apache2/certs \
--env PHPLDAPADMIN_HTTPS_CRT_FILENAME=ldap.company.com.crt \
--env PHPLDAPADMIN_HTTPS_KEY_FILENAME=ldap.company.com.key \
--env PHPLDAPADMIN_HTTPS_CA_CRT_FILENAME=ldap.company.com.crt \
--detach osixia/phpldapadmin:0.7.2

最后重启 nginx 代理容器,自动将 ldap 和 ldapadmin 添加到 nginx 配置中。

docker 重启代理

然后我得到这个暴露的端口:

图像端口名称

osixia/phpldapadmin:0.7.2 80/tcp, 389/tcp, 443/tcp ldapadmin

osixia/openldap:1.2.2 389/tcp, 0.0.0.0:636->636/tcp ldap

现在出现了奇怪的部分,我的 Linux 服务器的主机名是 dev.company.com,带有一些公共地址,我可以使用https://dev.company.com:6443访问我的 ldapadmin ,但我无法通过 URL 访问:ldap .company.com,不暴露端口。我无法在 Linux 主机本身上 ping ldap.company.com.key。

注意: 我为 Jenkins 做了同样的事情:

docker run -d --rm -u root -v /var/run/docker.sock:/var/run/docker.sock -v jenkins-data:/var/jenkins_home -v "$HOME":/home -e VIRTUAL_HOST=jenkins.company.com -e VIRTUAL_PORT=8080 --name nj jenkins

对于神器:

docker run --name artifact -d -v /var/opt/jfrog/artifactory:/var/opt/jfrog/artifactory -e VIRTUAL_HOST=artifactory.company.com -e VIRTUAL_PORT=8081 artifactory-oss

对于这两个我都有可ping通的URL,它们返回我的公共IP地址,我通过浏览器成功访问它们:jenkins.company.com和artifactory.company.com

我无法在 Linux 主机本身上 ping ldap.company.com.key。

4

3 回答 3

0

首先,您可以检查jwilder/nginx-proxy它是否实际收到任何请求的日志:

docker logs -f CONTAINER_ID

但是,如果您甚至无法 ping ldap.company.com,则可能无法将域解析为 IP 地址,因为它没有 DNS 记录。您可以使用以下方法进行测试:

host ldap.company.com

如果无法解析域,则在company.comDNS 服务器中创建一个指向ldap.company.com您主机的公共 IP 地址的 DNS A 记录。

或者您可以测试之前是否一切正常,如果您只是向主机的公共 IP 地址而不是ldap.company.com域发出 PHPLDAPAdmin 请求。

于 2018-11-17T00:26:50.177 回答
0

对于那些在黑暗中跌跌撞撞的人:由于代理正在处理 HTTPS 内容,因此您不需要 apache,因此您可以使用以下 env 变量运行 phpldapadmin:

environment:
  - PHPLDAPADMIN_TRUST_PROXY_SSL=true
  - PHPLDAPADMIN_HTTPS=false

您不会为 docker 映像公开任何端口,因为 nginx-proxy 在内部处理所有网络。

有同样的问题,但这个问题解决了,考虑这样做,因为这就是letsencrypt-proxy-companion设置“高级设置”的方式

于 2019-09-07T19:46:22.660 回答
0

由于我无法在上述评论中详细描述我当前的状态,因此我将把它写为部分答案,因为当我在我的 URL 中指定端口时我可以访问。我的环境回顾是这样的:

1.创建容器——nginx代理

docker run -d -p 80:80 -p 443:443 \
  -v /home/admin/nginx/certs:/etc/nginx/certs \
  -v /var/run/docker.sock:/tmp/docker.sock:ro \
  --name proxy \
  jwilder/nginx-proxy

2.创建容器-LDAP

docker run --name ldap \
 -v /home/admin/nginx/certs:/container/service/slapd/assets/certs \
 -v /data/slapd/database:/var/lib/ldap -v /data/slapd/config:/etc/ldap/slapd.d \
 --hostname ldap.company.com --add-host=ldap.company.com:192.168.168.168 \
 --expose 443 \
 --env LDAP_ORGANISATION='Company ltd' \
 --env LDAP_DOMAIN='company.com' \
 --env LDAP_ADMIN_PASSWORD='Password' \
 -e VIRTUAL_HOST=ldap.company.com \
 -e VIRTUAL_PORT=443 \
 --detach osixia/openldap:1.2.2

3. 创建容器 - PHPLDAPADMIN

docker run --name ldapadmin \
 -p 6443:443 \
 --env PHPLDAPADMIN_LDAP_HOSTS=ldap.company.com \
 -e VIRTUAL_HOST=ldap.company.com \
 -e VIRTUAL_PORT=443 \
 --expose 443 \
 --hostname ldap.company.com \
 --volume /home/admin/nginx/certs:/container/service/phpldapadmin/assets/apache2/certs \
 --env PHPLDAPADMIN_HTTPS_CRT_FILENAME=ldap.company.com.crt \
 --env PHPLDAPADMIN_HTTPS_KEY_FILENAME=ldap.company.com.key \
 --env PHPLDAPADMIN_HTTPS_CA_CRT_FILENAME=ldap.company.com.crt \
 --detach osixia/phpldapadmin:0.7.2\

nginx中的配置:cat /etc/nginx/conf.d/default.conf

# ldap.company.com
upstream ldap.company.com {
            ## Can be connected with "bridge" network
        # ldapadmin
        server 172.17.0.5:443;
            ## Can be connected with "bridge" network
        # ldap
        server 172.17.0.4:443;
}
server {
server_name ldap.company.com;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
return 301 https://$host$request_uri;
}
server {
  server_name ldap.company.com;
  listen 443 ssl http2 ;
  access_log /var/log/nginx/access.log vhost;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-******************';
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;
  ssl_certificate /etc/nginx/certs/ldap.company.com.crt;
  ssl_certificate_key /etc/nginx/certs/company.com.key;
  add_header Strict-Transport-Security "max-age=31536000" always;
  location / {
    proxy_pass http://ldap.company.com;
  }
}

运行容器:

[admin@dev ~]$ docker ps
CONTAINER ID  IMAGE                      COMMAND                  CREATED          STATUS         PORTS                                   NAMES
4c021b9f85e4  osixia/phpldapadmin:0.7.2  "/container/tool/run"    9 minutes ago    Up 9 minutes   80/tcp, 0.0.0.0:6443->443/tcp            ldapadmin
53963bfe8fdc  osixia/openldap:1.2.2      "/container/tool/run"    10 minutes ago   Up 10 minutes  389/tcp, 443/tcp, 636/tcp                   ldap
c9576b8c1b72  jwilder/nginx-proxy        "/app/docker-entrypo…"   10 days ago      Up 21 minutes  0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   proxy

当我在浏览器中调用http://ldap.company.com时从 nginx 登录:-失败

nginx.1    | 2018/11/19 12:46:11 [error] 32#32: *1 upstream prematurely closed connection while reading response header from upstream, client: X:X:X:X, server: ldap.company.com, request: "GET / HTTP/2.0", upstream: "http://172.17.0.5:443/", host: "ldap.company.com"
nginx.1    | 2018/11/19 12:46:11 [error] 32#32: *1 connect() failed (111: Connection refused) while connecting to upstream, client: X:X:X:X, server: ldap.company.com, request: "GET / HTTP/2.0", upstream: "http://172.17.0.4:443/", host: "ldap.company.com"

当我在浏览器中调用https://ldap.company.com:6443时从 nginx 登录-成功

nginx.1    | ldap.company.com X:X:X:X - - [19/Nov/2018:12:46:11 +0000] "GET / HTTP/2.0" 502 575 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"

[管理员@dev ~]$

我脑海中闪过的问题是:

  1. 我是否以正确的方式创建容器?
  2. 在创建ldap容器的过程中,是否需要指定一些端口-p XXX:XX?
  3. 我是否也需要在 ldap 和 ldapadmin 上导出端口,就像我使用 -expose 开关所做的那样?
  4. 我做错了什么?

提前感谢所有可以提供帮助的人,特别是您的 weibeld,感谢您的宝贵时间和宝贵意见。

附加信息:

在 NGINX 容器上,我收到以下错误:

nginx.1    | ldap.bitconex.de 62.216.206.17 - - [20/Nov/2018:15:52:49 +0000] "GET / HTTP/2.0" 403 209 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"

由于我在 ldapadmin 上收到错误消息:

[Tue Nov 20 15:18:23.807278 2018] [authz_core:error] [pid 1019:tid 140081490781952] [client 172.17.0.3:59916] AH01630: client denied by server configuration: /var/www/html
172.17.0.3 - - [20/Nov/2018:15:18:23 +0000] "GET / HTTP/1.1" 403 373 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"

我搜索了 ldap-admin 容器以检查在 /var/www/html 中提到了哪些文件,我发现在两个地方提到了 taht:

1.

root@d65a1005d5aa:/# grep -rnw '/var/' -e '/var/www/html'
/var/lib/dpkg/info/apache2.postinst:111:        for dir in /var/www 
/var/www/html ; do
/var/lib/dpkg/info/apache2.postinst:124:            cp 
/usr/share/apache2/default-site/index.html /var/www/html/index.html
/var/lib/dpkg/info/apache2.postinst:128:        for dir in /var/www 
/var/www/html ; do
/var/lib/dpkg/info/apache2.postrm:70:   if is_default_index_html 
/var/www/html/index.html ; then
/var/lib/dpkg/info/apache2.postrm:71:       rm -f 
/var/www/html/index.html
/var/lib/dpkg/info/apache2.list:223:/var/www/html

2.

root@d65a1005d5aa:/container/service/:apache2/assets/sites-available# 
ls
000-default.conf
root@d65a1005d5aa:/container/service/:apache2/assets/sites-available# 
cat 000-default.com
<VirtualHost *:80>
     # The ServerName directive sets the request scheme, hostname and port that
     # the server uses to identify itself. This is used when creating
     # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
   #ServerName www.example.com

   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html

   # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
   # error, crit, alert, emerg.
   # It is also possible to configure the loglevel for particular
   # modules, e.g.
   #LogLevel info ssl:warn

   # For most configuration files from conf-available/, which are
   # enabled or disabled at a global level, it is possible to
   # include a line for only one particular virtual host. For example the
   # following line enables the CGI configuration for this host only
   # after it has been globally disabled with "a2disconf".
   #Include conf-available/serve-cgi-bin.conf

   <Directory /var/www/html >
       Require all granted
   </Directory>

</VirtualHost>

所以我不确定我是否需要手动创建这个 html 文件夹或编辑这个文件到位 2,并将路径放置到 phpadmin 配置文件:root@d65a1005d5aa:/container/service/phpldapadmin/assets/config# ls config.php自述文件.md

或者也许把路径放到/var/www/phpldapadmin_bootstrap/htdocs?

于 2018-11-19T13:35:48.777 回答