评论

评论

这篇文章还没有任何评论。快来成为第一个评论者吧!

玩机系列-小米路由器PRO#3:伪私有云搭建

玩机系列 – 小米路由器PRO

伪私有云搭建

2020年4月7日 | IN PLAYMACHINE | BY UX·range

内容简介:

由于对小米路由器Pro进行了刷机,刷入了OpenWRT系统,然后为了组建私有云,所以必须进行内网穿透。由于家庭网络不是专线网络,没有固定ip,所以没办法进行直连,这时候,Frp结合Samba就是一个很好的解决方案,划重点(这个方案没有太多的技术难度)。

至于小米路由器刷OpenWRT过程就不在这里具体展开了

延伸阅读:小米路由器PRO、OpenWRT

预计阅读时间:10分钟

挂载点:

首先,你需要在OpenWRT的左边栏选择挂载点进入,然后在Luci下挂载(如果已经自动挂载忽略以下步骤)。

大致路径:Luci –> 系统 –> 挂载点 –> 挂载点添加–> 启用挂载点

推荐通过 UUID 标签挂载 ,通过其他方式挂载,存在开机时盘符漂移的情况,可以通过分区的大小和编号确定挂载的是哪个分区。

挂载点选择自定义,就是硬盘的访问目录

然后记住保存添加的挂载点,重复以上步骤直到你想要挂载的所有分区都挂载上了,然后记住你的挂载点目录

挂载了三个硬盘

在案例里挂载了三个硬盘分别在/mnt/sda1、/mnt/sda2、/mnt/sda3。

Samba(网络共享)

然后在 OpenWRT 的左边栏选择网络储存中的网络共享进入。

大致操作路径:网络储存 –> 网络共享 –> 共享目录 –> 添加共享目录 –> 输入目录(挂载点) –> 勾选填写相应选项 –> 保存并应用

由于安装的是别人已经编译好的包(特别感谢AlbertZhan的定制固件包)设置起来就很无脑~

Samba基本配置

主机名:这个随意,指的是在共享网络中展示的名称

描述:随意

工作组:一般保持不变,即为“WORKGRPOUP”

将共享家目录勾选:这个服务允许系统用户通过网络共享找到Samba开放的目录。

自动共享勾选:这个服务将自动匿名共享路由器所连接的硬盘。

配置共享目录

这里的共享目录指已挂载设备上的文件夹

点击添加共享目录,你会发现这里有多个输入要你进行填写;

共享名:为你共享出去的目录对外展示的名称

目录:为你共享出去的目录所在的挂载点(不知道的可以看上文)

允许用户:如果你不需要特定用户访问即任何用户不包括匿名用户,这里无需设置,如果你需要特定用户访问,那就输入用户名(添加用户名的方式留后说明)

只读顾名思义,就是只允许读取不允许写入

可浏览:默认勾选,没有这个里面的文件就不可被查看

允许匿名用户勾选即为可被访客登陆,也就是说任何人都可以登陆,在局域网内是无所谓的。但是暴露在外网最好关了。

创建权限掩码根据需要设置,常见0777,0775;如果不知道就设为0777(笑Crying)

如果你勾选了允许匿名用户登陆,那么你现在已经可以用访客登陆使用你的硬盘了。

mac下可以直接在“访达”下使用快捷键:command+K;在地址栏输入:smb://你的路由器地址(如192.168.1.1等根据实际而定)就可以直接挂载了

windows下可以打开运行(windows键+R),输入配置samba服务器的主机名或者IP(格式:\你的路由器地址)

保护路由器的访问权限

如果需要将你的硬盘暴露在外面的话,那么必须授予对路由器的访问权限(要不然被人弄成矿机或者肉鸡了别怪我没说哦~):

大致权限为以下:

  • 一无所求:任何可以建立连接的人都可以访问
  • 在不安全的连接(例如telnet)上询问用户名和密码
  • 在加密连接(例如SSH)上询问用户名和密码(例如,通过遵循firstlogin)
  • 要求输入用户名,signature而不是password(例如,带有signature.authentication的 SSH )

如果您要求提供用户名/密码,则攻击者必须猜测组合。如果您使用未加密的连接,他可能会监听您并获取它们。

