实现内网穿透

本文介绍了两种内网穿透方案,分别是使用frp和nginx+ssh。详细阐述了frp的工作原理,配置步骤,包括服务端和客户端的设置,并提供了测试穿透成功的实例。此外,还提到了nginx+ssh的内网穿透实现方法,涉及公网服务器和本地服务器的配置。
需求:
  1. 让其他人访问到自己电脑上的网页或服务
  2. 其他场景,比如大家想要登录同一个人的电脑来一起写代码、找 Bug、排查问题等等。
怎样实现这些需求呢?------------ 内网穿透
   

一、内网穿透介绍

大多数情况下,个人电脑处于内网,即没有公开访问的独立IP(上网要通过其他网关),因此其他内网用户找不到你,没办法和你建立连接。
内网穿透的作用,就是将内网的电脑暴露到公共网络。可理解为一个中间人,由于他知道你的电脑地址,所以能帮助其他用户访问到你的计算机

  

二、方案1:frp实现内网穿透

2.1、frp介绍

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.
作用:
  • 利用处于防火墙后的机器,对外网环境提供 http 或 https 服务
  • 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口
  • 利用处于防火墙后的机器,对外网环境 提供 tcp 和 udp 服务 ,例如在家里通过 ssh 访问处于公司局部环境的主机。
frp工作原理
  • frp服务端(公网)运行,监听一个端口bind_port,等待客户端的连接
  • frp客户端(私网)连接到frp服务端的主端口bind_port,同时告诉frp服务端要监听的端口remote_port和转发类型type
  • frp服务端(公网)fork新的进程监听客户端指定的端口remote_port
  • 外网用户(浏览器)连接到frp客户端(私网)指定的端口remote_port,frp服务端通过和frp客户端的连接将数据转发到frp客户端(私网);
  • frp客户端(私网)进程再将数据转发到本地web服务,从而实现内网对外暴露服务的能力。

2.2、设备环境

想要配置frp穿透,首先必须先要有一台具有外网ip(即:可以外网访问)的服务器。
frp服务端:阿里云应用轻量服务器(公网) Ubuntu 60.205.222.199 
frp客户端1: 北京实验室服务器(内网)  Ubuntu 192.168.6.146 
frp客户端2: 南京实验室服务器(内网)  Ubuntu 192.168.11.123 

2.3、操作配置

有人访问阿里云服务器:https://阿里云服务器外网ip:8443
它的链路如下:阿里云服务器frp服务端—> 内网电脑frp客户端—> 192.168.6.146:443(web服务) 或者 192.168.11.123:22(ssh服务),然后按照原路返回

2.3.1:frp服务端配置

1、首先到frp的release界面下载适合自己电脑的程序Releases · fatedier/frp · GitHub 可以直接去这个页面下载
2、解压:tar -zxvf  frp_0.32.1_linux_amd64.tar.gz
3、进入cd到frp_0.32.1_linux_amd64目录,对于服务端的配置可以直接选择将frpc和frpc.ini文件删除,之后配置frps.ini
[common]
token = token      # 授权令牌,会在frp客户端用到
bind_port = 7000   # 与客户端绑定的进行通信的端口,默认7000

vhost_http_port = 80
vhost_https_port = 443

# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = user
dashboard_pwd = password
enable_prometheus = true

# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
subdomain_host = podding.cn  # 注册的域名
保存后就可以启动服务端了
# 前台启动
./frps -c ./frps.ini  
 
# 后台启动(正常使用后推荐后台启动)
nohup ./frps -c ./frps.ini &
必须先启动服务端frp,再启动客户端frp
此时,可以访问dashboard界面:http://公网IP:7500
    

2.3.2:frp客户端1配置

1、首先到frp的release界面下载适合自己电脑的程序Releases · fatedier/frp · GitHub 可以直接去这个页面下载
2、解压:tar -zxvf  frp_0.32.1_linux_amd64.tar.gz
3、进入cd到frp_0.32.1_linux_amd64目录,对于客户端的配置可以直接先将frps和frps.ini文件删除,之后配置frpc.ini
[common]
token = token         # 授权令牌
server_addr = 60.205.222.199  # 公网服务器ip
server_port = 7000    # 阿里云服务器frp服务端的bind_port端口,frp的客户端要去连接这个端口,从这里做代理

[podding_bj_web]
type = tcp            # 连接协议
local_ip = 127.0.0.1  # 内网服务器ip(192.168.6.146也行)
local_port = 443      # 内网web服务的端口
remote_port = 8443    # 自定义的frp服务端访问内部podding服务的端口号,需要在frp服务器的防火墙放开  
#custom_domains = podding.cn  # 绑定自定义域名

