3年9个月前修改于 3年9个月前IP:云南
915513
30楼

这个方案实际使用存在比较多的问题:

  1. 使用了不受控的第三方转发服务,涉及流量出境和再入境,带宽和延迟都有明显的损失,可靠性存疑。

  2. 在路由器之外实际增加了一台物理服务器,但是却没有获得应有的性能。

  3. 使用了疑似存在后门的宝塔面板。

  4. 疑似明文传输HTTP,容易被劫持并且会被运营商发现。

  5. 服务器和内网其它设备没有隔离存在安全隐患。

更优雅的姿势:

既然需要额外的硬件就干脆组装一台软路由,不追求小包转发速率并且没有其它业务需要的话可以找到不少便宜的方案。安装VMWARE ESXI实现虚拟化(记得开启vt-x/vt-d):

esxi_main.jpg

下载OpenWRT的源码,选择上需要的组件和插件然后编译,记得修改overlay分区容量。Linux/OSX直接编译,Windows下可以用WSL2,没什么难度。之后把编译出来的镜像转换成ESXI可用的vmdk格式上传到ESXI。然后新建一个虚拟机作为路由器:

esxi_vrouter.jpg

将上传的vmdk作为硬盘添加给软路由的虚拟机,启动后在esxi中通过vi修改网络接口配置后接好内外网。

再新建一个虚拟机作为服务器:

esxi_vserver.jpg

上传系统镜像安装系统,并登录软路由给虚拟服务器分配固定IP,配置好防火墙。

DDNS服务可以部署在服务器上,偷懒的话放路由器上用luci插件,事先准备一个顶级域名然后将域名解析服务器指定到cloudflare之类提供ddns服务的服务商,然后新建一个二级域名用于ddns:

esxi_ddns1.jpg

如果运营商分配了ip v6并且没有抠到只给/64的话可以再添一条AAAA记录然后配置ipv6的DDNS:

ipv6.jpg

也可以利用dhcp v6给虚拟服务器分配单独的ip v6地址,不过国内的ipv6环境一言难尽。

理论上应当避免在路由器上部署太多服务,只需要在路由器上配置端口转发,web服务和acme服务都应当部署在虚拟服务器。不过为了省事也可以放在路由器上,一张泛域名证书路由器的web管理页面和其它服务也可以同时使用:

acme.jpg

这种方案下由路由器的nginx处理tls然后传给虚拟服务器,/conf.d/中添加一个conf:

server {
    listen 443 ssl; # listan 443用于内网访问
    listen [::]:443 ssl; # ipv6支持
    server_name  __; # 虚拟服务器的二级域名
    charset utf-8;
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:DHE+AESGCM:DHE:!RSA!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!CAMELLIA:!SEED";
    ssl_session_tickets off;

    ssl_certificate /etc/nginx/cert/xxx.com/xxx.com.crt;
    ssl_certificate_key /etc/nginx/cert/xxx.com/xxx.com.key;
    location /{
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass http://172.18.1.101; # 虚拟服务器的内网IP
    }
}
server {
    listen 8443 ssl; # 8443用于外网
    listen [::]:8443 ssl; # ipv6支持
    server_name  __; # 虚拟服务器的二级域名
    charset utf-8;
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:DHE+AESGCM:DHE:!RSA!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!CAMELLIA:!SEED";
    ssl_session_tickets off;

    ssl_certificate /etc/nginx/cert/xxx.com/xxx.com.crt;
    ssl_certificate_key /etc/nginx/cert/xxx.com/xxx.com.key;
    location /{
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_pass http://172.18.1.101; # 虚拟服务器的内网IP
    }
}

最后按需在虚拟服务器上部署需要的环境。由于只是个文件分享服务器,就装了samba和nginx。

同城同运营商5G下载20Mbps左右,大概是因为上行不太给力外加内网有电脑在上传:

download.jpg

优点:

单台物理设备满足所有需求

充分利用带宽(国内某些城市家宽上行给50mbps-100mbps,国外不少地方提供上下行对等的家宽)

具备扩展性,可以增加更多虚机用于内网git服务、本地remoteApp服务

缺点:

无法使用默认的https 443端口(国内运营商屏蔽,需要固定IP+备案才能开通)

需要公网ip v4,CGN大行其道的情况下有些地区和运营商完全不给/小企业商宽才给

家庭服务器方案只适合用户数量有限的场景,比如个人web文件分享、私有app后端,国内在家宽上上行tls流量跑多了容易被运营商盯上。正经的网络服务不建议使用这种方案,aws lightsail之类的低价云服务体验会好很多。

评论
14
文号 / 915513

万流景仰
名片发私信
学术分 8
总主题 412 帖总回复 4593 楼拥有证书:专家 老干部 学者 机友 笔友
注册于 2009/03/15 21:53:00最后登录 2026/01/31 04:21:35
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:0

个人简介

CV

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的