内网穿透frp

举报
黄生 发表于 2022/07/22 15:21:41 2022/07/22
【摘要】 这里说的内网穿透,是指内网内有一个服务要暴露到公网上去。内网是内部的局域网,比如家庭网络,公司网络。以家庭网络为例,运营商提供公网接入后,家庭内部的多个电脑或设备组成的内部的网络,他们都可以上网,但内部服务无法暴露到公网上。如果运营商提供了公网IP的话,可以通过路由器上端口映射的功能,能够比较简单的将内网里的服务/端口映射到外网IP上去。如果运营商提供的光猫或路由器没有端口映射功能,需要将其...

这里说的内网穿透,是指内网内有一个服务要暴露到公网上去。
内网是内部的局域网,比如家庭网络,公司网络。以家庭网络为例,运营商提供公网接入后,家庭内部的多个电脑或设备组成的内部的网络,他们都可以上网,但内部服务无法暴露到公网上。
如果运营商提供了公网IP的话,可以通过路由器上端口映射的功能,能够比较简单的将内网里的服务/端口映射到外网IP上去。如果运营商提供的光猫或路由器没有端口映射功能,需要将其设置为桥接模式,自己买路由器来接入上网并实现端口映射。
总之,上面是比较麻烦的。
还有一种方式,那就是用比较软件的方式来实现,使用frp。
这种方式的条件有:

  1. frp软件
  2. 有一个公网机器和公网IP,这个比较简单,华为云上弄一个ECS和EIP就可以了

先去github下载release版本。这里的示例是,以家庭网络为例,
比如家里有一台设备,是ARM设备,叫做B,需要外网能够访问的到它上面的服务,比如SSH服务吧。
而外网机器是ECS,叫A。

原理图是这样的,图中展示的有多个内网服务端口,例子里我们只暴露一个端口
image.png

在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要在安全组把对应的端口放行,这个就不多说了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。