V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WenJimmy
V2EX  ›  Docker

容器中如何能访问到宿主机的端口?

  •  
  •   WenJimmy · 2022-06-17 14:33:03 +08:00 · 991 次点击
    这是一个创建于 888 天前的主题,其中的信息可能已经有所发展或是发生改变。

    宿主机启动了一个 node 服务,端口 8001,nginx 为容器,配置反代访问不到 宿主机系统 Ubuntu 20.04.2 LTS (GNU/Linux 5.13.0-1036-oracle aarch64)

    docker 容器 nginx:alpine 反代 8001 端口

    nginx 配置如下

    location / {
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://172.23.0.1:8001;
    \}
    
    #容器的 ip 信息
    docker inspect nginx | grep IPAddress
    
    "SecondaryIPAddresses": null,
                "IPAddress": "",
                        "IPAddress": "172.23.0.2",
    

    nginx 内能够 ping 通 172.23.0.1 ,但是 wget http://172.23.0.1:8001 不行

    应该要怎么配置才能够访问通

    第 1 条附言  ·  2022-06-17 17:28:21 +08:00
    加了一条规则:
    -A INPUT -i br-2db4a9812e19 -p tcp -m tcp --dport 8001 -j ACCEPT
    现在能用了,不知道这样配是不是最好的规则
    villivateur
        1
    villivateur  
       2022-06-17 14:40:11 +08:00
    你要不检查下宿主机的防火墙有没有允许这个网段访问
    dier
        2
    dier  
       2022-06-17 15:28:42 +08:00   ❤️ 1
    反代 node 服务的 IP 改成宿主机物理网卡的 IP 。
    WenJimmy
        3
    WenJimmy  
    OP
       2022-06-17 15:38:59 +08:00
    @dier #2 外网 IP 么?
    WenJimmy
        4
    WenJimmy  
    OP
       2022-06-17 15:41:19 +08:00
    @villivateur #1
    docker 容器用的网卡名是 br-2db4a9812e19
    ......
    -A FORWARD -o br-2db4a9812e19 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -o br-2db4a9812e19 -j DOCKER
    -A FORWARD -i br-2db4a9812e19 ! -o br-2db4a9812e19 -j ACCEPT
    -A FORWARD -i br-2db4a9812e19 -o br-2db4a9812e19 -j ACCEPT
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    -A OUTPUT -d 169.254.0.0/16 -j InstanceServices
    -A DOCKER -d 172.23.0.2/32 ! -i br-2db4a9812e19 -o br-2db4a9812e19 -p tcp -m tcp --dport 443 -j ACCEPT
    -A DOCKER -d 172.23.0.2/32 ! -i br-2db4a9812e19 -o br-2db4a9812e19 -p tcp -m tcp --dport 80 -j ACCEPT
    -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
    -A DOCKER-ISOLATION-STAGE-1 -i br-2db4a9812e19 ! -o br-2db4a9812e19 -j DOCKER-ISOLATION-STAGE-2
    -A DOCKER-ISOLATION-STAGE-1 -j RETURN
    -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
    -A DOCKER-ISOLATION-STAGE-2 -o br-2db4a9812e19 -j DROP
    -A DOCKER-ISOLATION-STAGE-2 -j RETURN
    -A DOCKER-USER -j RETURN
    ........
    -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    -A POSTROUTING -s 172.23.0.0/16 ! -o br-2db4a9812e19 -j MASQUERADE
    -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 443 -j MASQUERADE
    -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
    -A POSTROUTING -s 172.23.0.2/32 -d 172.23.0.2/32 -p tcp -m tcp --dport 443 -j MASQUERADE
    -A POSTROUTING -s 172.23.0.2/32 -d 172.23.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE

    -A DOCKER -i docker0 -j RETURN
    -A DOCKER -i br-2db4a9812e19 -j RETURN
    -A DOCKER ! -i br-2db4a9812e19 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.23.0.2:443
    -A DOCKER ! -i br-2db4a9812e19 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.23.0.2:80

    iptables 中相关的规则都在这了,看不太懂,我应该加什么配置才能过
    dier
        5
    dier  
       2022-06-17 17:07:03 +08:00
    @WenJimmy 你的 Ubuntu 宿主机网卡上的 IP 呀,难道你直接把 Ubuntu 上配置的是公网 IP ?
    WenJimmy
        6
    WenJimmy  
    OP
       2022-06-17 17:10:20 +08:00
    @dier #5 试过了,没用,感觉应该是防火墙的问题
    dier
        7
    dier  
       2022-06-17 17:34:48 +08:00
    @WenJimmy #6 你在其它主机上访问你 Ubuntu 的这个 8001 服务试试看,如果访问不到基本上就是防火墙导致的了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.