关于 Docker 容器获取真实 IP

64 天前
 ztfot

使用portainerstack部署容器的时候应该如何返回真实 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;
}
3382 次点击
所在节点    程序员
23 条回复
asuraa
64 天前
network_mode: "host"
yuanxing008
64 天前
你需要的是 网关+ 服务发现 + 注册中心 + 应用服务注册
Curtion
64 天前
我的 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 配置才行。
long1and
64 天前
macvlan 或者 host 吧,一般的容器本身都没有填写真实 IP 的环境变量
yinmin
64 天前
OP 的理解有误,webdav 本质上获取的是 nginx ip ,因为 wevdav 的 tcp 源地址是 nginx ,不是客户端 ip
ztfot
64 天前
目前想做到的是让容器获取客户端 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"}
```
asuraa
64 天前
你把 docker 理解成一个虚拟机就行了,
Tink
64 天前
host 模式
wheat0r
64 天前
到底是获取真实 IP 地址还是返回真实 IP 地址?
yinmin
64 天前
nginx 配置改这行试试

proxy_set_header X-Forwarded-For $remote_addr;
gvdlmjwje
64 天前
搭楼问问 docker 的 host 模式一般用于解决什么问题?
bigbugbag
64 天前
@gvdlmjwje 使用宿主机网络的场景,比如获取宿主机的网络详情,见 node exporter
huaxing0211
64 天前
nginx 里这样设置看看:

real_ip_header proxy_protocol;
real_ip_recursive on;
set_real_ip_from 桥接的网关 ip;
execute
63 天前
两个问题:第一,你的 nginx 是怎么部署的?从你的描述来看,我猜你的 nginx 也是通过容器部署的?第二,你 webdav 使用 host 网络模式的时候,客户端是怎么请求的?直接请求 webdav 容器的端口,还是依然请求的 nginx 的端口?我猜你仍然是请求的 nginx 的端口?
rrfeng
63 天前
程序无关
tcp 协议要用 proxy_protocol 或者 toa (放 tcp option 里)之类的技术
http 协议就用 X-Forwarded-For header
Hardrain
63 天前
falcon05
63 天前
获取到了的吧,获取请求头 X-Real-IP 的信息,不要取 remot_addr
lelehub
63 天前
做个代理就好了。
falcon05
63 天前
修正日志格式
duzhuo
63 天前
@gvdlmjwje 我这种懒 b 最爱

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1081446

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX