V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
acbot
V2EX  ›  NGINX

Nginx 与源主机通讯相关问题!

  •  
  •   acbot · 2022-08-04 15:56:42 +08:00 · 5098 次点击
    这是一个创建于 840 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近一直在琢磨 Nginx 与上游源服务器之前通讯及其安全的问题,想要实现的目标就是:第一,就是仅仅是授权的 nginx 才能做源服务器的代理。 第二,nginx 与源服务器之前通讯最好能实现加密传输,明文的 HTTP 协议容易被截取,密文的 HTTPS 特征也太明显容易被拦截。基于这些需求衍生除了下面的几个问题,望各位大佬解疑

    stream { upstream bj { server bj.abc.com:8080; } server { listen 80; proxy_pass bj; } }

    http { upstream bj { server bj.abc.com:8080; } server { listen 80; location / { proxy_pass http://bj; } } }

    1. stream 和 http 都可以实现 HTTP 反向代理,那么这两种方式与上游源主机通讯的时候使用什么协议呢?是 TCP/UDP 还是是 HTTP 协议呢,或者说 stream 是使用 TCP ,http 使用的就是 http ?

    2. 如果上游的源服务器有证书双认证,nginx 能实现反向代理吗,就是 upstream 能配置客户端证书吗? nginx 与下游客户端双认证可有可无。

    3. nginx 与上游源服务器通讯出了 http 模块使用 https 这种模式实现加密,那么还有其他什么方案吗?

    4. 除开配置系统级代理之外 stream 和 http 的 upstream 这里可以单独配置代理吗,比如 sockes/sockes5 等代理协议与上游服务器联系!

    15 条回复    2022-08-05 14:02:17 +08:00
    Judoon
        1
    Judoon  
       2022-08-04 18:12:36 +08:00
    1 、stream 就是 4 层,http 就是 7 层,接收和转发都是
    2 、http 模块可以直接配置 proxy_ssl_certificate 等
    3 、只有 tls/ssl ,其他加密可能要自己实现模块
    4 、我觉得没有意义,你可以直接把你的中间代理配到 upstream 上(如果我没理解错你的意思的话)
    y830CAa5nink4rUQ
        2
    y830CAa5nink4rUQ  
       2022-08-04 18:30:52 +08:00
    我理解你的情况大概是这样:

    1. 要求加密并且不让嗅探者知道是什么协议
    2. 并发不高的话

    那么我给个很简单好用的方案: 使用 brook 做隧道。

    大概是这样:
    上游服务器运行一个 brook server
    nginx 服务器运行一个 brook client

    数据流:

    下游客户端 <---http/https 协议---> nginx <--- TCP 协议 ---> brook client <--- brook 专有协议 ---> brook server <--- http/https 协议 --->上游服务器
    Aloento
        3
    Aloento  
       2022-08-04 18:31:10 +08:00
    我觉得 https 挺好的,已经很安全了,我自己的环境虽然用的是 socket 但是双方都有 TLS 加密
    http 传输层就是 TCP 啊... 感觉你问这个问题意义不大
    acbot
        4
    acbot  
    OP
       2022-08-04 19:27:32 +08:00
    @Judoon

    1. 意思就是这么接的就这么转,是不?
    4. 意思就是说我直接用代理做 upstream ,如果是这样的话那就是我理解才局限了。以为上游只能是 HTTP 服务器。
    acbot
        5
    acbot  
    OP
       2022-08-04 19:30:22 +08:00
    @DrX “要求加密并且不让嗅探者知道是什么协议” 对,就是这个意思,并且是不想让未授权的 IP 能直接访问源,只能访问 nginx 。
    acbot
        6
    acbot  
    OP
       2022-08-04 19:34:52 +08:00
    @Aloento 如果 nginx 和源之间仅仅用 https 这种加密,第一 他不能鉴权(不开启证书双向认证的话) 第二 这个是常规协议,那么加密后虽然中间方不能解密但是可以通过 HTTPS 特征做拦截,这样通讯就无法完成了。
    y830CAa5nink4rUQ
        7
    y830CAa5nink4rUQ  
       2022-08-04 19:34:58 +08:00
    @acbot 你可以试试我的方案,源服务器不暴露任何公开端口,brook server 和 brook client 密码一致才能连上,保证其他人无法连接。
    acbot
        8
    acbot  
    OP
       2022-08-04 19:36:26 +08:00
    @DrX 好的,谢谢!
    ik
        9
    ik  
       2022-08-04 19:53:32 +08:00 via iPhone
    4. nginx 不能直接实现, 但是可以配合其他软件来实现, 例如下面这个 gost(我徒手打的,不确定对不对),就是端口转发+前置代理,将 socks 服务上的 443 ,转发到本地 8443 端口, 源端口都没有直接暴露到公网上。

    gost -L tcp://127.0.0.1:8443/127.0.0.1:443 -F socks5://user:pass@xxxxx
    ik
        10
    ik  
       2022-08-04 19:58:54 +08:00 via iPhone
    另外源 nginx 上加上 basic 认证,或者 allow ip 是不是也可以解决
    acbot
        11
    acbot  
    OP
       2022-08-04 20:17:50 +08:00
    @ik “basic 认证 + allow ip” 这种也算一是个折中思路,但是分开用估计就有问题了。
    ik
        12
    ik  
       2022-08-04 20:42:12 +08:00 via iPhone
    @acbot 嗯 可以试试 #2 #9
    westoy
        13
    westoy  
       2022-08-04 20:46:04 +08:00
    你那些机器之间组个 VPN 不就行了么......
    acbot
        14
    acbot  
    OP
       2022-08-04 21:00:49 +08:00
    @westoy 如果 nginx 本身就能实现需求不是更好,管理起来方便。VPN 这种应该就是最后的手段了,并且又要附带很多东西。
    jiulang
        15
    jiulang  
       2022-08-05 14:02:17 +08:00
    给 nginx 写插件吧,只能这样才能为所欲为。话说插件我也不会写,让我来做的话,我就用 yarp
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3270 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:07 · PVG 20:07 · LAX 04:07 · JFK 07:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.