Skip to content

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) ALL

3、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 no

KbdInteractiveAuthentication配置项在不同版本中名称不同,旧版中可能称为ChallengeResponseAuthentication。建议同时设置两个以确保兼容性。

2、验证配置:在重启服务前,检查语法正确性。

bash
sshd -t

如果输出为空或显示no errors,则表示配置正确。

2、应用新配置:重启SSH服务使更改生效。

bash
systemctl restart sshd

3、打开新的终端进行连接测试,试试密码登录是否被拒。

防火墙配置

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.service

3、安装UFW管理防火墙规则

bash
apt -y install ufw
bash
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-problemACCEPT,不要动它们。

bash
sudo ufw reload

部署Fail2ban防暴力破解

bash
sudo apt -y install fail2ban
sudo vim /etc/fail2ban/jail.local
bash
[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 repolist
bash
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内网穿透服务

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.target

2、客户端(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 = 2200

frp开机自启可能会失败,以下方法参考

如果您的frpc.service文件中已经包含了After=network.targetWants=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-reload

frp客户端软件

不推荐使用,不稳定

1、frp客户端wingui
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 apparmor

2、创建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已启用。
如果输出是PermissiveDisabled,修改/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/user1

3、定义自定义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.pp

3)验证策略
加载策略后,可以使用以下命令验证SELinux的规则:

bash
sudo semodule -l | grep user1_whitelist

4、限制 user1 到该策略

为了确保user1的会话受到限制,可以为其分配SELinux用户和角色。

1)为user1指定SELinux用户
将用户user1绑定到一个受限制的SELinux用户,例如user_u:

bash
sudo semanage login -a -s user_u user1

2)验证绑定
检查是否成功绑定:

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