# 公网通过ssh访问内部服务器,北京那边服务器不需要这块
[ssh]
type = tcp               # 连接协议
local_ip = 192.168.6.146 # 内网服务器ip(127.0.0.1也行)
local_port = 22          # ssh默认端口号
remote_port = 7021       # 要映射到的frp服务器端口,用于访问内部ssh。如果 remote_port 为 0,frps 会为你分配一个随机端口
bandwidth_limit = 1MB    # 限制此代理的带宽,单位为 KB 和 MB
use_encryption = false   # 如果为 true,则 frps 和 frpc 之间的消息将被加密,有效防止流量被拦截,默认为 false
use_compression = false  # 若为true,消息会被压缩,加快流量转发速度,但是会额外消耗一些 CPU 资源。
​
保存后就可以启动客户端了
# 前台启动
./frpc -c ./frpc.ini  
 
# 后台启动(正常使用后推荐后台启动)
nohup ./frpc -c ./frpc.ini &
必须先启动服务端frp,再启动客户端frp
  

2.3.3、frp客户端2配置

配置frpc.ini
[common]
token = token         # 授权令牌
server_addr = 60.205.222.199  # 公网服务器ip
server_port = 7000    # 阿里云服务器frp服务端的bind_port端口,frp的客户端要去连接这个端口,从这里做代理

# 公网通过ssh访问内部服务器
[ssh]
type = tcp               # 连接协议
local_ip = 127.0.0.1     # 内网服务器ip
local_port = 22          # ssh默认端口号
remote_port = 7022       # 要映射到的frp服务器端口,用于访问内部ssh, remote port listen by frps。如果 remote_port 为 0,frps 会为你分配一个随机端口
bandwidth_limit = 1MB    # 限制此代理的带宽,单位为 KB 和 MB
use_encryption = false   # 如果为 true,则 frps 和 frpc 之间的消息将被加密,默认为 false
use_compression = false  # 若为true,消息会被压缩
将个人电脑的公钥添加到南京实验室服务器192.168.11.123的.ssh/authorized_keys,这样安全,内网登录时使用私钥:
保存后就可以启动客户端了
# 前台启动
./frpc -c ./frpc.ini  
 
# 后台启动(正常使用后推荐后台启动)
nohup ./frpc -c ./frpc.ini &
必须先启动服务端frp,再启动客户端frp

2.4:测试穿透是否配置成功:ssh远程连接南京内网服务器

找另外一台不同网段的linux或者mac电脑,在终端执行,因为这里只有个人电脑提供公钥给跳转机(南京机器192.168.11.123),在个人电脑cmd中执行:
ssh - p remote_port 内网主机用户名 @ 公网ip
 
# 举例
ssh -p 7022 nist@60.205.222.199   # 跳转机(南京机器192.168.11.123

一定要注意,输入密码的时候一定要输入内网中的密码,端口号用的frpc.ini文件中的remote_port。如果你登录成功,那么,恭喜你,你已经学会了利用frc怎么配置内网穿透了!!!
     

2.5:“https+域名” 访问 

此时,在frp服务端,可以使用curl -k https://127.0.0.1:8443访问北京那边的web服务。
若想浏览器使用 https://阿里云服务器外网ip:8443访问,你得在frp服务端( 阿里云服务器 )开放8443端口。
nginx配置使用 443端口+域名 访问:

结果:

    

三、方案2:nginx+ssh实现内网穿透

需要准备的环境:
  1. 自己本地运行起来的项目(这里以podding项目为例: https://192.168.11.45:443)
  2. 一台云服务器,阿里云,腾讯云等等,这里选择可以公网的跳转机60.205.222.199。
  3. 云服务器上安装nginx。
  4. 域名(可以没有)

3.1、公网服务器

1、进入到公网服务器60.205.222.199
2、配置nginx的配置文件
server {
  listen 8888; #这里监听的为后续访问的公网云服务器端口,可以设置为任意一个服务器上还不存在的端口号
  server_name xx.xx.cn; # 这里填你的域名,如果没有域名则填localhost
 
  location / {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
   
    proxy_pass http://localhost:8899;  # 这里的8899相当于一个标识,和后面在本地创建通道相关,可以任意设置一个值。防火墙得开放此端口
  }
}
3、重启nginx

3.2、在本地服务器操作

ssh -vnNT -R 服务器端口:localhost:本地端口 服务器用户名@服务器 IP 地址
  -N 表示非不执行命令,只做端口转发;-f 表示在后台运行-R 10022:localhost:22 就是把本地的22端口转发到远程的10022端口
1、在本地终端输入命令ssh -vnNt -R 8899:localhost:443 user@ip # 将本机的443端口映射到外网服务器的8899端口上
8899是nginx中配置的标识,443是本地web服务的访问端口, user为云服务器的用户名,ip为云服务器公网地址,回车输入云服务器密码就好了,
出现如下代表成功:
此时,在云服务器公网可以看到8899端口: netstat -antpul | grep 8899
2、打开本地浏览器,输入自己的云服务器公网ip(如果有域名也可通过域名来访问)和端口来进行访问,例如http://xx.xx.xx.xx:8888。
   

四、参考

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值