如果使用加密连接,则任何窃听者都必须首先解密数据包。这总是可能的。解密内容需要多长时间,取决于您使用的算法和密钥长度。

另外,只要攻击者可以通过网络访问控制台,他就可以始终进行暴力攻击以找出用户名和密码。他不必自己这样做:他可以让计算机进行猜测。要使该选项变得不可能甚至不可能,您可以:

  • 完全不提供来自Internet的访问,或将其限制为某些IP地址或IP地址范围
    1. 通过让SSH服务器dropbear和Web服务器uhttpd不侦听外部/ WAN端口
    2. 通过阻止防火墙中这些端口(默认情况下为TCP 22、80和443)的传入连接
  • 使猜测更加困难:
    1. 不要使用用户名 root
    2. 不要使用8个字符以下的弱密码
    3. 不要让SSH服务器dropbear监听默认端口(22)
这样设置

结合使用

  1. 用户名不同于 root
  2. 告诉dropbear侦听随机端口(应为> 1024):系统→管理→Dropbear实例→端口
  3. 公钥认证。您的公共密钥可以在管理→系统→SSH密钥中指定。较早的DropBear SSH公共密钥身份验证指南提供了有关生成SSH密钥对的详细信息,其中包括应上传到配置的公共密钥。

系统强化

如果您有外部磁盘,则可能需要对其进行加密。

网络强化

  • Fwknop(FireWall KNock OPerator)实现了一种称为单数据包授权(SPA)的授权方案。这种授权方法基于默认丢弃数据包过滤器和libpcap。SPA本质上是下一代端口敲门。例如:它可以在WAN上打开SSH的端口,但只是在很短的时间内,直到您可以通过该端口建立新连接为止。 请参阅以下详细说明:Fwknop
  • 像端口敲门一样,Ostiary增加了一层额外的安全性。它可用于简单地远程启动脚本或任务(无需SSH访问)。通过转到下面的相应链接,请参阅有关配置服务器或客户端的详细说明。
    1. Ostiary服务器
    2. 委托客户
  • 为了保护开放端口免受暴力攻击,可以通过iptables配置禁止攻击者的IP地址:
    1. 论坛主题7493
    2. 论坛主题27103
  • 根据您的情况,您可能想要使用诸如fail2ban之类的入侵防御系统,或者更好地实施基于的入侵防御系统。logtrigger

在OpenWrt中创建非特权用户

​添加名为xpeople的用户的示例:

opkg update
opkg install shadow-useradd
useradd xpeople

或手动添加用户(请注意,uid / gid(例如= 1000)尚未使用!)

/etc/passwd: USER:x:1000:1000:GROUP:/mnt/usb:/bin/false
/etc/group: GROUP:x:1000:
/etc/shadow: USER:RANDOMSTUFWillBeUpdatedWithPasswd:16666:0:99999:7:::
passwd USER

但是,您还不能向该用户SSH。要启用ssh访问,您应该为该用户输入密码,创建其主文件夹,最重要的是指出该用户的外壳:

passwd xpeople 
mkdir /home 
mkdir /home/xpeople 
chown xpeople/home/xpeople 
vi /etc/passwd 
   xpeople:x:1000:1000:xpeople/home/xpeople/bin/ash

然后保存退出

smbpasswd -a xpeople(前面设置的用户名)

允许使用sudo进行临时特权访问

首先,您应该安装sudo:

opkg install sudo

此外,您必须通过操作’/etc/sudoers’by tool 来允许所需的用户visudo。现在你可以按照ONE下面选择用户如何能够运行命令的方法root:

方法1:使用root密码对任何用户进行“ sudo”(更安全)

在这种方法中,任何用户只有知道root用户密码后才能以root用户身份临时运行命令。这样,当用户使用命令运行命令时,sudo应输入root的密码而不是密码。

要启用此方法,您应该’/etc/sudoers’输入以下命令打开文件

vi sudo

然后在该文件中取消注释下面的两行,然后保存

