关于 Docker 容器获取真实 IP

ztfot · 2024-10-18 11:50:49 · 149 次点击
使用`portainer`的`stack`部署容器的时候应该如何返回真实 IP ?

```docker-compose
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
```

- 使用 stack docker compose 部署容器的时候,docker 会自动生成一个以 stack 命名的网桥, 比如这个 stack 名叫 webdav
- 比如刚刚生成的容器就自己创建了一个自己的网桥,容器的 IP 地址是 172.19.0.2,网关是 172.19.0.1

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     |

```nginx
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;
}
```

- 用 nginx 进行反向代理的时候,我进入容器的后台发现
    ```log
    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"}
    ```
- 容器只能检测到它网关的信息,有老哥知道如何解决? 无法获得真正的 IP 地址
- 不仅仅是 webdav 其他的容器都是这样, 类似的还有 bitwarden 等等。。
举报· 149 次点击
登录 注册 站外分享
9 条回复  
wheat0r 小成 2024-10-18 13:15:06
到底是获取真实 IP 地址还是返回真实 IP 地址?
Tink 小成 2024-10-18 12:48:54
host 模式
yinmin 小成 2024-10-18 12:06:49
OP 的理解有误,webdav 本质上获取的是 nginx ip ,因为 wevdav 的 tcp 源地址是 nginx ,不是客户端 ip
long1and 小成 2024-10-18 12:02:21
macvlan 或者 host 吧,一般的容器本身都没有填写真实 IP 的环境变量
Curtion 小成 2024-10-18 12:00:41
我的 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 配置才行。
yuanxing008 初学 2024-10-18 12:00:24
你需要的是 网关+ 服务发现 + 注册中心  + 应用服务注册
asuraa 小成 2024-10-18 11:59:53
network_mode: "host"
返回顶部