本帖最后由 kn69968 于 2024-12-23 21:54 编辑
长期以来都是小透明和资深潜水党在社区里吸取大佬们的营养和指导, 近日折腾了一下小主机和 aio, 并且将过程整理成教程在社区里发表出来, 不求能够指导别人, 但求别人能有个参考, 并且一起交流学习.
各位说话好听 头发多 精力旺盛 过年涨薪的 佬们 觉得可以的话 就给我点个赞吧.
另外本人热爱分享, 热爱搞机, 馒头 pt 上传100T+,发种100+,做种500+, 做种时间一年(数据准备另开一贴贴出), 希望基于此能得到大佬的厚爱发个邀请:(btschool,聆音, 红叶,emp峨眉派/P0 rNbay都行,), 丰富下自己的下载中心, 再过几周我就可以回来发馒头药了
邮箱: hasdrsafsdeyuo@gmail.com
系列文章目录:
前言
本教程需要你掌握基本的 shell 技能。就是能够 ssh 登录,cd 目录,使用 vi 编辑文本文件。 - 网络黑产灰产: 网络世界的黑客活动是不会考虑你个人感受的, 有很多人在法律边缘游走.个人搭建的服务有一些安全漏洞非专业人士不一定能及时补救.
- 过去的一个案例:若干年前的勒索病毒即使绑架了你的个人数据, 你交了钱也不一定能够及时给你解绑, 或者人家只是广撒网.
- 一些现象:一些机关单位竟然还在用 Windows XP, 英国公立医院就是这样中招勒索病毒的; 很多人还在一个密码走天下, 甚至不开二次验证; 在互联网资产搜索引擎 fofa 以关键字 title="alist"country="CN" 搜索一下, 看看大家部署的 alist 私服, 如果是专业网络人士就可能去扫你的服务来找漏洞了.
网络上关于 服务暴露到公网的安全讨论不绝于耳, 但是想一下, 折腾那么多一个服务在外面或者别人不能用, 在家里自己玩有啥意思, 这些软件服务不是就是暴露到公网使用的吗? 因此本文探讨了一些安全实践经验和将服务暴露到公网的安全方法. 关键词: 强密码, 高位端口, 二步验证, 最小权限, **, shadowsocks, 防火墙
安全实践所有服务基本安全实践- 使用强密码
- 最小使用权限.
- 修改默认端口. 改为高位端口
群晖安全实践- ssh. 修改 ssh 端口为 高位端口, 如 20908 , 并在必要时开, 正常处于关闭的状态.
- 群晖登录. DSM http 端口改为 20807, https 为 20806
- 更改强度高的随机密码. 开启二步验证. 并信任自己的设备.
- 开防火墙. 只开放必须端口号,其余全部禁掉; 所有非中国大陆IP禁止掉, 内网按需求全开.
- 登录保护. 控制面板 > 安全性 > 防护. 开启自动封锁1分钟内2次登录失败则封锁, 并开启白名单允许内网和自己的设备. 开启 DDOS 防护
- 所有权限按照最小权限授权原则. 分开不同账户管理不同类型的数据.
- NFS 文件服务只开启对 linux 的几个主机 IP 开启.
网上冲浪和账号安全实践
强密码: - wifi 密码. 全家推广 密码管理工具. 包括老人.
- 所有账号采用随机强密码
隐私保护 - 账号公开信息一定要注意防关联. 用户名尽量随机.
- 隐私保护有时需要考量方便,实际功能和隐私保护间的平衡. 例如社交账户有辨识性的账户或者实名认证的对社交有好处, 但是会同时暴露个人身份信息, 因此 具体情况具体分析. 如果注重隐私不管社交的话, 名字,头像,照片,注册手机号,邮箱尽量随机一点, 并且在每个软件关于隐私的地方都仔细查看并按需配置.
PVE 安全实践- 数据中心的 ipset 好像不管用, 要自己设置自己的.
- 数据中心的防火墙需要生效, pve主机和虚拟机的防火墙才会生效.
- 在数据中心的防火墙创建安全组, 创建统一的网络防火墙规则, 让每个主机都插入特定的安全组.(生效有延迟,请自己验证是否生效,如果不行,则每个虚拟机都创建一个防火墙规则)
- pve 主机和虚拟机的防火墙是分开的, 虽然所有配置都存储在集群文件系统上,但基于iptables的防火墙服务运行在每个集群节点上,从而在虚拟机之间提供完全隔离。
- 联网以后所有流量是从 路由器 WAN 口进来的, 也就是 openwrt 的 WAN 口 和光猫的 WAN 口. 不过为了保险起见, 我们所有主机都插入同一个安全组 拒绝其他流量.
- 对所有主机所有账户使用强密码. pve webui 登录密码, 用户密码, 关闭 ssh 密码登录.
- 修改 所有主机 ssh 端口 为高位端口.
路由器安全实践- 禁止 ssh 密码登录, 改强密码.
- 账户更改强密码.
- 开放内网 docker 放行
- 除了特定端口,封锁所有公网进入 WAN 口的流量.
将私服暴露到公网, 安全便利地回家
我的规划是, 在群晖和软路由部署一些服务, 防火墙对局域网开放这些服务,方便家人使用和调试. 接着在软路由部署 shadowsocks 服务, 并且软路由对公网开放几个端口: ping等, shadowsocks 端口. 所有回家流量都需要经过 shadowsocks 客户端的密码验证,并且流量加密. 接着在 软路由部署 nginx-proxy-manager 反代所有小主机的服务, 添加 SSL 加密. 便捷性方面则通过 IPV6+DDNS 绑定域名到家里软路由的 IP 地址. 这样将所有的服务的安全防护收拢到开源社区里经过多年验证的成熟的 shadowsocks 服务上,理论上风险会降低很多。这样其实就相当于跳板机。 具体操作。
IPV6+DDNS.
此步骤是为了让我们访问家里的服务就像输入 baidu.com 一样简单,简单来讲是在 DNS 服务器上实时更新记录,似的 mydomain.me 能够始终正确指向我们经常变化的 ipv6 公网地址。 (a)购买域名。首先到 spaceship 花8块钱 用支付宝够买个域名。(b)到腾讯云创建解析服务。接着到 dnspod.cn 腾讯 DNS 服务注册账号,添加自己的域名,(c)托管解析服务. spaceship 的页面将 域名 domain.com 的名称服务器填写 dnspod.cn 提示的名称服务器域名,作用是将改域名的 DNS 解析服务托管到腾讯云 dnspod. (d) dnspod 创建 API token. 在 dnspod 创建 token 后保存下来. (e) openwrt 安装 DDNS-go 服务并配置。打开 ddnsgo的 webui 配置页面 (http://ip:9876), 配置好 dnspod 的 token, 并且在 ipv6 一栏配置好需要添加解析记录的域名和应该获取哪个 ipv6 的地址。保存后,在右侧就能看到更新 DNS 记录的日志。在 dnspod.cn 的控制台也能看到我们的 AAAA记录(ipv6记录)
购买域名后进入域名管理界面
更新名称服务器为腾讯的地址, 就是将解析服务托管给腾讯
ddns-go 配置。 填入 ddnspod 的apiid和密钥,同时配置ipv6 获取的ipv6 公网地址和解析的域名
dnspod 控制台可看到我们的域名记录Nginx 反代服务。
正常来讲当我们部署一个服务后, 通过 http://ip:port 的方式就能访问,但是 http 流量是没有加密的,意思就是你的每一个访问请求, 你的所有流量在局域网内都是明文的裸奔的,,而且 http://ip:port 的地址不符合我们的习惯。因此使用 Nginx 来反向代理服务,意思就是我们每次在浏览器敲下一个地址,例如 https://alist.mydomain.me 该流量会首先经过 Nginx 服务器, 然后再将流量转发到实际的服务器 http://ip:port. 接下来是在 openwrt 上部署 nginx-proxy-manager, 因为上一步所购买的域名就指向 openwrt 的 ip 地址。
分为几个子步骤:
(a) 释放软路由的 http(s)默认端口。修改openwrt 的 uhttp 的 监听端口(80,443), 为 (8080和8443), 将 (80,8443) 让给 nginx-proxy-manager. ssh 登录到 openwrt 后,修改 /etc/config/uhttpd 中的对应下面的四行内容为下面的四行,就是监听443改为监听8443, 监听80改为监听8080, 再通过命令重启服务 /etc/init.d/uhttpd restart
- ❯ cat /etc/config/uhttpd
- config uhttpd 'main'
- list listen_http '0.0.0.0:8080'
- list listen_http '[::]:8080'
- list listen_https '0.0.0.0:8443'
- list listen_https '[::]:8443'
复制代码
(b) openwrt 下部署 nginx-proxy-manager 容器. 同样在 docker 管理目录下建立 nginx-proxy-manager 的目录, 此处我的 docker 根目录为 /mnt/sata1-4/docker/
- [ ! -d /mnt/sata1-4/docker/user_containers/nginx_proxy_manager ] && mkdir -p /mnt/sata1-4/docker/user_containers/nginx_proxy_manager
复制代码
接下来 通过 进入该目录并创建 docker-compose.yml, 和目录结构, 并执行 tee 将容器的配置清单写入 docker-compose.yml. 通过 docker-compose up -d 启动容器后, 将会监听80端口也就是http流量, 监听81端口用于登录 nginx-proxy-manager 的管理界面, 监听443端口就是 https 流量.
- # 进入目录, 创建目录结构
- cd /mnt/sata1-4/docker/user_containers/nginx_proxy_manager
- mkdir data letsencrypt
- # 创建文件
- touch docker-compose.yml
- # 填写 docker-compose.yml 文件
- tee -a docker-compose.yml >/dev/null <<EOT
- services:
- app:
- image: 'docker.io/jc21/nginx-proxy-manager:latest'
- restart: unless-stopped
- ports:
- - '80:80'
- - '81:81'
- - '443:443'
- volumes:
- - ./data:/data
- - ./letsencrypt:/etc/letsencrypt
- EOT
复制代码
如无意外(有则通过 docker logs container_id 来查看日志), 我们通过 http://软路由IP地址:81 登录到npm的管理界面. 如下图所示.
为什么要这么做, 请进一步了解 http, https, ssl, 证书, 证书链 等相关 概念. 简单来说就是你按照这些操作执行以后,在chrome等受认证的浏览器 通过 https://domain 来访问网址, 能够保证你访问过程中没有人能够篡改你得到的数据,没有人能从中间偷盗你的隐私安全信息.
在 lets encrypt 获取证书收信人机构签发的免费的泛域名证书。 在 nginx-proxy-manager 界面,首先我们为我们的域名和网站添加证书, 采用 letsencrypt 的三个月免费证书. 按照如下图的导航: 【SSL Certificate】- 【Add SSL Certificate】- 【选择 Let's Encrypt】- 【填写泛域名 *.http://yourdain.me 然后按回车】- 【填写邮箱】-【打开 dns challenge, 泛域名必须这样】-【选择 dns 供应商为 dnspod】-【填写之前在腾讯dnspod 获得的 id 和 token】-【勾选同意】-【保存】。过一会就会自动获得证书了。
在 lets encrypt 获取证书收信人机构签发的免费的泛域名证书
添加反代项目。按图操作即可。假设此时我要反代 alist, 也就是日后不再通过 http://ip:5244 的方式访问, 而是 https://alist.domain.me 的方式访问,而且安全、流量加密、网址容易记住。添加 proxy host. 按照1234 步骤操作, 其中第六七八步就是实际 alist 的 ip 和 端口。我圈住的开关你看不懂就代表不需要,默认即可。然后选择 SSL证书, 这里选择我们刚才申请签发的 Let's Encrypt 的泛域名证书, 并且开启 Force SSL, 保存。
此时如果在浏览器输入 alist.domain.me 没有进到页面,这是为什么呢?有两个原因:(1) 软路由没有开启 443 的端口放行,而且在中国运营商是不允许家庭建站的,会封锁该端口。(2)请思考,我们明明是在内网访问,都没有经过公网,封锁不封锁不影响呀?所以就是 DNS 的配置问题,在内网应该劫持 DNS 请求,并将 你的域名指向 nginx-proxy-manager 所在的主机的 IP 就是软路由的地址 。
(a) 首先在 nginx-proxy-manager 的 proxy host 编辑界面里添加路径 /
在 nginx-proxy-manager 的 proxy host 编辑界面里添加路径 /
(b) 修改 nginx 配置。 进入 proxy host 的配置文件目录后, 通过 grep 来找出哪个是 alist 的, 然后编辑 4.conf, 再 定位到 location / 模块, 按照 【Alist-安装-反向代理】 修改其中的配置。
- # 进入 nginx-proxy-manager proxy host 配置文件的路径
- cd /放置 nginx-proxy-manager容器数据文件的目录/nginx_proxy_manager/data/nginx/proxy_host
- # cd /mnt/sata1-4/docker/user_containers/nginx_proxy_manager/data/nginx/proxy_host # 这是我的例子
- # 通过 grep 命令找出哪个文件是配置 alist 的
- grep -rin alist .
- ./4.conf:2:# alist.domain.me
- ./4.conf:23: server_name alist.domain.me;
- ./4.conf.bak:2:# alist.domain.me
- ./4.conf.bak:23: server_name alist.domain.me;
- ./17.conf:57: location /alist {
- # 编辑 该文件
- vi 4.conf
复制代码
定位到 location / 模块后, 针对官方文档的配置样例, 对下面每一行, 原来有的就改成下面的,如果没有就增加一行。但是 proxy_pass 这一行不能改。感兴趣的可以让 ** 给你解释一下每一行是什么意思。
- location / {
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header Range $http_range;
- proxy_set_header If-Range $http_if_range;
- proxy_redirect off;
- proxy_pass http://127.0.0.1:5244;
- # the max size of file to upload
- client_max_body_size 20000m;
- }
复制代码
其他的大同小异,请结合 官方文档、社区、google、** 自行解决
给所有服务的公网访问加个加密隧道,无感回家
首先给我们的 Openwrt 安装个 Passwall 服务,接下来的操作会简单很多,否则你需要使用 xui 或者手工一点一点配置。如果是 IstoreOS(openwrt的 国人改版), 则可以运行如下脚本自动安装。安装完就可以 导航到下面图示的位置添加一个节点。添加节点,每个字段按照图示填写,密码填个高强度随机的一共有几十个字符的密码或者上百位,端口需要在防火墙放行入站。接着我们的手机通过使用 一些魔法上网的工具 连上该节点,就可以无感回家(无感回家指的是在浏览器直接输入 alist.domain.me 就能访问到家里的alist服务。)
家里的所有主机除了软路由,都在防火墙关闭公网的入站,只能通过软路由的 shadowsocks 节点进来,这样就很安全了而且方便了。
- repo="bcseputetto/Are-u-ok"
- api_url="https://api.github.com/repos/$repo/releases/latest"
- # 获取最新发布的资产 URL
- rm /tmp/*run
- asset_url=$(curl -s $api_url | grep "browser_download_url" | cut -d '"' -f 4 | \grep -Ei '.*passwall.*x86_64.*\.run$')
- echo "going to download the following package"
- echo "$asset_url"
- # 下载资产
- for url in $asset_url; do
- wget -P /tmp "$url"
- done
- opkg update
- sh /tmp/*run
复制代码
RustDesk 远程桌面
待续
ZeroTier 异地p2p虚拟组网待续
|