Appearance
Linux的一些零散内容
Debian云服务器初始化
更新软件
bash
apt update # 更新软件包列表,不更新软件
apt upgrade # 更新软件包
apt -y install vim bash-completion更改主机名
1、更改后重新登录就生效,不需要重启
bash
hostnamectl set-hostname nameDDD
hostnamectl # 查看主机名信息2、如果是直接更改文件/etc/hostname,需要重启才能生效,或者以下命令重置一下服务
bash
systemctl restart systemd-hostnamed创建用户并更改密码
bash
passwd # 更改密码
useradd user1 # 创建用户
passwd user1设置sudo权限:
bash
visudo # vim /etc/sudoers 为了安全考虑建议使用visudo去更改,能避免因语法错误导致的权限问题
user1 ALL=(ALL) ALL3、debian12最小化安装时候新增的用户默认$SHELL为/bin/sh,并且没有创建家目录
bash
sudo chsh -s /bin/bash user1
sudo mkdir -p /home/user1
sudo chown user1:user1 /home/user1
sudo chmod 755 /home/user1
sudo cp -r /etc/skel/. /home/user1
sudo chown -R user1:user1 /home/user1本地RockyLinux生成密钥对
1、本地RockyLinux登录到需要创建密钥对的账户,这里的账户为user1
bash
ssh-keygen -t ed25519 -C "user1@rocky9-local" -f ~/.ssh/debian_ed25519-t ed25519: 强烈推荐使用Ed25519算法,它比传统的RSA算法更安全、更快,密钥体积也更小。
-C "...": 添加一个注释,方便日后识别密钥,通常可以写成 "用户名@主机名" 的形式。
-f ~/.ssh/debian_ed25519: 私钥将保存为~/.ssh/debian_ed25519,公钥会自动生成在同目录下,命名为debian_ed25519.pub。
交互过程说明:
bash
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/username/.ssh/id_ed25519): ← 直接回车使用默认路径,或输入自定义路径
Enter passphrase (empty for no passphrase): ← 输入密码短语(推荐设置,增强安全性)
Enter same passphrase again: ← 再次输入密码短语建议为私钥设置一个强密码短语,即使私钥泄露,攻击者也难以直接使用。
将公钥部署到远程服务器:
bash
ssh-copy-id -i ~/.ssh/debian_ed25519.pub user1@ip连接:
bash
ssh -p 22 -i ~/.ssh/debian_ed25519 user1@ip加固云服务器
1、修改sshd_config配置文件
bash
su - root
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
vim /etc/ssh/sshd_config修改并确认以下关键配置项:找到或添加以下行,确保它们没有首部的 # 注释符。
bash
# 更改默认端口
Port 2222
# 确保密钥认证开启
PubkeyAuthentication yes
# 禁止root用户远程登录
PermitRootLogin no
# 禁止所有用户使用密码登录
PasswordAuthentication no
# 禁止质询响应认证(另一种密码形式)
ChallengeResponseAuthentication no
# 禁止空密码登录
PermitEmptyPasswords no
# 允许 user1 这个用户通过ssh登录,定义账户白名单,写了AllowUsers之后,其他全部不允许,多个用户之间用空格隔开
AllowUsers user1关键注意: Debian12默认开启了PAM认证 (UsePAM yes),这可能导致即使PasswordAuthentication设为no,密码登录依然生效。为确保万无一失,需要同时禁用键盘交互认证:
bash
# 禁用键盘交互认证,彻底关闭密码登录通道
KbdInteractiveAuthentication noKbdInteractiveAuthentication配置项在不同版本中名称不同,旧版中可能称为ChallengeResponseAuthentication。建议同时设置两个以确保兼容性。
2、验证配置:在重启服务前,检查语法正确性。
bash
sshd -t如果输出为空或显示no errors,则表示配置正确。
2、应用新配置:重启SSH服务使更改生效。
bash
systemctl restart sshd3、打开新的终端进行连接测试,试试密码登录是否被拒。
防火墙配置
1、debian12默认防火墙的底层框架是nftables,从Debian10(Buster)开始,系统就已经把nftables作为默认的内核包过滤框架,取代了传统的iptables。
bash
which nft
# 通常输出 /usr/sbin/nft
nft --version
# nftables v1.0.6 (Lester Gooch) 之类2、默认不启动并没有任何规则
bash
systemctl status nftables
# 大概率显示 inactive (dead)
sudo nft list ruleset
# 输出为空(或者仅有一行 "table inet filter" 但没有任何规则)bash
systemctl start nftables.service
systemctl enable nftables.service3、安装UFW管理防火墙规则
bash
apt -y install ufwbash
sudo ufw default deny incoming # 默认拒绝所有入站
sudo ufw default allow outgoing # 允许所有出站
sudo ufw allow 2222/tcp # 仅放行自定义SSH端口
sudo ufw allow 80,443/tcp # 按需开放Web服务端口
sudo ufw allow 1000:2000/tcp # 允许 TCP 端口 1000 到 2000(含两端)
sudo ufw allow 1000:2000/udp # 同理,UDP 范围
sudo ufw enable # 开启防火墙(同时设置开机自启)
sudo ufw disable # 关闭防火墙(清空规则并取消开机自启)
sudo ufw reload # 重新加载规则(比如修改了 /etc/ufw/*.rules 后)4、查看ufw当前的规则和开放端口
方法一:
bash
sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
1000:2000/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
1000:2000/tcp (v6) ALLOW Anywhere (v6)如果显示Status: inactive,说明防火墙尚未启用(即使你装了UFW,也没有生效)。
方法二:
bash
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
1000:2000/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
...默认入站策略: deny (incoming) —— 所有没有明确放行的入站连接都会被拒绝。
默认出站策略: allow (outgoing) —— 本机发出去的流量全放行。
5、查看带编号的规则(方便删除)
bash
sudo ufw status numbered # 输出会将每条规则加上序号
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
sudo ufw delete 1 # 删除第 1 条规则禁止ping
bash
sudo cp /etc/ufw/before.rules /etc/ufw/before.rules.backup
sudo vim /etc/ufw/before.rules找到下面这一段(通常在文件后半部分的# ok icmp codes for INPUT下方):
bash
# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT # ← 这一行允许 Ping注释掉Ping那行:
bash
# -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT或者直接改为DROP(效果相同,但更明确):
bash
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP注意: 保留上面三条destination-unreachable、time-exceeded、parameter-problem的ACCEPT,不要动它们。
bash
sudo ufw reload部署Fail2ban防暴力破解
bash
sudo apt -y install fail2ban
sudo vim /etc/fail2ban/jail.localbash
[DEFAULT]
# ========== 白名单(非常重要) ==========
# 保留内网地址,避免内部通信被封。
# 因为你没有固定公网IP,这里不再添加动态的家庭IP。
# 如果以后有了跳板机或固定IP,再追加即可。
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
# 封禁时长(秒),无固定IP时建议设短,如 600(10分钟)或使用增量封禁
bantime = 600
# 统计窗口(秒),10分钟内的失败次数达到 maxretry 即封禁
findtime = 600
# 最大失败次数,可适当放宽到 5,避免手滑把自己封了
maxretry = 5
# 封禁动作(iptables-allports 或 ufw,二选一)
banaction = iptables-allports
# banaction = ufw
# 执行的动作,仅封禁,不发送邮件
action = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s"]
# 日志读取方式,auto 自适应
backend = auto
# ========== SSH 防护规则 ==========
[sshd]
enabled = true
filter = sshd
logpath = /var/log/auth.log
port = ssh # 若修改过SSH端口,请改为实际端口号,例如 2222
maxretry = 5 # 可单独覆盖,此处与全局一致
# ----- 以下为增量封禁(可选,推荐启用) -----
# 首次只封5分钟,重复犯错会越来越长,既保护自己,也惩罚攻击者
bantime = 300 # 基础封禁时间
bantime.increment = true
bantime.factor = 2 # 倍数
bantime.maxtime = 86400 # 最长封禁(1天)
# bantime.rndtime = 300 # 随机延迟,可选,让攻击者无法预测解封时间SSH端口: 如果改过,把port = ssh换成具体数字。
日志文件: 如果系统Ubuntu 22.04+且使用systemd-journald,可能没有/var/log/auth.log。此时把backend改为systemd,并注释掉logpath这一行(前面加 #)。
bash
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd # 查看运行状态CentOS云服务器初始化
更改主机名
1、更改后重新登录就生效,不需要重启
bash
hostnamectl set-hostname hwdnc
hostnamectl //查看主机名信息2、如果是直接更改文件/etc/hostname,需要重启才能生效,或者以下命令重置一下服务
bash
systemctl restart systemd-hostnamed更改yum源并更新系统
bash
yum -y install bash-completion vim net-tools gcc gcc-c++
yum -y install epel-release
uname -a
yum -y update
yum clean all
yum makecache
yum repolistbash
sudo dnf autoremove
//这个命令会删除不再需要的依赖包(通常是安装时自动安装的,但现在不再被任何包所依赖的包)。关闭selinux
bash
vi /etc/selinux/config
改为 disabled
passwd //更改密码
useradd user1 //创建用户
passwd user1
设置 sudo 权限
visudo // vim /etc/sudoers 为了安全考虑建议使用visudo去更改,能避免因语法错误导致的权限问题
user1 ALL=(ALL) ALL创建密钥对并上传到服务器
1、在客户机上创建密钥对(注意先进入用户user1)
bash
ssh-keygen -t rsa //两次都直接回车
ls -lh /home/user1/.ssh/id_rsa* //带pub的是公钥2、将客户机上user1用户的公钥部署到ssh服务器
bash
ssh-copy-id user1@0.0.0.0 //为服务器的用户及ip此时服务器会多出文件/home/user1/.ssh/authorized_keys
记得这时候测试免密登录成功再做接下来的操作
添加开放一段tcp端口
在服务器操作
bash
firewall-cmd --permanent --add-port=2000-3000/tcp //开启2000-3000
firewall-cmd --reload //更新防火墙规则
firewall-cmd --list-all //查看当前所有规则
firewall-cmd --zone=public --list-ports //查看所有打开的端口
firewall-cmd --permanent --remove-port=20001-50003/tcp //删除开放端口服务器端的操作
bash
vi /etc/ssh/sshd_config
Port 2020
PermitRootLogin no //禁止root用户通过ssh登录,no就是不允许
PasswordAuthentication no //要不要允许密码登录,如果是no,密码输入对了也不可以,只能密钥登录
AllowUsers user1 //允许 user1 这个用户通过ssh登录,定义账户白名单,写了AllowUsers之后,其他全部不允许,多个用户之间用空格隔开
systemctl reload sshd重启 (restart):完全停止并重新启动服务,会断开用户连接。
重新加载 (reload):不停止服务,只更新配置,通常不会影响当前连接。
批量更改文件名的shell脚本
脚本功能:根据给出的文件,批量修改特定目录下的文件名
以下是脚本内容
shell
#!/bin/bash
sudo rm -rf /date/www*
sudo cp -R /date/smb/* /date/www
# 定义要检查的目录
directories=(
"/date/wwwlinux"
"/date/wwwmore"
"/date/wwwown"
"/date/wwwworknote"
)
# 读取映射配置文件(file_map.txt),并将其加载到文件名映射数组中
declare -A file_map
while IFS='=' read -r original_name new_name; do
# 忽略空行和注释行
if [[ -n "$original_name" && ! "$original_name" =~ ^# ]]; then
file_map["$original_name"]="$new_name"
fi
done < "/home/user1/file_map.txt"
# 遍历目录
for dir in "${directories[@]}"; do
sudo echo "正在处理目录: $dir"
# 遍历文件映射关系
for original_name in "${!file_map[@]}"; do
# 构建完整的文件路径
full_original_name="$dir/$original_name"
full_new_name="$dir/${file_map[$original_name]}"
# 检查原文件是否存在
if [[ -f "$full_original_name" ]]; then
# 重命名文件
sudo mv "$full_original_name" "$full_new_name"
sudo echo "文件 '$full_original_name' 已重命名为 '$full_new_name'"
# 删除原文件(如果你需要删除源文件,注意此步是冗余的,因为文件已经被重命名)
sudo rm -rf "$full_original_name"
sudo echo "文件 '$full_original_name' 已删除。"
else
sudo echo "文件 '$full_original_name' 不存在,跳过重命名和删除。"
fi
done
done
# 在所有的 .html 文件中的第5行添加 <link rel="icon" href="./picture/dnc32.ico" type="image/x-icon">
sudo find /date/www -type f -name "*.html" -exec sed -i '5i <link rel="icon" href="./picture/dnc32.ico" type="image/x-icon">' {} \;
sudo rm -rf /date/wwwdesktop.ini
sudo find /date/www -type f -name "*.md" -exec rm -f {} \;以下是file_map.txt文件的内容,内容格式源文件名=新文件名。
shell
windows.html=34365.html
win-bluecode-error.html=11623.html
key-cmd.html=19582.html
printer.html=15272.html
projector.html=83874.html
network-device.html=52323.html
active-directory.html=76026.html
date-backup.html=45043.html执行脚本就会将windows.html改名为34365.html,将win-bluecode-error.html改名为11623.html,以此类推。
安装frp内网穿透服务
1、服务器端(frps)
bash
tar -xzvf frp_0.60.0_linux_amd64.tar.gz
rm -rf frpc* //服务端删除掉客户端的相关配置
vim frps.toml
bindPort = 2100
auth.method = "token"
auth.token = "anerj45653"
vim /etc/systemd/system/frps.service //使用systemd来管理frps服务的运行情况
[Unit]
Description = frp server
After = network-online.target syslog.target
Wants = network-online.target
[Service]
Type = simple
ExecStart = /home/user1/frps/frps -c /home/user1/frps/frps.toml
[Install]
WantedBy = multi-user.target2、客户端(frpc)
bash
$ cat frpc/frpc.toml
serverAddr = "8.8.8.8"
serverPort = 2100
auth.method = "token"
auth.token = "anerj45653"
[[proxies]]
name = "you-name"
type = "tcp"
localIP = "172.30.0.15"
localPort = 3389
remotePort = 3389
[[proxies]]
name = "name2"
type = "tcp"
localIP = "172.30.0.20"
localPort = 22
remotePort = 2200frp开机自启可能会失败,以下方法参考
如果您的frpc.service文件中已经包含了After=network.target和Wants=network.target,但仍然出现启动失败的问题,可以考虑以下几个方向:
方法一:
网络延迟: 有时即使网络目标已经被标记为可用,实际的网络连接可能还没有完全准备好。可以尝试将After=network.target修改为After=network-online.target,并添加Wants=network-online.target,确保在网络完全可用时再启动服务:
bash
[Unit]
Description = frp server
After = network-online.target syslog.target
Wants = network-online.target服务依赖: 确保没有其他服务在启动时影响到网络连接,检查其他服务的启动顺序。
方法二:
增加延迟: 在 ExecStart 之前添加一个ExecStartPre命令,使用sleep命令延迟启动,例如:
bash
[Service]
Type = simple
ExecStartPre = /bin/sleep 5
ExecStart = /home/user1/frpc/frpc -c /home/user1/frpc/frpc.toml日志检查: 重启后查看frpc.service的日志,确保没有其他错误信息可以提供更多线索:
bash
journalctl -u frpc.service注意修改systemd文件后需要重置服务
bash
systemctl daemon-reloadfrp客户端软件
不推荐使用,不稳定
1、frp客户端win版gui
github 地址1
github 地址2
2、frpee 官网
Linux内核安全模块(AppArmor)
AppArmor(Application Armor)是一个Linux内核安全模块,用于限制程序的能力和访问权限。它通过定义应用程序的安全配置文件,来控制程序可以访问的文件、网络、设备等资源,从而增强系统的安全性,debian系默认。
eg:给用户user1设置仅对/home/user1文件拥有所有权,而用户user1对其他的所有系统目录都没有任何权限,读取的权限都没有,步骤如下:
1、安装AppArmor
bash
sudo apt install apparmor
sudo systemctl enable apparmor
sudo systemctl start apparmor2、创建AppArmor策略
编写一个自定义的策略文件来限制user1的访问。创建一个文件/etc/apparmor.d/usr.bin.user1_profile。
文件内容可以类似这样:
bash
#include <tunables/global>
/home/user1/** rix,
/home/user1/ rix,
/usr/bin/** PUx,
# Deny access to other system directories
deny /bin/** rwx,
deny /etc/** rwx,
deny /usr/** rwx,
deny /lib/** rwx,
deny /var/** rwx,
deny /dev/** rwx,
deny /sys/** rwx,
deny /proc/** rwx,3、应用策略
加载该AppArmor策略:
bash
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.user1_profile这样用户user1只会被允许访问/home/user1,其他系统文件都会被禁止访问。
Linux内核安全模块(SELinux)
SELinux(Security-Enhanced Linux)是一个Linux内核安全模块(LSM),它提供了强制访问控制(MAC)机制。SELinux由美国国家安全局(NSA)开发,并被集成到Linux内核中,以增强系统的安全性,redhat系默认。
eg:给用户user1设置仅对/home/user1文件拥有所有权,而用户user1对其他的所有系统目录都没有任何权限,读取的权限都没有,步骤如下:
1、确保SELinux已启用
检查并启用SELinux(以Enforcing模式运行)
bash
getenforce如果输出是Enforcing,表示SELinux已启用。
如果输出是Permissive或Disabled,修改/etc/selinux/config文件
bash
vim /etc/selinux/config
SELINUX=enforcing然后重启系统
2、安装必要工具
确保系统安装了管理SELinux的工具
bash
sudo yum -y install policycoreutils selinux-utils selinux-basics
sudo chown user1:user1 /home/user13、定义自定义SELinux策略
1)编写策略文件
bash
sudo vim user1_whitelist.te
module user1_whitelist 1.0;
require {
type unconfined_t;
type user_home_dir_t;
type etc_t;
class file { read write getattr open };
class dir { read open getattr search };
}
# 允许访问 /home/user1
allow unconfined_t user_home_dir_t:dir { read open getattr search };
allow unconfined_t user_home_dir_t:file { read write getattr open };
# 阻止访问 /etc
dontaudit unconfined_t etc_t:dir { read open getattr search };
dontaudit unconfined_t etc_t:file { read write getattr open };2)编译并加载策略
使用以下命令编译和加载策略模块:
bash
checkmodule -M -m -o user1_whitelist.mod user1_whitelist.te
semodule_package -o user1_whitelist.pp -m user1_whitelist.mod
sudo semodule -i user1_whitelist.pp3)验证策略
加载策略后,可以使用以下命令验证SELinux的规则:
bash
sudo semodule -l | grep user1_whitelist4、限制 user1 到该策略
为了确保user1的会话受到限制,可以为其分配SELinux用户和角色。
1)为user1指定SELinux用户
将用户user1绑定到一个受限制的SELinux用户,例如user_u:
bash
sudo semanage login -a -s user_u user12)验证绑定
检查是否成功绑定:
bash
semanage login -l | grep user1输出应类似于:
bash
Login Name SELinux User MLS/MCS Range Service
user1 user_u s0 *这样用户user1只会被允许访问/home/user1,其他系统文件都会被禁止访问。
5、调试(如果需要)
如果user1遇到拒绝访问的情况但实际上需要某些权限,你可以使用audit2allow来分析并生成新的策略。
查看拒绝日志,检查SELinux日志文件:
bash
sudo ausearch -m AVC生成规则,将拒绝日志转换为新规则:
bash
sudo ausearch -m AVC | audit2allow -M fix_user1
sudo semodule -i fix_user1.pp