局域网内的主机实现外网访问(IPv6、frp和反向代理)
本文最后更新于:2021年2月23日 凌晨
本文记录如何在树莓派上如何实现反向代理,穿透内网进行远程登录和操作内网主机。本方法也适用于其他 Linux
系统和 mac osx
系统,但目录上有所区别。
一: 必备条件
- 相关linux知识、计算机网络知识。
- 相关设备(如树莓派、nas、openwrt),支持IPv6的路由器。
frp
需要云主机或vps
。- 自己的域名,方便访问。
二: IPv6(主推荐)
需要一个域名和能够支持IPv6的路由器。这种方法的话只能用支持IPv6的设备进行访问内网设备,现在的手机基本上移动数据都支持IPv6,可以用这个方法,但是如果是WiFi的话,需要路由器开启IPv6,否则无法使用。
2.1 通过你的域名提供商获取账号密码
我用的是阿里云域名服务(也可以用免费的域名提供商),阿里云是通过 AccessKey
来控制DDNS服务的,域名请自行购买及配置。
注意:提示信息中的云账号AccessKey是您访问阿里云API的密钥,具有该账户完全的权限,请务必妥善保管。请勿通过任何方式(如Github等)将AccessKey公开至外部渠道,以免被恶意利用而造成安全威胁。
2.2 openwrt上设置动态dns(现改为在ikuai上设置动态域名)
- 打开openwrt的web端,点击
服务
->动态DNS
-> 输入openwrt_ipv6
->添加
- 点击刚刚添加的
openwrt_ipv6
后面的修改
->启用
-> 查询主机名:你所需要解析的子域名
-> ip地址版本:IPv6
-> DDNS服务提供商:选择你的域名提供商
-> 域名:你所需要解析的子域名
-> 用户名:阿里云是AccessKey ID
-> 密码:阿里云是AccessKey Secret
-> 保存应用。 - 如果是用虚拟机安装的openwrt则设置(其他的忽略):
高级设置里
-> IP 地址来源 [IPv6]设定为 : 可用的策略。 - 点击配置项
openwrt_ipv6
后面的:启动
。 网络
->防火墙
-> 入站、出站、转发:接受
-> 修改 -> 覆盖网络:勾选全部端口
-> 端口触发:勾选全部端口
。- 网络 -> 负载均衡 -> 策略 -> 修改-> 备用成员设为
默认(使用主路由器)
。
登录阿里云的dns解析服务,看看是否解析成功。同时用 你的子域名
使用 ssh登录openwrt
的后台,测试是否生效,不出意外的话,应该成功了。
2.3 利用socat进行端口转发
2.3.1 原理
因为IPv6的网络是直连的,不需要路由端口转发。所以需要用socat来进行IPv6到IPv4的端口转发。
解释下IPV6地址的基础知识,用冒号隔开的一共是8段,每段都有4个字符。前面4段是路由器获取的外面地址。后面4段是路由器分给内部设备的静态地址。
例如我的群晖, IPV6
是 2409:abcd:ma23:34c1::1ec6/64
写全就是:2409:abcd:ma23:34c1:0:0:0:1ec6
也就是说我的群晖的后4段就是:0:0:0:1ec6
。
所以,在配置防火墙的时候,该填入:0:0:0:0:0:0:0:1ec6/0:0:0:0:FFFF:FFFF:FFFF:FFFF
上面的意思是,前4段用掩码,后面4段是使用实际的地址。
2.3.2 转发操作
如何访问家庭局域网中存在只能使用IPv4的设备呢?(比如主路由器下有一个设备(192.168.1.10),该设备不支持IPv6,但现在又希望远程访问其管理页面进行配置)可以通过以下步骤进行操作。
- 系统 -> 软件包 -> 可用软件包 -> 过滤器搜索:
socat
和coreutils-nohup
->安装
。 - 选择“系统”-“启动项”菜单,切换至“本地启动脚本”选项卡。
- 在“exit 0”之前插入如下三条命令,并单击“保存”按钮。
Sleep 120
nohup socat TCP6-LISTEN:8110,reuseaddr,fork TCP4:192.168.1.10:80&
nohup socat UDP6-LISTEN:8110,reuseaddr,fork UDP4:192.168.1.10:80&
nohup
的作用是让指令在后台运行,如果不加nohup
,则在命令支持后台运行的情况下其会正确执行,如果不支持后台运行,则该命令不会运行。Sleep 120
指令是防止socat
命令运行太早,系统还未启动完成,不具备运行条件。- 重启路由器后即可通过“
动态域名:8110
”访问IP地址为192.168.1.10
的设备。 - 如果不想立即重启路由器,可以通过
SSH
连接路由器,在命令行中输入以下指令完成操作。(该操作成功后,如果路由器重启,设置将不起作用)socat TCP6-LISTEN:8110,reuseaddr,fork TCP4:192.168.1.10:80&
socat UDP6-LISTEN:8110,reuseaddr,fork UDP4:192.168.1.10:80&
2.4 安全设置
为了安全,需要设置ipv6只能访问指定端口。
2.4.1 更改路由访问端口
(1)更改SSH端口
选择“系统
”-“管理权
”菜单,切换至“SSH访问
”选项卡,在“端口
”编辑框中输入自己所需的端口即可。(默认:22)
(2)更改Web端口
- 使用SSH工具登录路由器;
- 输入“
vi /etc/config/uhttpd
”命令; - 修改“
list listen_http 0.0.0.0:80
”和“list listen_http [::]:80
”中的80
为指定端口号,保存退出; - 打开防火墙相应端口;
- 此时通过“
动态域名:指定端口
”即可访问web管理页面。
未完待续。。。
三: frp的方法(次推荐)
需要一台有公网IP的云主机或者VPS,自己的域名,受限于服务器的带宽。
3.1 云主机上安装一键脚本
直接使用 GitHub
上的一键脚本 MvsCode / frps-onekey
3.1.1 Install(安装)
Aliyun
1 |
|
Uninstall(卸载)
1 |
|
Update(更新)
1 |
|
3.1.2 配置
执行frps start
。
2021-2-5运行失败,winscp打开
/usr/bin/frps
,将里面的$PID
全部替换为"$PID"
,如果运行成功,则无视。
1 |
|
配置完成后,可以通过 http://你的云主机ip:6443
或 http://fr.你的域名:6443/
访问你的 frps
控制界面。
在云主机上通过如下方式控制 frps
。
1 |
|
3.2 本地客户端操作
3.2.1 通用方法
可以下载 fatedier/frp,使用里面的frpc; 或者 使用 windows的便携脚本,配置文件参考→官方文档。
配置FrpsPro
文件夹里面的frpc.ini
,配置如下:
1 |
|
3.2.2 openwrt 上插件
因为我使用的 openwrt
路由器固件自带 frp 内网穿透
插件,直接在上面设置即可,openwrt
上参考配置如下。
1 |
|
【示例】 远程控制win 10主机(需要打开win 10的远程控制,还要先使用网络唤醒,然后才能远程控制)
服务备注名 | Frp协议类型 | 域名/子域名 | 远程主机端口 | 内网主机地址 | 内网主机端口 |
---|---|---|---|---|---|
my_pc | tcp | 域名 | 9090 | windows主机内网ip地址 | 3389 |
四: 反向代理
4.1 准备工作(局域网主机上操作)
- 局域网主机生成密匙(如果已经生成,请跳过)
打开终端,输入。ssh-keygen
# 然后连续按三次Enter - 输入如下命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub 中文改为你的云主机用户名@中文改为你的云主机外网IP
- 使pi默认可以root登录
sudo passwd root
# 修改pi的root密码sudo nano /etc/ssh/sshd_config
找到PermitRootLogin这一行,将前面的‘#’去掉,这一行改为PermitRootLogin yes
。
4.2 反向代理的操作
原理图:
编号 | IP | 用户名 | 说明 |
---|---|---|---|
A | 192.168.1.A | U_a | 目标 计算机,(即树莓派),在局域网中,可以访问 A |
B | B.B.B.B | U_b | 代理服务器(我们的 vps 或云主机),在外网中,无法访问 A |
C | - | U_c | 外部的计算机,比如公司的电脑,可以访问B,无法直接访问 A |
4.2.1 设计方案
在 A 机器上做到 B 机器的反向代理;在 B 机器上做正向代理本地端口转发
4.2.2环境需求
- 每台机器上都需要 SSH 客户端
- A、B 两台机器上需要 SSH 服务器端。通常是 openssh-server。
ubuntu和debian上安装ssh代码如下:sudo apt install openssl-server
4.2.3 SSH 参数解释
1 |
|
4.3 具体步骤
4.3.1 登录云主机上开启自动端口转发【云主机上操作】
sudo vi /etc/ssh/sshd_config
找到GatewayPorts把前面的#去掉,后面改成yes,开启自动端口转发
4.3.2 为 B 机器上端口,用来与 A 机器上的22端口绑定 【云主机上操作】
1 |
|
4.4 autossh 反向代理
4.4.1 局域网主机(树莓派)开启autossh反向代理
在上文中,我们已经能够在C 计算机通过 B 计算机访问 A 计算机,但这个代理是暂时的,会出现代理随时断开或者下次重启树莓派又要重新开启,步骤麻烦。因此,我们把方案优化,升级 ssh 的代理工具,使用 autossh 这个工具。
我们先要安装 autossh,在局域网主机(树莓派)上。sudo apt install autossh -y
sudo apt install sshpass -y
然后输入命令绑定autossh -M 5678 -NR <port_b1>:localhost:22 云主机用户名@云主机外网IP
代码示例:sudo sshpass -p '云主机密码' autossh -M 5678 -CNR 7280:localhost:22 root@123.123.123.123
1 |
|
就这样开启了反向代理,作用跟前面的一致。但,这里当代理连接断开后,会自动重连,不需要担心,突然连不上自己的 树莓派 了。
但我们的 pi 重启后,也是要输入上述 autossh 的命令,为了更加自动化,把autossh 加入开机启动里(需要ssh免密码登录)
1 |
|
-M 5678参数,负责通过5678端口监视连接状态,连接有问题时就会自动重连.
4.4.2 通过其他电脑手机访问局域网主机(树莓派)
ssh -p <port_b2> 你的云主机用户名@你的云主机外网IP
<port_b2>
改成上面的端口号,如1234
代码示例:ssh -p12345 root@123.123.123.123
五: 参考文档
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!