中国移动家庭宽带无公网IP下frp实现内网穿透

作者: 胖宅 分类: Linux,Openwrt 发布时间: 2022-04-30 01:15

中国移动家庭宽带实际是租用电信网络,公网IP紧张,宽带到户都是移动组建的大型局域网络。这种情况下,在互联网上想访问家庭NAS、Web服务、打印机、远程访问等功能受限,因为光猫分配的都是局域网IP址。为实现内网访问,需要借助内网穿透手段,这里以frp为例。

一、内网穿透背景

  • 目前市面上可用的内网穿透服务有花生壳、zerotier等,部分服务需要收费。

二、内网穿透原理

  • frp内网穿透实现原理是在公网上搭建一台frps服务器,家庭局域网运行frpc客户端,两者建立连接。当互联网上的设备访问家庭局域网时,会将数据转发到frps服务器,frps服务器将数据转发至frpc客户端,frpc客户端再将数据转发至同局域网下的内网设备,以实现内网资源访问。借用网上的一张图说明。

三、实现过程

1、frps服务器搭建

  • 需要一台有公网IP的服务器(可以阿里云、腾讯云、华为云主机)
  • 本例操作系统版本为ubuntu 20.04LTS
  • 下载frp_0.42.0_linux_arm64.tar.gz并解压
  • 添加开机启动服务
root@pangzhai:~# cd /tmp
root@pangzhai:/tmp# wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_arm64.tar.gz
root@pangzhai:/tmp# tar -zxvf frp_0.42.0_linux_arm64.tar.gz
root@pangzhai:/tmp# cd frp_0.42.0_linux_arm64
root@pangzhai:/tmp/frp_0.42.0_linux_amd64# cp systemd/frps* /usr/lib/systemd/system/
root@pangzhai:/tmp/frp_0.42.0_linux_amd64# cp frps /usr/bin/
root@pangzhai:/tmp/frp_0.42.0_linux_amd64# vi /etc/frp/frps.ini
  • 按如下配置修改配置文件/etc/frp/frps.ini
  • bind_port 为frps服务端口
  • dashboard_port 为frps状态面板WEB端口
  • dashboard_user 为web登陆用户名
  • dashboard_pwd 为web登陆密码
  • token为设置连接密钥
[common]
bind_port = 7777
dashboard_port = 7788
dashboard_user = yourname
dashboard_pwd = yourpassword
token = yourtoken
  • 设置开机启动frps服务
  • 查看服务运行状态
root@pangzhai:~# systemctl enable frps
root@pangzhai:~# systemctl start frps
root@pangzhai:~# ps -ef | grep frp
nobody   1448303       1  0 00:43 ?        00:00:00 /usr/bin/frps -c /etc/frp/frps.ini
root     1448711 1446814  0 00:50 pts/0    00:00:00 grep --color=auto frp
  • 完成上述操作后,需要打开防火墙相关端口
  • 要代理的远程端口也要打开,比如使用2022端口代理内网ssh的22端口
  • 本例共开放三个端口(7777、7788、2022)
  • 本例开放了阿里云主机的防火墙以及宝塔面板的防火墙
  • 具体根据自身服务器所涉及的防火墙进行设置
  • 通过访问frps 的ip地址+端口查看frps服务运行状态(http://pangzhai.cn:7788)
当前未有客户端连接

2、frpc客户端搭建

  • 这里以开源的openwrt系统为例安装并配置frp客户端
  • 测试用的硬件设备为netgear r6260路由器,搭配openwrt5.4.185系统
  • ssh连接到路由器
  • 按照胖宅花园仓库使用说明添加opkg源
  • 下载并安装客户端及语言包(frpc、luci-app-frpc、luci-i18n-frpc-zh-cn)
  • 如果安装时存在冲突,就强制覆盖--force-overwrite
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install frpc
root@OpenWrt:~# cd /tmp/
root@OpenWrt:/tmp# wget https://repository.pangzhai.cn/ipks/frp/luci-app-frpc_1.2.1-1_all.ipk
root@OpenWrt:/tmp# wget https://repository.pangzhai.cn/ipks/frp/luci-i18n-frpc-zh-cn_1.2.1-1_all.ipk
root@OpenWrt:/tmp# opkg install luci-*.ipk --force-overwrite
  • 重启luci
root@OpenWrt:/tmp# rm -rf /tmp/luci-*
root@OpenWrt:/tmp# /etc/init.d/uhttpd restart
  • 配置客户端
  • 服务-frpc-服务端-添加
  • 别名:随便填写
  • 服务端地址是指frps服务器的ip地址
  • 服务端端口是指frps服务器的bind_port
  • 令牌是指frps服务器设置的token
  • 勾选TCP mux
  • 保存应用
  • 服务-frpc-规则-添加
  • 代理名称是指要实现内网穿透的服务,可以是http、https、ftp、ssh等
  • 本例为代理ssh
  • 类型选择tcp
  • 本地IP是指要访问的内网IP地址,这个IP地址和frpc客户端在同个局域网
  • 本地端口是指要访问的内网ip对应的服务端口,ssh默认是22
  • 远程端口是指映射到frps服务器的端口,端口范围内随便设置
  • 保存应用
  • 服务-frpc-设置
  • 勾选启用
  • 客户端文件默认在/usr/bin/frpc
  • 服务端选择前面设置好的服务端
  • 以root运行,启用日志
  • 保存应用
  • 设置完后最好是后台重启下frpc客户端
root@OpenWrt:~# /etc/init.d/frpc stop
root@OpenWrt:~# /etc/init.d/frpc start
  • 查看frps服务器连接状态(http://pangzhai.cn:7788)
  • 通过ssh连接frps服务器IP+远程端口(pangzhai.cn + 2022)
  • 实际访问的是内网IP+22端口(192.168.100.116 + 22)
  • 内网穿透成功
  • http、https、ftp、samba等同理
目前有一个客户端连接
  • 通过ssh连接后再查看服务端状态

ssh内网穿透功能成功实现,其他服务仿照添加即可。

发表回复