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

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

  •  
  •   LOGOSJ · 1 天前 · 1790 次点击
    [环境]
    路由器拨号(局域网 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  
       1 天前 via Android
    我了解的一种情况是,docker 开了端口映射不指定监听 ip 会突破 ufw ,docker 会自己修改 iptables ,不知道你是不是这种
    jimmy2010
        2
    jimmy2010  
       1 天前
    就是 dmz 引起的吧,dmz 就相当于把整个内网的某个 ip 暴露在公网了,如果进来的流量没有匹配到 nat 规则,就直接全部发给 dmz 主机,反倒是 nat 端口映射可以指定要暴露的端口,而不是全部。
    gam2046
        3
    gam2046  
       1 天前
    DMZ 就是一层 NAT 呀,外部请求过路由器的时候,source ip 就变成了路由器的 IP ,因此能够访问你的服务,是符合预期的。
    Laoz666
        4
    Laoz666  
       1 天前
    docker 的问题 docker 开出的端口不受防火墙限制 默认是 0.0.0.0:port
    IvanLi127
        5
    IvanLi127  
       1 天前
    看起来就是单纯 DMZ 的效果,DMZ 就是能让外网通过 NAT 访问内网,你这机子监听内网 IP 地址,刚刚好呀。
    sagaxu
        6
    sagaxu  
       1 天前   ❤️ 1
    这就是 DMZ 的工作方式,它将所有非 NAT 后的流量转发到指定的 IP ,你在路由器上设置 DMZ 主机为 192.168.1.2 ,那么所有监听在 192.168.1.2:*上的端口,都暴露在了公网,能在内网通过 IP:192.168.1.2 访问的服务,全部暴露在公网。

    所以一般 DMZ 主机,都要开防火墙,默认阻止所有。
    cdlnls
        8
    cdlnls  
       1 天前 via Android
    配置了 DMZ 之后不就是这个效果吗?
    LOGOSJ
        9
    LOGOSJ  
    OP
       1 天前
    @xclrr 不光是 docker 中的服务,直接跑的服务也是一样的。
    cdlnls
        10
    cdlnls  
       1 天前 via Android
    LOGOSJ
        11
    LOGOSJ  
    OP
       1 天前
    @gam2046 可是那些服务是可以看见源 IP 的,比如我用 python 起的一个最简单的文件服务,用外网设备访问的时候,在服务器上可以看见访问的源 IP 的,说明 DMZ 没有替换掉
    Jhma
        12
    Jhma  
       1 天前
    docker 的网络权限很高,像在 centos7 上部署 docker 他会绕过系统防火墙 firewall-cmd ,且是基于最底层的 iptables 来操作的
    LOGOSJ
        13
    LOGOSJ  
    OP
       1 天前
    @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  
       1 天前   ❤️ 1
    @LOGOSJ 能看见 IP 不代表什么的,DMZ NAT 替换的 dst ip ,也就是目标 IP 被替换为了 192.168.1.2 。你这个 123.158.*是 src ip ,不替换的。
    lonelyduan
        15
    lonelyduan  
       1 天前
    配置 DMZ 不就是这个效果吗…
    rnv
        16
    rnv  
       15 小时 39 分钟前
    看到 DMZ 就明白了。如果你想要安全点的方式,就关闭 DMZ ,使用端口映射
    LOGOSJ
        17
    LOGOSJ  
    OP
       5 小时 10 分钟前
    感谢各位朋友的指导,确定是 DMZ 的预期行为。更大的问题是我对“监听”的含义理解错误了,某个服务监听在某个 IP 的某个端口,意味着主机只响应发往该 IP 该端口的请求。而我之前错误的理解成只接受源于与监听地址同子网网段的请求。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1658 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:46 · PVG 00:46 · LAX 09:46 · JFK 12:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.