## 如果用户知道密码,则取消注释以允许任何用户运行sudo         
## 用户使用的身份(默认为root)运行命令。
Defaults targetpw  # Ask for the password of the target user                 
ALL ALL=(ALL) ALL  # WARNING: only use this together with 'Defaults targetpw'

此方法更安全,因为您无需同时保护root用户和特权用户(sudoer)即可保护整个系统的安全。

一个用例是允许从WAN使用密码进行远程ssh:为了提高安全性(仍低于RSA密钥),您只能允许root用户以外的用户从WAN使用其密码(可以选择在自定义端口上)使用ssh。为了获得更高的安全性,您可以在运行后请求root的密码sudo。因此,在这种情况下,黑客应找到3个不同的字符串:用户的用户名,用户的密码和root的密码,以获得对系统的完全访问权限。即使用户的帐户遭到破坏,入侵者仍然无法破坏您的系统,因为他还没有root密码。

方法2:用用户的密码’sudo’ing

用这种方法,在所需用户登录后,当您输入时sudo,应再次输入用户密码。最终结果类似于您sudo在Ubuntu或其他流行的Linux发行版中的使用方式,但是该方法没有为此目的利用组“ sudo”。

要启用此方法,您还应该输入命令

vi sudo

然后在注释“ ##用户权限规范”下添加允许您的用户的行:

##                                                                           
## 用户权限规范                                            
##                                                                           
root ALL=(ALL) ALL                                                           
nicolaus ALL=(ALL) ALL
方法3:如果用户是“ sudo”组的成员,则使用用户的密码“ sudo”(需要安装一些软件包)

此方法与方法2非常相似,不同之处在于,它允许组“ sudo”的任何成员使用sudo自己的密码使用。这种方法与Ubuntu和其他流行的Linux发行版中允许’sudo用户访问的方法完全相同。

要首先激活此方法,您应该sudo通过输入以下 命令允许组“ sudo”使用命令

vi sudo

然后取消注释下面的行:

## 取消注释以允许组sudo的成员执行任何命令      
%sudo ALL=(ALL) ALL

其次,您应该创建组“ sudo”。您可以通过手动编辑’/etc/group’来实现,但是为此目的安装和使用工具更为标准:

opkg install shadow-groupadd
groupadd --system sudo

最后将您的当前用户添加到“ sudo”组。您可以将用户直接附加到’/etc/group’,但还是最好使用usermod:

opkg install shadow-usermod 
usermod -a -G sudo nicolaus

此方法更方便,因为与方法2相比sudo,您可以简单地允许任何用户访问,usermod -a -G sudo 但只需占用更多空间(用于安装新软件包),方法2可能更适合于空间非常有限的系统。

PPP

如果您在默认配置中使用ppp且用户名和密码位于中/etc/config/network,那么没有特权的用户可以从pppd的命令行(例如使用ps w)读取它。为防止这种情况,您可以在uci配置中添加“ user” /etc/ppp/options和“ * ” /etc/ppp/{chap|pap}-secrets,然后删除用户名/密码选项。

当然/etc/ppp/{chap|pap}-secrets不应该是世界可读的:

chmod go-rw / etc / ppp / chap-secrets

Frp设置

github搜索Frp就好了

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

服务端-frps

想要自建穿透,首先你需要一个服务器,带宽一定要够,3M小水管将就用,5M带宽差不多 ,国内服务器为佳。

1.下载程序

首先到 frp 的 releases 页面下载最新版的对应 VPS 的处理器架构的压缩包 

如何知道 VPS 的处理器架构?在 VPS 上运行这个命令:

arch

然后就可以在上面那个按钮那里寻找对应的压缩包

由于内在的不可抗力因素,建议将包下载下来通过ssh工具上传到服务器的root目录里面。

然后开始表演:

tar -xzvf frp_0.30.0_linux_amd64.tar.gz
 
# 文件夹名改成 frp,不然目录太长了不方便,这里Frp_0.30.0_linux_amd64.tar.gz为文件名
mv frp_0.30.0_linux_amd64 frp
cd frp
 
# 确保 frps 程序具有可执行权限
chmod +x frps

然后试着运行一下frps,看看是否能正常运行

./frps --help

正常情况下会输出一串帮助信息,那么就说明你下载了正确架构的版本

