内网穿透frp
这里说的内网穿透
,是指内网内有一个服务要暴露到公网上去。
内网是内部的局域网,比如家庭网络,公司网络。以家庭网络为例,运营商提供公网接入后,家庭内部的多个电脑或设备组成的内部的网络,他们都可以上网,但内部服务无法暴露到公网上。
如果运营商提供了公网IP
的话,可以通过路由器上端口映射的功能,能够比较简单的将内网里的服务/端口映射到外网IP上去。如果运营商提供的光猫或路由器没有端口映射功能,需要将其设置为桥接模式,自己买路由器来接入上网并实现端口映射。
总之,上面是比较麻烦的。
还有一种方式,那就是用比较软件的方式来实现,使用frp。
这种方式的条件有:
- frp软件
- 有一个公网机器和公网IP,这个比较简单,华为云上弄一个ECS和EIP就可以了
先去github下载release版本。这里的示例是,以家庭网络为例,
比如家里有一台设备,是ARM设备,叫做B,需要外网能够访问的到它上面的服务,比如SSH服务吧。
而外网机器是ECS,叫A。
原理图是这样的,图中展示的有多个内网服务端口,例子里我们只暴露一个端口
在A上的设置非常简单,设置frs内部的通讯端口7000,frs作为服务端启动
[root@ecs-d589 frp_0.44.0_linux_amd64]# cat frps.ini
[common]
bind_port = 7000
#启动
[root@ecs-d589 frp_0.44.0_linux_amd64]# nohup ./frps -c ./frps.ini &
#看启动日志
2022/07/22 08:31:55 [I] [root.go:209] frps uses config file: ./frps.ini
2022/07/22 08:31:55 [I] [service.go:194] frps tcp listen on 0.0.0.0:7000
2022/07/22 08:31:55 [I] [root.go:218] frps started successfully
在B上的设置稍微复杂一点,要指定A的外网IP,B的服务端口(ssh服务就是22了),A的代理B的服务端口(给个222),当然还有frs内部通讯端口一样是7000。frs作为客户端启动。
root@ra:~/tool/frp_0.44.0_linux_arm64# cat frpc.ini
[common]
server_addr = 122.9.51.10?
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 222
#启动
root@ra:~/tool/frp_0.44.0_linux_arm64# nohup ./frpc -c ./frpc.ini &
2022/07/22 00:38:17 [I] [service.go:349] [0c6e0efbf4d93a0a] login to server success, get run id [0c6e0efbf4d93a0a], server udp port [0]
2022/07/22 00:38:17 [I] [proxy_manager.go:144] [0c6e0efbf4d93a0a] proxy added: [ssh]
2022/07/22 00:38:17 [I] [control.go:181] [0c6e0efbf4d93a0a] [ssh] start proxy success
启动成功后,可以发现A上的222端口起来了。并且A的日志有新的信息表明B连过来了
2022/07/22 08:38:17 [I] [service.go:450] [0c6e0efbf4d93a0a] client login info: ip [117.152.92.7?:31322] version [0.44.0] hostname [] os [linux] arch [arm64]
2022/07/22 08:38:17 [I] [tcp.go:64] [0c6e0efbf4d93a0a] [ssh] tcp proxy listen port [222]
2022/07/22 08:38:17 [I] [control.go:465] [0c6e0efbf4d93a0a] new proxy [ssh] type [tcp] success
然后在公网就可以用ssh连接A的222端口,A就会转发到B的22端口,这样就相当于在外网连上了家庭网络里的设备的22端口。连上后,A的日志有新信息:
# 从家庭网络连的 验证一下没有问题
2022/07/22 08:40:08 [I] [proxy.go:179] [0c6e0efbf4d93a0a] [ssh] get a user connection [117.152.92.7?:31356]
最后,公网ECS要在安全组把对应的端口放行,这个就不多说了。
- 点赞
- 收藏
- 关注作者
评论(0)