内网穿透实现原理及三种实现方式

📅 2025-07-02 13:45:29 ✍️ admin 👁️ 177 ❤️ 634
内网穿透实现原理及三种实现方式

1.操作系统

Deepin - 基于Linux的开源国产操作系统(软件生态好,缺点不够流畅)

官网 Ubuntu | 全球领先的用于个人电脑、平板及手机的操作系统

我使用的版本 Ubuntu乌班图-桌面办公基本不用想了,优点流畅

2.内网穿透原理

ngrok - 下载

1.核心思想

内网穿透的核心思想就是“映射”和“转发”,把内网设备的端口映射到公网设备的端口上,来进行流量转发。

简单地画一下示意图如上,基础设施由两个核心设备组成:

服务端:拥有公网IP的设备一台,即上图“公网服务器”,开放2个端口7000和6000,用于公网通信。 客户端:要访问的内网设备一台,即上图“内网家用电脑”,开放实际应用服务所需的端口(比如ssh服务,默认22端口),并将配置的公网映射端口6000告知服务端。所以服务端开放的那个端口6000实际上是客户端告诉它的。 (以上端口除22以外均为自定义端口,无特 殊含义。)

2.内网穿透原理和常用方法

既然内网主机不能直接访问,那就在公网弄个服务器。

因为内网主机可以访问公网主机,然后将内网主机和公网主机进行连接,并且保持连接。

如果公网主机接收到的请求,通过链接转发给内网主机即可。

将内网服务进行公网映射,服务通常从端口提供服务,例如:

ssh服务,端口好似22

web服务,端口是80和443

远程桌面服务,端口是3389,win专业版支持远程桌面

redis服务,端口是6379

jellyfin视频站,端口是8096

我的世界 游戏服务,端口是25565

参考文献:(15条消息) 内网穿透原理和实现思路介绍_布啦豆的博客-CSDN博客_内网穿透原理

3.使用ngrok-ittun穿透部署

解压 并复制文件到/usr/local/bin目录下

sudo tar xvzf ~/Downloads/ngrok-v3-stable-linux-amd64.tgz -C /usr/local/bin

1. 安装ngrok

curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | sudo tee /etc/apt/sources.list.d/ngrok.list && sudo apt update && sudo apt install ngrok

snap install ngrok

若提示 snap不是可执行的命令,则先安装snap

sudo apt update sudo apt install -y snapd

登录 https://dashboard.ngrok.com/ 注册一个账户,获取你的token。 注意:验证码是谷歌的服务不开vpn出不来。

账号注册成功后你会收到一份邮件,点击邮件中的链接验证身份。(必须,否侧ngrok不给你代理)

添加你的token ngrok config add-authtoken

2.开通一个端口通道

开通http端口通道,映射本机80端口(用于web网络服务) ngrok http 80

打开 22 端口TCP转发,并指定公网服务器地区(用于ssh连接) ngrok tcp 22 --log=stdout > "$HOME/ngrok.log" --region ap &

其中 region 的 ap 代表 ngrok 新加坡节点,访问速度相比美国节点会快一些。访问 https://ngrok.com/docs#config-options 可以查看支持的所有区域。

不指定地区默认是jp日本。同一账号下,同一地区只能有一个会话。(开启订阅无限制)

4.使用sunny-ngrok穿透

准备: 先去官网注册账号,2块钱完成实名认证。官网

开通你需要的隧道规格服务。

完成后,在这个页面会出现你开通的隧道。拿到你的隧道ID

1.下载对应版本的客户端

Sunny-Ngrok内网转发

sudo mv sunny /usr/local/bin/sunny

sudo chmod +x /usr/local/bin/sunny

2.启动隧道

Mac、Linux、树莓派的使用方式是一样的。Windows才会不一样。但是它们的启动方式都是通过隧道id启动,隧道id可以在隧道管理的列表里面获得。这里以映射http服务为例。

./sunny clientid 隧道id

启动多个隧道

./sunny clientid 隧道id,隧道id

要想后台运行可以使用 setsid 命令(会话断开不会杀死隧道进程)

setsid ./sunny clientid 隧道id &

3.开机自启

编写启动脚本

sudo vim /etc/init.d/sunny

#!/bin/sh -e

### BEGIN INIT INFO

# Provides: ngrok.cc

# Required-Start: $network $remote_fs $local_fs

# Required-Stop: $network $remote_fs $local_fs

# Default-Start: 2 3 4 5

# Default-Stop: 0 1 6

# Short-Description: autostartup of ngrok for Linux

### END INIT INFO

NAME=sunny

