中国移动家庭宽带无公网IP下frp实现内网穿透
中国移动家庭宽带实际是租用电信网络,公网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内网穿透功能成功实现,其他服务仿照添加即可。