备注:github 连接不畅时,可使用公开加速源
内网穿透 - 云端
笔者采用 Debian bookworm 镜像
| |
fastfetch(替代 neofetch 和 screenfetch)
| |
Debian 13 更新: fastfetch 已被加入官方源
docker 和 lazydocker(视情况安装)
| |
| |
境内云需要在 /etc/docker/daemon.json 配置加速源
配置以 阿里云提供的个人加速源 为例
frps
| |
| |
/usr/local/lib/systemd/system/frps.service
[Unit]
Description=Server of frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.
After = network.target syslog.target
Wants = network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /usr/local/etc/frp/frps.toml
Restart=no
User=frp
Group=frp
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
AmbientCapabilities 开启绑定 1 ~ 1000 端口的权限,可以不加
测试连通性(需要 nmap)
| |
fail2ban SSH
| |
/etc/fail2ban/jail.local
[sshd]
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
enabled = true
maxretry = 3
findtime = 10m
bantime = 24h
fail2ban frp
先添加过滤日志的 filter
/etc/fail2ban/filter.d/frps-app.conf
[Definition]
failregex = ^.+get a user connection \[<HOST>:[0-9]+\]$
ignoreregex =
测试 filter
| |
jail 直接封禁短期内大量的请求防止爆破,在 jail.local 里加上
[frps-app]
enabled = true
filter = frps-app
logpath = /var/log/frp/frps.log
maxretry = 100
findtime = 10m
bantime = 24h
测试 jail fail2ban-server -t
爆破来测试是否被封 nmap -sV -vvv -p <port> <ip>
查看封禁情况: fail2ban-client status
解封: fail2ban-client unban
备注:如果要给 frps 自身上保护可以加上这个 filter,并给 7000 上 jail
^.+client login info: ip \[<HOST>:[0-9]+\].+$
但问题在于 frps 的日志本身不是很详细,如果不是合法的 frp 连接,日志中将不会显示(就算开了最高级别日志,也不会记录 IP),因此给 frps 自身上 jail 作用不大,只能防止别人爆破 token,不能防止别人扫描
NAS
将用户加入 sudo 组 gpasswd -a <user> sudo
锁定 root 的密码
| |
安装软件包
| |
NetworkManager
在没有显示器的情况下无干扰自动配置 WIFI
| |
接管 ifupdown
/etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile
[ifupdown]
managed=true
接管 networking service
| |
NetworkManager 不会管理在 /etc/network/interfaces 中配置的网卡,需要只留一个本地环回
/etc/network/interfaces
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
frpc(SSH 内网穿透为例)
| |
创建服务,使 NAS 来电自启后能够自动建立穿透
| |
/usr/local/etc/frp/frpc.toml
| |
/usr/local/lib/systemd/system/frpc.service
需要 nss-lookup.target 而不只是 network.target
[Unit]
Description=Client of frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.
After = network.target nss-lookup.target
[Service]
User=frp
Group=frp
ExecStart=/usr/local/bin/frpc -c /usr/local/etc/frp/frpc.toml
Restart=on-failure
[Install]
WantedBy=multi-user.target
你 可能 会需要让 SSH 只运作在 v4 上 (ListenAddress 0.0.0.0) 来防止暴露在 v6 公网
一些权限问题
- 家目录 700
- sftp 目录 770,然后将想要访问 sftp 的用户加支援组
gpasswd -a <user> sftp_user
文件传输 / 同步
rsync / sftp 可以走 ssh 内网穿透
| |
切换到 sftp_user 然后生成密钥 ssh-keygen -t ed25519 -C "foo@example.com"
配置 /etc/ssh/sshd_config 的全局 PasswordAuthentication 为 no,让管理用户通过私钥连接,sftp_user 可以单独配置密码认证,方便移动端连接
Match User sftp_user
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ForceCommand internal-sftp
ChrootDirectory /mnt
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
添加 ftp 文件夹
| |
添加公钥,然后修改权限
| |
设备温度检测
安装 lm-sensors 并检测现存传感器,生成配置文件
| |
硬盘信息检测
| |
smartctl 可以检测硬盘信息,如启动时长、启停次数和硬盘温度
家庭影院
| |
编辑 /etc/minidlna.conf 将 media_dir 改为存放影视的路径即可
除了专用的投屏软件如贝当、乐播外,现在常见视频软件如爱优腾都自带 DLNA 支持(在笔者的电视上这些软件会定期广播 SSDP NOTIFY,频率堪称疯狂)
电视推流还需在手机上安装 BubbleUPnP 将手机作为 DLNA 控制器,然后选择电视上的视频软件作为 DLNA 渲染器
贴一个 ffmpeg 提取内嵌字幕的办法,可用于电视投屏
先查看所有的字幕 (subtitle) 流 ffprobe -select_streams s -show_streams input.mkv
选定流编号来导出,srt 模式为例 ffmpeg -i input.mkv -vn -an -codec:s:0 srt output.srt
主机可以直接用 VLC,选择 View - Playlist - UPnP 即可
另外贴一个笔者遇到的 bug:
VLC 的 UPnP 主动扫描模块只会扫描多个网卡中的一个,有时会被 docker0 干扰
目前还没有看到官方的修复
除了主动扫描外,其实也可以等待 miniDLNA 的周期 NOTIFY(通过配置文件的 notify_interval 配置)
然而 Linux 默认不会将网卡加到 UPnP 多播组,只能手动加入 sudo ip addr add 239.255.255.250 dev xxxxxx autojoin
https://gist.github.com/PhilipSchmid/2597c23c68f21d938779aa92683d30b2
防火墙的配置:被动扫描是多播出站,然后服务器单播入站回来,等待 NOTIFY 则需要监听多播入站
UPS 断电通知 (TODO)
等买了 UPS 再更吧,基本不停电,也不是很急
而且买了 UPS 不能放养,需要定期线下维护(主要是放电),很麻烦
更新:IPv6 动态 DNS 免穿透
现在 IPv6 普及,可以走 v6 来避免内网穿透
一般家宽的 v6 地址不是固定的,所以需要动态 DNS (DDNS)
DDNS 有三种解决方案:一是买 DDNS 服务商的服务然后本地装 agent 定时通信,如 DynDNS;二是利用现有域名服务商的 API 手搓一个,配合 crontab 自动更新;三是在域名服务商处注册一个 ns 记录到 VPS,然后在 VPS 上搭 DNS 服务,本地和 VPS 定时通信
笔者这里就用 API 手搓的办法
先贴一个提取公网 IPv6 主机地址的正则
| |
基本流程都大差不差:先提取本地 v6 地址,然后查询服务商的 AAAA 记录,如果不同则添加一个新的 AAAA 记录,再删掉旧的记录(添加和删除的顺序不建议调换,为什么可以自己想一下);如果服务商没有存储 AAAA 记录,直接添加一个新的记录就好
ddns.py 脚本如下,笔者使用的服务商是 spaceship
| |
crontab 每小时过 5 分的时候更新
5 * * * * /path/to/ddns.py
PT
编译 transmission-daemon 4.1.0
| |
| |
更新:因为 tr 功能和性能都逊色于 qbt,现迁移至 qbittorrent-nox
| |
服务启动前需要以 bt_user 单跑一下 qbittorrent-nox 选择同意隐私声明
| |
/etc/systemd/system/qbittorrent-nox.service
[Unit]
Description=qBittorrent Command Line Client
After=network.target nss-lookup.target
[Service]
Type=forking
User=bt_user
Group=bt_user
ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=8080
Restart=on-failure
[Install]
WantedBy=multi-user.target
最好在配置中设置 WebUI 监听在 0.0.0.0,防止 IPv6 公网访问
更新:笔者曾误以为 qbt 采用单 socket 监听全部 ip 地址,然而 qbt 其实会在每个 ip 地址上各开一个套接字,如果某个 IPv6 地址遭到运营商更改,实测下来会导致 qbt 直接摆烂
总之,笔者这里还是采用和 DDNS 一样的思想,监听单个地址,然后定时触发 qbt 的 API 来更新
update_bt_ip.py
| |
一点吐槽:怎么会有人用 form 参数传 json 的?
SSH 代理本地管理页面
想远程访问如 miniDLNA 8200 和 qbt 8080 等管理页面可以借助 SSH 动态代理 ssh -D 1080 -N -o ServerAliveInterval=60 foo@example.com
接下来走 socks5 1080 即可