内网运行着一个服务,需要提供给外部用户临时访问,但是我们服务运行在内网某一个机器上的,并没有公网IP和端口。

那么就需要把这个内网机器上的IP和端口映射转换成公网的。

常用的操作无非这么几种:

  1. 拨号上网的,一般都会分配一个公网IP,那就可以在路由器上把内网IP的某个端口映射成路由器的端口。这就可以通过 路由器公网IP+端口 访问到内网机器。这种方式最大弊端就是拨号网络IP会经常变动
  2. 外部用户所在局域网服务所在的的局域网之间,购买专线。费用有点小贵,而且有设备要求
  3. 企业宽带有固定公网IP,就可以搭建一个VPN服务,由外部用户登录VPN来访问内网服务

不管哪种方案,其实要求可以归纳为这么几点:

  1. 用户端:
    1. 有稳定的访问地址
    2. 能正常访问局域网里的服务
  2. 局域网端
    1. 能提供公网访问的地址

经过一番折腾,总结了一个相对成本较小的方案

VPS 端运行 Frps(frp server),内网 PC 运行 Frpc 和代理软件,内网PC一般来说是 PC 机、公司的 VM 等

这样VPS和内网 PC 组成了 Peer

以上这种方案的网络情况如下:

整体的网络带宽 = min(VPS带宽、局域网拨号带宽)

整体的网络稳定性 = min(VPS网络稳定性、局域网拨号网络稳定性)

整体的网络耗时 = sum(VPS网络稳定性、局域网拨号网络稳定性)

安装Frp

文档在这里:英文文档中文文档

Frp分两部分, 在 VPS 上安装 Frps, 在内网 PC 上安装Frpc

release 里找到自己喜欢的版本和适合内网 PC 系统的包,下载到本地。里面包含了Frps和Frpc
img.png

在 VPS 上安装 Frps

  1. 编辑frps.ini文件,以下是示例,更多可以查看 frps_full.ini , 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [common]
    bind_port = 17000
    # Specify a UDP port for KCP.
    kcp_bind_port = 17000
    bind_udp_port = 17001
    # 有条件的可以设置成80(VPS在大陆的话,需要备案)
    vhost_http_port = 19998
    # 有条件的可以设置成443(VPS在大陆的话,需要备案)
    vhost_https_port = 19999

    dashboard_port = 17500
    # dashboard's username and password are both optional
    dashboard_user = hoha
    dashboard_pwd = pds3uxxxxNIdZ8Dj1

    allow_ports = 10000-40000

    authentication_method = token
    token = 4y33rGvxxxx8Xs85H
  2. 上传文件。可以直接上传到对应位置,也可以上传到某个目录,然后创建软链。个人更喜欢第二种
本地文件 上传后在VPS的文件
frps /usr/bin/frps
frps.ini /etc/frp/frps.ini
systemd/frps.service /lib/systemd/system/frps.service
  1. 系统服务重新加载 sudo systemctl daemon-reload ,开机启动 sudo systemctl enable frps.service
  2. 启动Frps sudo systemctl start frps.service,查看状态 sudo systemctl status frps.service

在 内网PC 上安装 Frpc

  1. 编辑frpc.ini文件,以下是示例,更多可以查看 frpc_full.ini , 示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [common]
    # vps 公网ip
    server_addr = mydomain.com
    # 与 frps.ini 保持一致
    server_port = 17000
    authentication_method = token
    token = 4y33rGvxxxx8Xs85H

    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 10022

    [trojan-web]
    type = http
    local_port = 80
    # 自己的域名或者IP
    custom_domains = mydomain.com

    [trojan-https]
    type = https
    local_ip = 127.0.0.1
    local_port = 443
    # 自己的域名或者IP
    custom_domains = mydomain.com
  2. 上传文件。可以直接上传到对应位置,也可以上传到某个目录,然后创建软链。个人更喜欢第二种
本地文件 上传后在VPS的文件
frpc /usr/bin/frpc
frpc.ini /etc/frp/frpc.ini
systemd/frpc.service /lib/systemd/system/frpc.service
  1. 系统服务重新加载 sudo systemctl daemon-reload ,开机启动 sudo systemctl enable frpc.service
  2. 启动Frpc sudo systemctl start frpc.service,查看状态 sudo systemctl status frpc.service

以上Frp就安装完成了,可以尝试验证了。刚刚配置了把本地的 22 端口映射成 VPS 的 10022

1
ssh root@{vps的公网IP} -p10022

如果提示输入密码,我们就穿透成功了

安装Trojan

Frp解决了把局域网的端口暴露成VPS公网端口,那么如果我们在局域网安装一个 Trojan,只要把 Trojan 的端口通过 Frp 暴露出去,那么 Trojan 就可以被公网访问了

我找到一个安装相对方便,支持 web 管理用户的封装。Trojan

安装大致步骤:

  1. 安装docker
  2. 安装mysql,可以直接用 docker 运行 mysql
    1
    docker run --name trojan-mariadb --restart=always -p 3306:3306 -v /data/trojan/data/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=trojan -e MYSQL_ROOT_HOST=% -e MYSQL_DATABASE=trojan -d mariadb:10.2
  3. 安装 trojan 和管理web。注意:这里我挂载了一个目录
    1
    docker run -it -d --name trojan --net=host --restart=always --privileged -v /data/trojan/cert:/data/cert jrohy/trojan init
    还是直接看官方说明吧。我太懒了😂
    img.png
  4. 配置trojan。大部分操作都可以按照默认的来。但是我们是局域网安装的,证书是不能自动生成的,所以需要配置证书位置。刚刚在启动docker镜像时,已经挂载了目录,所以把证书文件放在挂载目录就行

证书免费申请:DNSPOD上申请免费证书

看看效果吧

img_1.png
img_2.png
img_3.png
img_4.png