使用portainer的stack部署容器的时候应该如何返回真实 IP ?
version: '3'
services:
  webdav:
    image: ghcr.io/hacdias/webdav
    container_name: webdav
    restart: always
    ports:
      - "10001:6065"
    volumes:
      - /storage/docker_data/webdav/config.yml:/config.yml:ro
      - /storage/docker_data/webdav/data:/data
    command: -c /config.yml
Bridge:
| Name | Stack LT | Driver | Attachable | IPAM Driver | IPV4 IPAM Subnet | IPV4 IPAM Gateway | 
|---|---|---|---|---|---|---|
| webdav_default | webdav | bridge | false | default | 172.19.0.0/16 | 172.19.0.1 | 
location / {
  proxy_pass http://127.0.0.1:10001;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header REMOTE-HOST $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $host;
  proxy_redirect off;
}
2024-10-18T03:01:09.536Z	INFO	login attempt	{"username": "aaaa", "remote_address": "172.19.0.1:57548"}
2024-10-18T03:01:09.536Z	INFO	user authorized	{"username": "aaaa"}
2024-10-18T03:02:13.219Z	INFO	login attempt	{"username": "aaaa", "remote_address": "172.19.0.1:56084"}
|      1asuraa      2024-10-18 11:59:53 +08:00 network_mode: "host" | 
|      2yuanxing008      2024-10-18 12:00:24 +08:00 你需要的是 网关+ 服务发现 + 注册中心  + 应用服务注册 | 
|  |      3Curtion      2024-10-18 12:00:41 +08:00 我的 nginx 这样是可以获取到真是 ip 的 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Referer $http_referer; #header_referer end proxy_set_header Host $host; #header_host end 当然还需要容器本身支持这些 header 才行,有些容器还需要额外配置,例如 traefik 需要加 trustedIPs 配置才行。 | 
|      4long1and      2024-10-18 12:02:21 +08:00 macvlan 或者 host 吧,一般的容器本身都没有填写真实 IP 的环境变量 | 
|      5yinmin      2024-10-18 12:06:49 +08:00 via iPhone OP 的理解有误,webdav 本质上获取的是 nginx ip ,因为 wevdav 的 tcp 源地址是 nginx ,不是客户端 ip | 
|  |      6ztfot OP 目前想做到的是让容器获取客户端 IP 地址, 有没有什么优雅的方式? 目前尝试了以下两种方案: ```docker compose .... restart: always ports: - target: 6065 # 容器内部端口 published: 10001 # 主机端口 protocol: tcp mode: host # 使用 host 模式发布端口 .... ``` log 与一开始的完全相同 ```docker-compose .... restart: always network_mode: host # 将网络模式设置为 host .... ``` 修改成 host 获取到的就是 127.0.0.1 了 ```log 2024-10-18T04:06:58.316Z INFO listening {"address": "[::]:6065"} 2024-10-18T04:07:03.282Z INFO login attempt {"username": "kivvi", "remote_address": "127.0.0.1:53372"} 2024-10-18T04:07:03.282Z INFO user authorized {"username": "kivvi"} ``` | 
|      7asuraa      2024-10-18 12:16:34 +08:00 你把 docker 理解成一个虚拟机就行了, | 
|  |      8Tink PRO host 模式 | 
|  |      9wheat0r      2024-10-18 13:15:06 +08:00 到底是获取真实 IP 地址还是返回真实 IP 地址? | 
|      10yinmin      2024-10-18 13:29:07 +08:00 via iPhone nginx 配置改这行试试 proxy_set_header X-Forwarded-For $remote_addr; | 
|      11gvdlmjwje      2024-10-18 13:39:04 +08:00 搭楼问问 docker 的 host 模式一般用于解决什么问题? | 
|      13huaxing0211      2024-10-18 14:05:23 +08:00 nginx 里这样设置看看: real_ip_header proxy_protocol; real_ip_recursive on; set_real_ip_from 桥接的网关 ip; | 
|  |      14execute      2024-10-18 16:08:02 +08:00 两个问题:第一,你的 nginx 是怎么部署的?从你的描述来看,我猜你的 nginx 也是通过容器部署的?第二,你 webdav 使用 host 网络模式的时候,客户端是怎么请求的?直接请求 webdav 容器的端口,还是依然请求的 nginx 的端口?我猜你仍然是请求的 nginx 的端口? | 
|  |      15rrfeng      2024-10-18 16:11:58 +08:00  1 程序无关 tcp 协议要用 proxy_protocol 或者 toa (放 tcp option 里)之类的技术 http 协议就用 X-Forwarded-For header | 
|  |      16Hardrain      2024-10-18 16:16:47 +08:00  1 让你的反向代理服务器设置 X-Forwarded-For 参考: https://github.com/hacdias/webdav/blob/a5777e18eec8db635657e972940fa8e545876bca/lib/handler.go#L169 | 
|  |      17GG668v26Fd55CP5W      2024-10-18 16:20:19 +08:00 via iPhone 获取到了的吧,获取请求头 X-Real-IP 的信息,不要取 remot_addr | 
|      18lelehub      2024-10-18 16:20:37 +08:00 做个代理就好了。 | 
|  |      19GG668v26Fd55CP5W      2024-10-18 16:20:46 +08:00 via iPhone 修正日志格式 | 
|  |      21anciusone      2024-10-19 10:04:38 +08:00 你的部署环境是什么样的,nginx 是在物理机上吗?如果是在虚拟环境中,情况又不一样了。 假定你的 nginx 在物理机上,可以这么先排查下: 1.起个 whoami 容器,看看 X-Forwarded-For 里有没有真实 ip 。 2.如果没有,去检查 nginx 有没有拿到真实 ip ,再排查 nginx 配置文件。 3.如果有,就是容器本身的问题,容器没有从 X-Forwarded-For 获取 ip ,而是从 remote_addr 拿到网关了地址。找找容器没有对应的变量或设置之类的。 只要 nginx 配置正确,容器本身有从 X-Forwarded-For 获取 ip 的设置,docker 不需要做什么设置,真实 ip 都能正常传递进去,用不用 host 模式,都是可以获取真实 ip 的。 | 
|  |      22ztfot OP 解决了,X-Forwarded-For 配置的有问题,谢谢老哥们 |