V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
dzdh
V2EX  ›  Linux

有一个服务监听了 127.0.0.1:8000,怎么限制,只允许某个程序能通过 HTTP 协议访问。

  •  1
     
  •   dzdh · 2023-10-27 17:20:03 +08:00 · 4454 次点击
    这是一个创建于 423 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是限制程序,而不是来源 IP 。

    比如只允许 /usr/bin/curl 发起 HTTP 访问 127.0.0.1:8000

    python 用 requests 就不行

    41 条回复    2023-10-29 21:51:24 +08:00
    guxingke
        1
    guxingke  
       2023-10-27 17:23:35 +08:00
    http 协议决定了 限制不了
    zsj1029
        2
    zsj1029  
       2023-10-27 17:30:25 +08:00   ❤️ 1
    userAgent 咯 curl 有自己的 agent
    不过这玩意可以伪造,py request 改掉 header 可以绕过
    ShineyWang
        3
    ShineyWang  
       2023-10-27 17:39:33 +08:00 via Android
    怎么发起请求是客户端行为,你服务器限制不了的
    除非你自己给他一个客户端,然后用你自己的客户端发起请求
    psyche08
        4
    psyche08  
       2023-10-27 17:40:10 +08:00
    如果都是本机的程序的话,在建立连接后,根据来源的端口号查询对应的进程,这样就可以校验了。
    shermie
        5
    shermie  
       2023-10-27 17:40:49 +08:00
    header 里面带个签名 如果是限制诸如 python 这样的爬虫 就上 ja3 ja4 指纹限制
    sentinelK
        6
    sentinelK  
       2023-10-27 17:54:02 +08:00
    如果是“某个定制程序”的话,可以通过接口加密实现。

    如果是一个不能干预的,或者是“某种程序”的话,就要服务器端根据其特征识别了。但是这个识别方式很不安全,非常容易被模仿。
    baihekong
        7
    baihekong  
       2023-10-27 17:56:52 +08:00
    定一个特殊的 UA ,执行某个程序的时候才带上
    ttvast
        8
    ttvast  
       2023-10-27 18:03:15 +08:00   ❤️ 2
    用 selinux 配合 iptables
    billlee
        9
    billlee  
       2023-10-27 18:05:09 +08:00
    这个只能 selinux/apparmor 配合 netfilter 了吧
    ho121
        10
    ho121  
       2023-10-27 18:11:10 +08:00 via Android
    感觉是 xy 问题。
    如果是要防止未授权的访问,加个鉴权就行,比如 http 的用户名和密码、token 之类的。
    DefoliationM
        11
    DefoliationM  
       2023-10-27 18:17:57 +08:00 via Android
    根据来源地址和目标地址迭代/proc 目录拿到程序路径,然后根据程序路径限制就行了。
    DefoliationM
        12
    DefoliationM  
       2023-10-27 18:19:08 +08:00 via Android
    Elliota
        13
    Elliota  
       2023-10-27 18:21:04 +08:00
    只能端口数据流校验
    lance6716
        14
    lance6716  
       2023-10-27 18:23:33 +08:00 via Android   ❤️ 3
    本“xy 问题“警察已经抵达现场!请问 op 为什么会有这么奇怪的需求呢
    liberize
        15
    liberize  
       2023-10-27 18:27:23 +08:00 via Android
    1. 收到 tcp 连接时获取源端口
    2. 然后查源端口对应的程序的 pid
    3. 进一步根据 pid 获取程序文件名
    4. 判断文件名是否在白名单
    其中 2 和 3 在 windows 下有接口可以获取,linux 下可以读/proc 。
    julyclyde
        16
    julyclyde  
       2023-10-27 18:46:50 +08:00
    systemd“判断某条日志属于哪个 service”是用 unix domain socket 啊还是 pipe 的“对方”反查进程号的

    不过 tcp/ip 似乎比较困难吧
    Nazz
        17
    Nazz  
       2023-10-27 19:16:53 +08:00
    token 鉴权
    piaoxueblog
        18
    piaoxueblog  
       2023-10-27 19:22:21 +08:00
    可以的。一种实现方式是使用指定用户运行这个程序,然后在 iptables 里加对应规则
    yichya
        19
    yichya  
       2023-10-27 22:47:25 +08:00   ❤️ 1
    curl 可以访问
    python requests 不能访问
    那如果用 python 的 os.system() 执行 curl 并且取得返回值这种形式可不可以访问?
    victorc
        20
    victorc  
       2023-10-27 23:28:27 +08:00
    限制不了,得引入第三方角色进行仲裁
    dode
        21
    dode  
       2023-10-27 23:55:37 +08:00
    @psyche08 +1

    使用 curl 的独特特性指定一个固定源端口?
    curl http://example.com -p 12345

    把两个程序跑在一个 Linux 网络命名空间里?
    jackOff
        22
    jackOff  
       2023-10-28 00:33:34 +08:00
    这个听起来可以从另一个角度实现,因为所有的 http 请求都需要先进行 dns 查询,那么最简单方法就是劫持本地 dns 请求,解析请求的域名,放行某个程序的所有域名。具体做法是搭建一个 socket 服务器监听本地 53 端口,使用 dnslib 对 dns 查询进行解析获取请求的域名,根据白名单放行,放行就是指创建一个简单的 socket 对象(不需要绑定绑定端口),只要指定连接公共 dns 服务器就可以(223.5.5.5:53)。我说的这些实际上就是 dns 分流器或者是 adguard 这些广告拦截器的前置和最终处理,中间的逻辑不同所以其职能不同,希望能有助于你解决问题
    gamexg
        23
    gamexg  
       2023-10-28 02:12:24 +08:00
    既然是同一计算机,那么执行 netstats 检查来源端口是否是预期的程序完事.
    t133
        24
    t133  
       2023-10-28 05:58:27 +08:00 via iPhone
    同计算机为什么不用管道
    yankebupt
        25
    yankebupt  
       2023-10-28 07:07:25 +08:00
    首先限定监听的是 127.0.0.1 的 8000 而不是 0.0.0.0 的,然后对本机的 127.0.0.1 访问进行 app 限制……
    但因为是限制程序所以肯定不是防火墙了……
    但其实 python 也可以 shell /usr/bin/curl 的,光限制 requests 没用,还要加额外限制……
    很麻烦,不如加 Authencation (自制签名加密)或用管道(如楼上)
    kuaner
        26
    kuaner  
       2023-10-28 09:09:26 +08:00
    两个程序丢在一个容器里面
    lisxour
        27
    lisxour  
       2023-10-28 09:11:03 +08:00   ❤️ 2
    请把你原本遇到的问题发出来,而不是经自己想法加工过后的问题,你问的这个问题在现实中我就没想到能有啥场景对应,你是不是只想自己的程序能访问服务,其他程序不行?
    xuelang
        28
    xuelang  
       2023-10-28 09:20:06 +08:00
    -H "Authorization: Bearer $OPENAI_API_KEY" ?

    这种就是权限管理呀,只有带 key 的应该才给访问
    Jamy
        29
    Jamy  
       2023-10-28 10:20:28 +08:00
    如果你是 root 权限运行的,可以使用 netstat,
    ```
    netstat -antp | grep ${port} | grep ${remoteport}
    ```
    返回结果带有 pid 和进程名的, 可以根据 pid 去/proc/$pid/目录查询更详细的信息.
    fox0001
        30
    fox0001  
       2023-10-28 10:23:26 +08:00 via Android
    只能加认证,限制客户端
    listenerri
        31
    listenerri  
       2023-10-28 11:30:11 +08:00 via Android
    用 docker 把应用和服务放到一个容器里
    flyqie
        32
    flyqie  
       2023-10-28 12:36:43 +08:00 via Android
    感觉其实应该从 server 鉴权这边入手,而不是限制客户端。
    miyuki
        33
    miyuki  
       2023-10-28 12:49:55 +08:00 via iPhone
    本机的话 selinux 可以
    lesismal
        34
    lesismal  
       2023-10-28 15:40:44 +08:00
    服务器里查出允许的进程的 pid ,然后请求进来后用 netstat -tunp 查 remote addr 的端口是不是那个进程的 pid ,不是就不允许

    但如果是自己的服务器,自己人不能限制好自家的服务吗?是怕被外人入侵?
    adoal
        35
    adoal  
       2023-10-28 17:43:00 +08:00
    所以呢不要看各种所谓新手教程后连说的是啥都不知道就手把手照做“安装完 RHEL 及其克隆发行版后第一件事是关 SELinux”……
    realpg
        36
    realpg  
       2023-10-29 01:41:18 +08:00
    既然是 127.0.0.1 ,无脑 selinux 就行了
    realpg
        37
    realpg  
       2023-10-29 01:42:24 +08:00
    @adoal #35
    centos 以及 centos 衍生类的发行版服务器被入侵率超越所有其他发行版加起来的 300 倍以上,不是没有原因的
    dzdh
        38
    dzdh  
    OP
       2023-10-29 03:38:42 +08:00
    @realpg #37 求帖子
    realpg
        39
    realpg  
       2023-10-29 11:23:40 +08:00
    @dzdh #38
    你不用求帖子
    你可以就在 V2 上找小白搞了个云服务器被入侵的帖子
    100%是 centos 系的
    因为 redis mysql mongodb 的默认版本库内的版本都是无密码且监听 0.0.0.0 的

    安装 redis 在知名 vps ip 段,如果顶层没有这类病毒拦截,几乎是 90 秒内就会被植入恶意程序
    yestodayHadRain
        40
    yestodayHadRain  
       2023-10-29 16:34:11 +08:00
    @realpg redis 那种之所以被入侵是因为没设置密码并且开了外网端口,但是正常讲这种基本都是内网访问吧,只要不把端口暴露在公网就 ok 了
    jaylee4869
        41
    jaylee4869  
       2023-10-29 21:51:24 +08:00
    了解一下 JA3 ,应该就是你需要的。前提是基于 HTTPS ,因为要获取 ClientHello 。我在一篇文章中提到过,https://lawrenceli.me/blog/cloudflare#client-hello---ja3
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2659 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:23 · PVG 08:23 · LAX 16:23 · JFK 19:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.