V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
css3
V2EX  ›  问与答

没有公网的服务器上的 web 服务如何通过有公网的服务器来访问?

  •  
  •   css3 · 2022-10-14 11:08:00 +08:00 · 2016 次点击
    这是一个创建于 772 天前的主题,其中的信息可能已经有所发展或是发生改变。

    web 服务部署在 A 服务器上,A 能连外网,但自身没公网, B 服务器有公网,可用公网通过 ssh 进入,B 网络的路由器可以配置端口转发功能, 目前通过 autossh ,可以直接在 B 内 ssh 进入 A , 目前在 A 上部署了个 web , 原以为也可以通过 autossh 的方式在 A 上面将端口转发到 B ,再通过公网,通过转发出来的端口访问,但刚进行了尝试访问不了。有没有解决方案呢,最好不借助工具了,不知道有没有方案

    第 1 条附言  ·  2022-10-17 09:57:17 +08:00
    还是通过 ssh 实现了
    ssh -NfR 0.0.0.0:remote_port:localhost:web_port 公网服务器
    ssh -NfL 公网:port:127.0.0.1:remote_port 公网
    29 条回复    2022-10-24 21:58:38 +08:00
    InDom
        1
    InDom  
       2022-10-14 11:13:57 +08:00
    Google: iptables 端口转
    InDom
        2
    InDom  
       2022-10-14 11:14:05 +08:00
    端口转发
    xdzhang
        3
    xdzhang  
       2022-10-14 11:15:04 +08:00
    直接反代嘛
    css3
        4
    css3  
    OP
       2022-10-14 11:15:18 +08:00
    目前是这样的:
    ssh -R 0.0.0.0:5003:localhost:5002 -p internet_server
    5003 通过路由配置转发到公网了
    css3
        5
    css3  
    OP
       2022-10-14 11:18:41 +08:00
    bushiren
        6
    bushiren  
       2022-10-14 11:25:50 +08:00
    那就 frp 穿透试试看了,再不然就试试 蛤蟆吃
    longbow0
        7
    longbow0  
       2022-10-14 11:57:19 +08:00
    zerotier 也可以
    LLaMA2
        8
    LLaMA2  
       2022-10-14 11:58:04 +08:00
    要什么工具?直接 B 机器上 nginx ,nginx 转发到 A 机器,你的 B 机器可以访问 A 机器的。这一切都是流畅的!
    要不,我学 ssh 哥的回复:

    开 ssh ,我来!
    wu00
        9
    wu00  
       2022-10-14 11:59:38 +08:00
    既然是 web 服务,最简单的应该是反向代理吧。
    A 提供 web 服务,B 可通过内网访问 web 服务
    B 安装 nginx 将指定请求转发到 A

    另外云服务器一般都有提供 nat 网关来干这个事情,nat+弹性公网 ip 多服务器共享带宽出入
    css3
        10
    css3  
    OP
       2022-10-14 12:11:21 +08:00
    @wu00
    @ye4tar
    A 没有公网,B 的 nginx 转发到 A , 这个操作具体要在 B 的 nginx 配置 A 的啥值?
    wu00
        11
    wu00  
       2022-10-14 12:17:42 +08:00
    A 机器的 web 服务地址,比如 http://192.168.1.2:5002
    liuzhaowei55
        12
    liuzhaowei55  
       2022-10-14 12:21:37 +08:00 via iPhone
    A 不用做什么,B nginx 反代到 A 的 ip 端口即可
    LLaMA2
        13
    LLaMA2  
       2022-10-14 12:36:35 +08:00
    B 机器的 nginx conf.d 中 xxxx.conf 配置

    server {
    listen 80;
    listen [::]:80;
    server_name _;
    root /data/web/;

    location /api/ {
    proxy_pass http://192.168.1.200:3000/; // A 机器 web 服务
    }
    }
    gesse
        14
    gesse  
       2022-10-14 13:24:47 +08:00
    ssh 不知道性能怎么样,要不用 gost 试试?
    https://gost.run/tutorials/port-forwarding/#_4
    titanium98118
        15
    titanium98118  
       2022-10-14 13:38:15 +08:00
    13 楼的方法就可以
    jidesheng
        16
    jidesheng  
       2022-10-14 16:43:07 +08:00
    那就是 13 楼提到的反代服务器,只要你的 B 服务器能访问 A 服务器的 web 资源,你只需要在 B 上面架设一个 Nginx ,通过 proxypass 访问 A 服务器的 web 服务就可以了,如果有别的需求,就 zerotier 或者 tailscale 进行组网
    alie99400
        17
    alie99400  
       2022-10-14 17:23:15 +08:00
    B 机:
    iptables -t nat -A PREROUTING --dst B 机 IP -p tcp --dport B 端口 -j DNAT --to-destination A 机 IP:端口
    iptables -t nat -A POSTROUTING --dst A 机 IP -p tcp --dport 6666 -j SNAT --to-source B 机 IP
    css3
        18
    css3  
    OP
       2022-10-14 23:03:19 +08:00
    @ye4tar 按你这个配置了,没有用,A 的 web http://172.9.52.1:5002 在 A 上 curl 命令是可访问的,然后通过以下 nginx 配置转到 B 的 5003 , 在 B 上 curl IP:5003 curl: (7) Failed to connect to x.x.x.x port 5003: Connection refused
    server {
    listen 5003;
    listen [::]:5003;
    server_name _;
    root /data/web/;

    location /api/ {
    proxy_pass http://172.9.52.1:5002/;
    }
    }
    ~
    而且我也完全不能理解,proxy_passproxy_pass http://172.9.52.1:5002/;,A 的 IP 对于 B 来说,是不通的啊, 这里配了 A 的 IP 有啥用啊
    chinni
        19
    chinni  
       2022-10-14 23:57:16 +08:00
    cloudflared
    datocp
        20
    datocp  
       2022-10-15 00:29:24 +08:00 via Android
    最早时用 socat 反向连接

    上次测试时用 softether 建立反向连接,用 haproxy 解决该客 ip 记录。
    LLaMA2
        21
    LLaMA2  
       2022-10-15 10:34:08 +08:00
    @css3 location 中加了 /api/
    你访问的时候就是 IP:5003/api
    LLaMA2
        22
    LLaMA2  
       2022-10-15 10:37:23 +08:00
    @css3 你帖子中说 「可以直接在 B 内 ssh 进入 A 」足以说明 B 可以访问到 A ,你说的不通,是 web 不能访问嘛,web 访问不通你得看你的 A 上监听的端口、防火墙以及监听在的网络!
    css3
        23
    css3  
    OP
       2022-10-15 14:55:44 +08:00 via iPhone
    @ye4tar 直接在 B 内 ssh 进入 A ,是因为开了 autossh 做了端口转发啊
    LLaMA2
        24
    LLaMA2  
       2022-10-15 17:27:20 +08:00
    @css3 开 ssh ,我来
    css3
        25
    css3  
    OP
       2022-10-17 09:58:04 +08:00
    @ye4tar
    nginx 没有我没有尝试通过, 还是通过 ssh 实现了
    ssh -NfR 0.0.0.0:remote_port:localhost:web_port 公网服务器
    ssh -NfL 公网服务器:port:127.0.0.1:remote_port 公网服务器
    gumupaier
        26
    gumupaier  
       2022-10-18 15:57:13 +08:00
    frp
    MoonWalker
        27
    MoonWalker  
       2022-10-21 13:32:56 +08:00
    @css3 请问下第二句怎么理解
    MoonWalker
        28
    MoonWalker  
       2022-10-21 13:33:40 +08:00
    @css3 ssh -NfL 公网服务器:port:127.0.0.1:remote_port 公网服务器
    css3
        29
    css3  
    OP
       2022-10-24 21:58:38 +08:00 via iPhone
    @MoonWalker 公网服务器指的公网 IP 地址啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   925 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:59 · PVG 03:59 · LAX 11:59 · JFK 14:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.