V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
通过以下 Referral 链接购买 DigitalOcean 主机,你将可以帮助 V2EX 持续发展
DigitalOcean - SSD Cloud Servers
lulas
V2EX  ›  VPS

用一台闲置小鸡,搭个私有版 ngrok(sish 内网穿透实战)

  •  
  •   lulas · 13 小时 52 分钟前 · 178 次点击

    手里正好有一台 VMRack 的闲置 小鸡,性能一般但胜在公网 IP 稳定。与其吃灰,不如拿来干点实事,于是折腾了一套 基于 sish 的私有内网穿透服务,效果比预期好不少。

    简单说一句结论: 够轻、够稳、够省事,个人或小团队完全够用。

    sish 是一个开源的反向隧道项目,功能上和 ngrok 类似,但部署在自己服务器上,完全可控。

    为什么选 sish ? 用下来有几个点比较打动我:

    客户端零安装:只要有 SSH ,任何系统都能用 服务端自动申请 HTTPS 证书:直接走 Let’s Encrypt 支持泛域名:每个服务一个子域名,很清爽 资源占用极低:小鸡也能跑 安全可控:公钥白名单,谁能用你说了算 一句话总结:

    非商业场景下,这是我目前最顺手的内网穿透方案。

    :zero: 前置条件 在开始前,你需要准备:

    一台 有公网 IP 的 Linux VPS (本文使用的是 VMRack 云服务,其他商家同理) 一个域名(强烈建议托管在 Cloudflare ) 本地机器已配置 SSH key :one: Cloudflare 侧的 DNS 设置 在 Cloudflare 面板新增一条解析:

    Name:*(泛解析) Content:你的 VPS 公网 IP Proxy status:DNS only (灰云) :warning: 这里一定不要开小黄云,否则证书和回源都会出问题。

    如果你习惯分开用,也可以单独加一条:

    ssh.your-domain.xyz → VPS_IP :two: 调整 VPS 默认 SSH 端口(很关键) 为了让 sish 直接监听 22 端口,必须先把系统自带的 SSH 挪走,否则会冲突。

    编辑配置文件:

    vim /etc/ssh/sshd_config 修改为类似这样:

    Port 10000 #Port 22 重启 SSH 服务:

    systemctl restart sshd :warning: 注意事项:

    之后登录 VPS 记得带 -p 10000 防火墙提前放行:10000 / 80 / 443 :three: 安装 sish 并准备运行环境 这一步主要是做三件事: 建用户 → 下程序 → 准备密钥

    直接按顺序执行即可。

    创建系统用户

    useradd --system --home /opt/sish --shell /usr/sbin/nologin sish || true mkdir -p /opt/sish/{ssl,keys,pubkeys,templates} chown -R sish:sish /opt/sish 下载并安装 sish (二进制版,amd64 ):

    cd /tmp wget https://github.com/antoniomika/sish/releases/download/v2.20.0/sish-2.20.0.linux-amd64.tar.gz tar -xvf sish-2.20.0.linux-amd64.tar.gz install -m 0755 sish-2.20.0.linux-amd64/sish /usr/local/bin/sish 拉取默认模板:

    git clone --depth 1 https://github.com/antoniomika/sish.git /tmp/sish-src cp -r /tmp/sish-src/templates /opt/sish/ chown -R sish:sish /opt/sish/templates 生成服务端 SSH Host Key:

    sudo -u sish ssh-keygen -t ed25519 -N "" -f /opt/sish/keys/ssh_host_ed25519_key rm /opt/sish/keys/ssh_host_ed25519_key.pub :four: 启用公钥鉴权(防止被白嫖) sish 默认支持 SSH 公钥白名单,这一点非常加分。

    在你本地电脑上查看自己的公钥:

    cat ~/.ssh/id_ed25519.pub 然后在 VPS 上写入:

    echo "你的公钥内容" > /opt/sish/pubkeys/me.pub chown sish:sish /opt/sish/pubkeys/me.pub 之后,只有这个 key 才能建立隧道连接。

    :five: 配置 systemd 服务(核心) 创建服务文件:

    vim /etc/systemd/system/sish.service 注意替换你自己的域名和邮箱:

    [Unit] Description=sish tunnel server After=network-online.target

    [Service] User=sish Group=sish WorkingDirectory=/opt/sish

    AmbientCapabilities=CAP_NET_BIND_SERVICE CapabilityBoundingSet=CAP_NET_BIND_SERVICE NoNewPrivileges=true

    ExecStart=/usr/local/bin/sish
    --ssh-address=:22
    --http-address=:80
    --https-address=:443
    --domain=your-domain.xyz
    --authentication=true
    --authentication-keys-directory=/opt/sish/pubkeys
    --private-keys-directory=/opt/sish/keys
    --https
    --https-certificate-directory=/opt/sish/ssl
    --https-ondemand-certificate
    --https-ondemand-certificate-accept-terms
    --https-ondemand-certificate-email=your-email
    --bind-random-subdomains=false
    --force-requested-subdomains=true

    Restart=always RestartSec=2 LimitNOFILE=1048576

    [Install] WantedBy=multi-user.target 启动并检查状态:

    systemctl daemon-reload systemctl enable --now sish systemctl status sish :six: 实际使用(真的只要一行) 假设你本地有个 Web 服务跑在 8080 ,想映射到公网:

    ssh -R dev:80:127.0.0.1:8080 ssh.your-domain.xyz 成功后可直接访问:

    https://dev.your-domain.xyz http://dev.your-domain.xyz 首次 HTTPS 访问稍慢是正常的,sish 会自动去申请证书。

    一些使用中的坑与提醒 HTTPS 首次访问 ≈ 等证书,不是卡死 Cloudflare 必须灰云 公钥没放进 /opt/sish/pubkeys/ 一定连不上 VMRack 这类小鸡跑 sish 非常合适,CPU 和内存几乎没压力 总结一句 如果你手里也有一台 VMRack 或其他闲置 VPS , 不想再折腾花里胡哨的客户端, sish 是一个非常干净、实用、长期可用的内网穿透方案。

    后续我也准备用它挂开发环境、Webhook 、临时服务,比公网开端口舒服多了。

    目前尚无回复
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1408 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:44 · PVG 00:44 · LAX 08:44 · JFK 11:44
    ♥ Do have faith in what you're doing.