DAEMON=/usr/local/bin/$NAME

PIDFILE=/var/run/$NAME.pid

[ -x "$DAEMON" ] || exit 0

case "$1" in

start)

if [ -f $PIDFILE ]; then

echo "$NAME already running..."

echo -e "\033[1;35mStart Fail\033[0m"

else

echo "Starting $NAME..."

start-stop-daemon -S -p $PIDFILE -m -b -o -q -x $DAEMON -- clientid 隧道id || return 2

echo -e "\033[1;32mStart Success\033[0m"

fi

;;

stop)

echo "Stoping $NAME..."

start-stop-daemon -K -p $PIDFILE -s TERM -o -q || return 2

rm -rf $PIDFILE

echo -e "\033[1;32mStop Success\033[0m"

;;

restart)

$0 stop && sleep 2 && $0 start

;;

*)

echo "Usage: $0 {start|stop|restart}"

exit 1

;;

esac

exit 0

把代码里面的【隧道id】替换成自己的隧道id

sudo chmod 755 /etc/init.d/sunny

sudo /etc/init.d/sunny start

sudo /etc/init.d/sunny start #启动

sudo /etc/init.d/sunny stop #停止

sudo /etc/init.d/sunny restart #重启

Ubuntu、树莓派、Debian系列的系统

cd /etc/init.d

sudo update-rc.d sunny defaults 90 #加入开机启动

sudo update-rc.d -f sunny remove #取消开机启动

5.使用公网IP服务器,搭建frp内网穿透环境。

1.服务端

1.下载frp库:

建议去官网,之前在别人博客下的发现有挖矿病毒!

2.解压frp压缩包

tar -zxvf frp_0.33.0_linux_amd64.tar.gz

3.进入解压目录

cd frp_0.33.0_linux_amd64/

4.修改配置文件

vi frps.ini

配置文件内容

[common]

# frp监听的端口,默认是7000,可以改成其他的

bind_port = 7000

# 授权码,请改成更复杂的

token = 52010 # 这个token之后在客户端会用到

# frp管理后台端口,请按自己需求更改

dashboard_port = 7500

# frp管理后台用户名和密码,请改成自己的

dashboard_user = admin

dashboard_pwd = admin

enable_prometheus = true

# frp日志配置

log_file = /var/log/frps.log

log_level = info

log_max_days = 3

5.设置启动frp服务

注册服务加入开机自启

sudo mkdir -p /etc/frp

sudo cp frps.ini /etc/frp

sudo cp frps /usr/bin

sudo cp systemd/frps.service /usr/lib/systemd/system/

sudo systemctl enable frps

sudo systemctl start frps

6.防火墙开放

ufw allow 7000

ufw allow 7500

7000和7500两个端口分别对应frps.ini配置中的bind_port和dashboard_port

7. 验证服务端是否启动成功

访问:http://服务器IP:后台管理端口” ,输入用户名和密码可以查看连接状态 如:1.117.90.135:7500/,用户名和密码分别对应frps.ini文件中的dashboard_user和dashboard_pwd

如果上述步骤没有问题,则说明frp的服务端配置成功了,也就意味着内网穿透你已经成功了一半.

2.客户端

1.进入解压目录

cd frp_0.33.0_linux_amd64/

2.修改配置文件

vi frpc.ini (注意哦,不是frps.ini)

配置文件内容

# 客户端配置

[common]

server_addr = 服务器ip

# 与frps.ini的bind_port一致

server_port = 7000

# 与frps.ini的token一致

token = 52010

# 配置ssh服务

[ssh]

type = tcp

local_ip = 127.0.0.1

local_port = 22

# 这个自定义,之后再ssh连接的时候要用

remote_port = 6000

# 配置http服务,可用于小程序开发、远程调试等,如果没有可以不写下面的

[web]

type = http

local_ip = 127.0.0.1

local_port = 8080

# web域名

subdomain = test.hijk.pw

# 自定义的远程服务器端口,例如8080

remote_port = 8080

3.防火墙开放

ufw allow 7000

ufw allow 7500

4.客户端开机自启

sudo mkdir -p /etc/frp

sudo cp frpc.ini /etc/frp

sudo cp frpc /usr/bin

sudo cp systemd/frpc.service /usr/lib/systemd/system/

sudo systemctl enable frpc

sudo systemctl start frpc

5. 测试穿透是否配置成功

ssh 用户名@服务端ip -p 端口号 如果请求成功,那么恭喜你成功内网穿透!

3.参考文献

(9条消息) 使用frp配置内网访问(穿透)教程(超详细,简单)_*Lisen的博客-CSDN博客_frp