V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LOGOSJ
V2EX  ›  宽带症候群

监听本地 IP 的服务居然可以被公网访问

  •  
  •   LOGOSJ · 64 天前 · 2612 次点击
    这是一个创建于 64 天前的主题,其中的信息可能已经有所发展或是发生改变。
    [环境]
    路由器拨号(局域网 IP192.168.1.1 公网 IP123.12.12.12 )
    主机 Ubuntu 24.04.1 LTS (局域网 IP192.168.1.2 ,与路由器 DMZ )

    [异常情况]
    在主机上运行有一些服务,有的是直接跑,有的用 Docker 部署。监听地址为本机局域网 IP192.168.1.2 ,期望只允许内网访问。但实际上外网设备可以通过公网 IP+端口的形式访问这些服务。

    [做过的尝试]
    1.关闭了 UTUN 接口,由于本机采用 Sing box 的 tun 模式入站,猜测可能有关系。关了 UTUN 接口依然如此。
    2.使用 Pyhone 起了一个最简单的文件服务,监听本地 IP ,依然可以被公网访问,说明与服务无关。
    3.在阿里云服务器上测试,服务监听局域网 IP ,也可以被公网访问(排除本机故障)

    [一些猜想]
    1.DMZ 引起的,但是查到 DMZ 不涉及 NAT ,而且服务日志可以看见正确的外网访问的源 IP 。目前没有条件关闭 DMZ 测试,一关就失联
    2.安装 Singbox 时的一些设置所引起的。例如开启了 IP 转发;修改了转发规则(源 IP 伪装);防火墙放行了所有 TUN 接口的流量。
    3.安装了 snell 服务端,这是和阿里云服务器唯一的共同点,但是不认为这会有什么影响


    目前先用 UFW 防火墙只允许内网子网 IP 访问这些端口。
    虽然这是一个很基础的问题,但是由于本人能力水平实在有限,反请各位高手指点一二!
    17 条回复    2024-09-19 19:35:46 +08:00
    xclrr
        1
    xclrr  
       64 天前 via Android
    我了解的一种情况是,docker 开了端口映射不指定监听 ip 会突破 ufw ,docker 会自己修改 iptables ,不知道你是不是这种
    jimmy2010
        2
    jimmy2010  
       64 天前
    就是 dmz 引起的吧,dmz 就相当于把整个内网的某个 ip 暴露在公网了,如果进来的流量没有匹配到 nat 规则,就直接全部发给 dmz 主机,反倒是 nat 端口映射可以指定要暴露的端口,而不是全部。
    gam2046
        3
    gam2046  
       64 天前
    DMZ 就是一层 NAT 呀,外部请求过路由器的时候,source ip 就变成了路由器的 IP ,因此能够访问你的服务,是符合预期的。
    Laoz666
        4
    Laoz666  
       64 天前
    docker 的问题 docker 开出的端口不受防火墙限制 默认是 0.0.0.0:port
    IvanLi127
        5
    IvanLi127  
       64 天前
    看起来就是单纯 DMZ 的效果,DMZ 就是能让外网通过 NAT 访问内网,你这机子监听内网 IP 地址,刚刚好呀。
    sagaxu
        6
    sagaxu  
       64 天前   ❤️ 1
    这就是 DMZ 的工作方式,它将所有非 NAT 后的流量转发到指定的 IP ,你在路由器上设置 DMZ 主机为 192.168.1.2 ,那么所有监听在 192.168.1.2:*上的端口,都暴露在了公网,能在内网通过 IP:192.168.1.2 访问的服务,全部暴露在公网。

    所以一般 DMZ 主机,都要开防火墙,默认阻止所有。
    cdlnls
        8
    cdlnls  
       64 天前 via Android
    配置了 DMZ 之后不就是这个效果吗?
    LOGOSJ
        9
    LOGOSJ  
    OP
       64 天前
    @xclrr 不光是 docker 中的服务,直接跑的服务也是一样的。
    cdlnls
        10
    cdlnls  
       64 天前 via Android
    LOGOSJ
        11
    LOGOSJ  
    OP
       64 天前
    @gam2046 可是那些服务是可以看见源 IP 的,比如我用 python 起的一个最简单的文件服务,用外网设备访问的时候,在服务器上可以看见访问的源 IP 的,说明 DMZ 没有替换掉
    Jhma
        12
    Jhma  
       64 天前
    docker 的网络权限很高,像在 centos7 上部署 docker 他会绕过系统防火墙 firewall-cmd ,且是基于最底层的 iptables 来操作的
    LOGOSJ
        13
    LOGOSJ  
    OP
       64 天前
    @gam2046 比如测试用的 python 文件服务

    Serving at http://192.168.1.2:32187
    192.168.1.2 - - [17/Sep/2024 23:06:16] "GET / HTTP/1.1" 200 -
    192.168.1.2 - - [17/Sep/2024 23:06:16] code 404, message File not found
    192.168.1.2 - - [17/Sep/2024 23:06:16] "GET /favicon.ico HTTP/1.1" 404 -
    123.158.***.**- - [17/Sep/2024 23:07:41] "GET / HTTP/1.1" 200 -
    123.158.***.** - - [17/Sep/2024 23:07:57] code 404, message File not found
    123.158.***.** - - [17/Sep/2024 23:07:57] "GET /favicon.ico HTTP/1.1" 404 -

    123.158.*.*的就是我用于访问的外网设备的公网 IP
    tool2dx
        14
    tool2dx  
       64 天前   ❤️ 1
    @LOGOSJ 能看见 IP 不代表什么的,DMZ NAT 替换的 dst ip ,也就是目标 IP 被替换为了 192.168.1.2 。你这个 123.158.*是 src ip ,不替换的。
    lonelyduan
        15
    lonelyduan  
       64 天前
    配置 DMZ 不就是这个效果吗…
    rnv
        16
    rnv  
       63 天前
    看到 DMZ 就明白了。如果你想要安全点的方式,就关闭 DMZ ,使用端口映射
    LOGOSJ
        17
    LOGOSJ  
    OP
       62 天前
    感谢各位朋友的指导,确定是 DMZ 的预期行为。更大的问题是我对“监听”的含义理解错误了,某个服务监听在某个 IP 的某个端口,意味着主机只响应发往该 IP 该端口的请求。而我之前错误的理解成只接受源于与监听地址同子网网段的请求。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3455 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:20 · PVG 19:20 · LAX 03:20 · JFK 06:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.