如果提示 -bash: . / frps: cannot execute binary file: Exec format error 就说明你下错版本了

2. 配置程序

你可以参考以下配置说明来书写这个配置文件frps.ini,你可以通过Vi来修改配置,也可以先在外面拟定好草稿后录入

vi 修改

cd /frp
vi frps.ini

进入到Vi界面,然后按“a”方可输入内容,可将所有内容清空复制以下内容,进行配置

# 下面这句开头必须要有,表示配置的开始
[common]
 
# frp 服务端端口(必须)
bind_port = 7000
 
# frp 服务端密码(必须)
token = 12345678
 
# 认证超时时间,由于时间戳会被用于加密认证,防止报文劫持后被他人利用
# 因此服务端与客户端所在机器的时间差不能超过这个时间(秒)
# 默认为900秒,即15分钟,如果设置成0就不会对报文时间戳进行超时验证
authentication_timeout = 900
 
# 仪表盘端口,只有设置了才能使用仪表盘(即后台)
dashboard_port = 7500
 
# 仪表盘访问的用户名密码,如果不设置,则默认都是 admin
dashboard_user = admin
dashboard_pwd = admin
 
# 如果你想要用 frp 穿透访问内网中的网站(例如路由器设置页面)
# 则必须要设置以下两个监听端口,不设置则不会开启这项功能
vhost_http_port = 10080
vhost_https_port = 10443
 
# 此设置需要配合客户端设置,仅在穿透到内网中的 http 或 https 时有用(可选)
# 假设此项设置为 example.com,客户端配置 http 时将 subdomain 设置为 test,
# 则你将 test.example.com 解析到服务端后,可以使用此域名来访问客户端对应的 http
subdomain_host = example.com

然后按“esc”键,输入“:wq”退出且保存;如果需要了解更多配置,可参考frp中文说明

试着启动一下frps

# 使用 -c 参数指定配置文件
./frps -c frps.ini

如果没有出现错误提示就说明配置没有问题,可以正常使用

接着按下 Ctrl + C 终止程序运行

3. 使 frps 在后台持续运行

启动

直接使用前面的命令行来运行是不行的,因为在关掉 ssh 窗口后程序frps就会停止运行,因此要使用nohup [command] &这种操作来使其在后台运行

nohup /root/frp/frps -c /root/frp/frps.ini &

并且程序的所有输出(日志)会被写入nohup.out文件中,你可以使用cat命令查看其内容

停止

想停止的话,结束frps即可

pkill frps
开机自启

输入

chmod +x frps-start.sh
chmod +x /etc/rc.d/rc.local 
vi /etc/rc.d/rc.local

然后在vi里面输入

 nohup /root/frp/frps -c /root/frp/frps.ini &

按“esc”输入“:wq”保存退出

OK,服务端的事情完成了。对了还有个重要事情,你需要开放相应上方的端口

客户端-frps

首先,你需要在OpenWRT的左边栏选择服务进入,然后Frp内网穿透进入。

大致路径:Frp内网穿透 –> 全局设置 –> 进行配置 –> 服务列表 –> 添加服务 –> 保存并应用

全局设置

服务器:你开放的域名 端口:指的是之前Frps.ini对你路由器开放的端口 令牌:连接时候验证frp服务端密码 HTTP穿透服务端口:“vhost_http_port”的值 HTTPS穿透服务端口“vhost_https_port” 的值

添加服务列表

TCP/UDP
这里以转发 ssh 为例,如果是samba服务,默认端口为 139就可以了
HTTP(S) 以转发路由器设置页面为例
以转发路由器设置页面为例,这里的共享目录指到已挂载设备上的文件夹
下文附修改Frpc.ini的内容

基本配置(必须)

# 下面这句开头必须要有,表示配置的开始
[common]
# frp 服务端地址,可以填ip或者域名
server_addr = 0.0.0.0
# frp 服务端端口,即填写服务端配置中的 bind_port
server_port = 7000
# 填写 frp 服务端密码
token = 12345678

TCP/UDP

这里以转发 ssh 为例

# 自定义一个配置名称,格式为“[名称]”,放在开头
[ssh]
# 连接类型,填 tcp 或 udp
type = tcp
 
# 本地ip,填你需要转发到的目的ip
# 如果是转发到frp客户端所在本机(比如路由器)则填 127.0.0.1
# 否则填对应机器的内网ip
local_ip = 127.0.0.1
# 需要转发到的端口,比如 ssh 端口是 22
local_port = 22
 
# 是否加密客户端与服务端之间的通信,默认是 false
use_encryption = false
# 是否压缩客户端与服务端之间的通信,默认是 false
# 压缩可以节省流量,但需要消耗 CPU 资源
# 加密自然也会消耗 CPU 资源,但是不大
use_compression = false
 
# frp 服务端的远程监听端口,即你访问服务端的 remote_port 就相当于访问
# 客户端的 local_port,如果填0则会随机分配一个端口
remote_port = 6001

HTTP(S)

以转发路由器设置页面为例

# 自定义一个配置名称,格式为“[名称]”,放在开头
[router-web]
# 连接类型,填 http 或 https
type = http
 
local_ip = 127.0.0.1
local_port = 80
 
# http 可以考虑加密和压缩一下
use_encryption = true
use_compression = true
 
# 自定义访问网站的用户名和密码,如果不定义的话谁都可以访问,会不安全
# 有些路由器如果从内部访问web是不需要用户名密码的,因此需要在这里加一层密码保护
# 如果你发现不加这个密码保护,路由器配置页面原本的用户认证能正常生效的话,可以不加
http_user = admin
http_pwd = admin
 
# 还记得我们在服务端配置的 subdomain_host = example.com 吗
# 假设这里我们填 web01,那么你将 web01.example.com 解析到服务端ip后
# 你就可以使用 域名:端口 来访问你的 http 了
# 这个域名的作用是用来区分不同的 http,因为你可以配置多个这样的配置
subdomain = web01
 
# 自定义域名,这个不同于 subdomain,你可以设置与 subdomain_host 无关的其他域名
# subdomain 与 custom_domains 中至少有一个必须要设置
custom_domains = web02.yourdomain.com
 
# 匹配路径,可以设置多个,用逗号分隔,比如你设置 locations 为以下这个,
# 那么所有 http://xxx/abc 和 http://xxx/def 都会被转发到 http://xxx/
# 如果不需要这个功能可以不写这项,就直接该怎么访问就怎么访问
locations = /abc,/def
 
# 重写 host header,相当于反向代理中的“发送域名”
# 如果设置了,转发 http 时,请求中的 host 会被替换成这个
# 一般情况下不需要用到这个,可以不写这项
host_header_rewrite = dev.yourdomain.com

TCP/UDP 范围转发

# 自定义一个配置名称,格式为“[range:名称]”,放在开头
[range:multi-port]
 
type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false
 
# 本地端口和远程端口可以指定多个范围,如下格式,且范围之间必须一一对应
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028

合并配置

将你决定要使用的配置合起来,然后填到路由器的 frp 配置脚本中

如果你是在 linux 上运行,则写入到frpc.ini中,然后仿照运行服务端的方式来运行客户端

比如将以上示例配置合并之后,看起来应该是这个样子

[common]
server_addr = 0.0.0.0
server_port = 7000
token = 12345678
 
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false
remote_port = 6001
 
[router-web]
type = http
local_ip = 127.0.0.1
local_port = 80
use_encryption = true
use_compression = true
http_user = admin
http_pwd = admin
subdomain = web01
custom_domains = web02.yourdomain.com
locations = /abc,/def
host_header_rewrite = dev.yourdomain.com
 
[range:multi-port]
type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028

所有配置结束后

登录服务端的 dashboard,看看是否连接成功,测试各项转发是否可用

如果出现无法使用的情况,按照基本思路排查问题:

看服务端和客户端日志是否有报错 客户端与服务端连接正常,就检查是否是服务端的防火墙或者安全组是否没开放使用到的端口 如果客户端是在路由器上,想转发至内网设备上的某个端口或服务,请检查目标设备的防火墙是否开放所需端口,且建议为该内网设备分配一个静态ip

114 0