跳至主要內容

系统管理

chanchaw大约 15 分钟ubuntu

新系统配置

各种配置项

  • 巨坑的是新安装的 ubuntu 默认是不安装 ssh 的,所以当安装过程中提示要安装 openSSH 时要选择安装,否则在安装系统完毕后还要另外再安装

  • 启用 ufw 新系统默认 ufw (防火墙)没有开启,通过命令 sodu ufw enable 启用并且设置开机启动,执行下面命令开启常用端口

    # 查看防火墙状态
    sudo ufw status
    sudo ufw allow 80
    sudo ufw allow 8080
    sudo ufw allow 19834 # 端口22的自定义端口
    
  • 安装 ssh

    # 安装 ssh 服务
    sudo apt-get install openssh-server -y
    # 安装 iptables 持久化app,设置放行自定义 ssh 端口号后要用到
    # 相反,如果不持久化,电脑重启后 iptables 规则会自动恢复
    sudo apt install iptables-persistent -y
    # 安装 vim,后面修改 ssh 配置文件时要用到,不习惯用 nano
    sudo apt-get install vim -y
    
    # 启动服务
    sudo /etc/init.d/ssh start
    # 检查服务是否成功启动
    ps -aux|grep ssh
    # 修改配置文件,可修改端口号
    # 默认不允许使用密码连接,要开启该选项:PasswordAuthentication yes
    sudo vim /etc/ssh/sshd_config
    # 重启 ssh 服务
    service ssh restart
    
    # ubuntu默认不开启ufw,但是要在 iptables 中设置放行端口号
    sudo iptables -A INPUT -p tcp --dport 19834 -j ACCEPT
    sudo iptables -A INPUT -p udp --dport 19834 -j ACCEPT
    # 放行连续的多个端口的语法:
    # sudo iptables -A INPUT -p tcp --dport 19834:19899 -j ACCEPT
    # 也可以设置多个段落的端口
    sudo iptables -A INPUT -p tcp --dport 19834:19899,2001:2010 -j ACCEPT
    
    # 保存配置
    sudo netfilter-persistent save  # 如果已安装
    
    # 执行下面命令检测端口号是否有进程在监听,正常应该有 sshd 在监听
    # 如果没有任何响应则表示 sshd 没有开启,执行开启:service ssh restart
    sudo ss -tulnp | grep 19834
    
  • iptables

    # 清除所有配置
    sudo iptables -F
    sudo iptables -X
    sudo iptables -Z
    
    # 放行 SSH 端口号
    sudo iptables -A INPUT -i lo -j ACCEPT
    sudo iptables -A OUTPUT -o lo -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 19834 -j ACCEPT
    
    # 配置默认动作为拒绝,只允许流出数据,执行前请确保已经放行SSH端口号
    sudo iptables --policy OUTPUT ACCEPT # 允许所有输出数据包
    sudo iptables --policy FORWARD DROP  # 丢弃转发数据包
    sudo iptables -P INPUT DROP          # 丢弃输入数据包
    

注意

  • 新增的服务注意在 iptables 中放心端口号

中文乱码

使用 Termius 连接腾讯云网筒服务器,ubuntu22 系统,默认没有中文 utf8 字符集,导致 nginx 配置文件中文乱码,通过下面步骤安装并使用中文字符集

# 查看当前字符集
locale
# 腾讯云服务器的 ubuntu22 系统,默认会显示如下空白,表示没有使用字符集,即默认使用英文的字符集
LANG=
LANGUAGE=

# 执行下面命令安装中文字符集
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8
# 执行上面命令后重新登录服务器 ssh
# 执行下面两个命令设置字符集
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# 然后查看配置文件,中文OK
vim /etc/nginx/conf.d/barrel.fit.conf

# 查看是否设置了永久中文字符集
cat /etc/default/locale

# Grok提供了两种方法设置永久有效,但是自己试验后都没有效果,只有临时生效的命令执行后马上可以看到效果,一旦退出重新连接服务器,中文又会乱码。后来Grok又提出可能客户端通过 ssh 连接服务器时会将本地的字符集带到服务器上并覆盖,给出的解决方法是修改 ssh 配置文件 sudo vim /etc/ssh/sshd_config 注释代码 AcceptEnv LANG LC_* 然后刷新配置 sudo systemctl restart ssh 并重新连接,试验后依然无效。最后设置了用户环境变量解决掉了
# 编辑用户环境变量
vim ~/.bashrc
# 在文件最后添加下面两行代码,即用户登录后立即设置字符集
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# 执行下面代码更新配置,然后退出重新连接可以看到解决了中文乱码的问题
source ~/.bashrc

环境变量

查看环境变量
# 查看所有环境变量
printenv

# 或者使用 env
env

# 按页查看(如果变量很多)
printenv | less

# 查看 PATH
echo $PATH

# 查看 JAVA_HOME
echo $JAVA_HOME

# 查看 HOME 目录
echo $HOME

# 查看当前用户
echo $USER

# 查看当前 Shell
echo $SHELL

网络与端口号

# 检查端口号是否占用
sudo lsof -i:8081
静态IP

先通过命令 sudo apt install net-tools -y 安装网络工具,然后使用命令 route -n 查看当前自动获取到的IP 地址和 DNS ,或者使用 ip addr 查看当前动态获取到的并记录下来,通过下面步骤设置静态,将下面的代码保存为 ~/set_static_ip.sh

#!/bin/bash

# 交互式静态IP设置脚本

echo "=== Ubuntu 22.04 静态IP设置脚本 ==="

# 自动检测网络接口
INTERFACE_NAME=$(ip route | grep default | awk '{print $5}' | head -n1)
echo "检测到的网络接口: $INTERFACE_NAME"

# 显示当前IP配置
echo -e "\n当前IP配置:"
ip addr show $INTERFACE_NAME

# 用户输入配置
echo -e "\n请输入网络配置信息:"
read -p "IP地址 (默认: 192.168.0.122): " IP_ADDRESS
IP_ADDRESS=${IP_ADDRESS:-192.168.0.122}

read -p "子网掩码 (默认: 24): " SUBNET_MASK
SUBNET_MASK=${SUBNET_MASK:-24}

read -p "网关 (默认: 192.168.0.1): " GATEWAY
GATEWAY=${GATEWAY:-192.168.0.1}

read -p "DNS服务器 (逗号分隔, 默认: 114.114.114.114,223.5.5.5): " DNS_SERVERS
DNS_SERVERS=${DNS_SERVERS:-114.114.114.114,223.5.5.5}

NETPLAN_FILE="/etc/netplan/00-installer-config.yaml"

echo -e "\n配置摘要:"
echo "接口: $INTERFACE_NAME"
echo "IP地址: $IP_ADDRESS/$SUBNET_MASK"
echo "网关: $GATEWAY"
echo "DNS: $DNS_SERVERS"

read -p "确认应用此配置? (y/n): " CONFIRM

if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
    echo "操作已取消"
    exit 1
fi

# 备份原有配置
if [ -f "$NETPLAN_FILE" ]; then
    sudo cp "$NETPLAN_FILE" "$NETPLAN_FILE.backup.$(date +%Y%m%d%H%M%S)"
    echo "已备份原配置文件"
fi

# 创建新配置
sudo tee "$NETPLAN_FILE" > /dev/null <<EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    $INTERFACE_NAME:
      addresses:
        - $IP_ADDRESS/$SUBNET_MASK
      routes:
        - to: default
          via: $GATEWAY
      nameservers:
        addresses: [$DNS_SERVERS]
EOF

echo "配置文件已创建"

# 应用配置
echo "正在应用网络配置..."
sudo netplan apply

echo -e "\n静态IP设置完成!"
echo "验证命令:"
echo "  ip addr show $INTERFACE_NAME"
echo "  ping -c 3 $GATEWAY"

然后执行命令 sudo chmod +x set_static_ip.sh,然后执行 sudo ./set_static_ip.sh。如果报错

** (generate:4461): WARNING **: 14:10:47.184: Permissions for /etc/netplan/00-installer-config.yaml are too open. Netplan configuration should NOT be accessible by others.
WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running.

说明需要使用服务 ovsdb-server.service,但是这个服务没有在运行,通过命令 sudo apt install openvswitch-switch -y 安装,检查运行状态 sudo systemctl status openvswitch-switch 记得设置开机启动 sudo systemctl enable openvswitch-switch

执行命令 sudo chmod 600 /etc/netplan/00-installer-config.yaml 设置配置文件仅允许 root 读写,通过命令 ls -l /etc/netplan/00-installer-config.yaml 检查效果,显示类似 -rw------- 1 root root 说明设置成功。

解决上面两个报错后再次执行 sudo ./set_static_ip.sh 运行设置静态IP的脚本,注意脚本中的文件名是否和你本机目录 /etc/netplan 下的配置文件名称一致,如果不一致先修改上面脚本中的该配置文件名,是变量 NETPLAN_FILE 后面指定的文件名

外接设备

挂载硬盘

# 查看硬盘,包括接在主板上的和通过USB连接的USB存储设备
sudo fdisk -l

上图的 /dev/vdb 是等待挂载的 500G 的硬盘,下面步骤是格式化硬盘为 ext4 格式并挂载的步骤(该格式是 linux 专用)

# 格式化为 ext4 格式硬盘
sudo mkfs.ext4 /dev/vdb

# 查看硬盘UUID
sudo blkid /dev/vdb
# 输出类似下面
# /dev/vdb: UUID="630a6591-bdf9-443b-853d-47da75931168" BLOCK_SIZE="4096" TYPE="ext4"

# 下面是永久挂载的方法(服务器重启后自动挂载)
# 先创建准备挂载到的目录
sudo mkdir /mnt/data
# 修改挂载的设备表
sudo vim /etc/fstab
# 添加如下一行
UUID=630a6591-bdf9-443b-853d-47da75931168 /mnt/data ext4 defaults 0 0

# 保存后测试挂载
sudo mount -a  # 无报错即成功
# 验证挂载成功
sudo df -h /mnt/data

本地安装与apt

本地安装包通过命令 sudo apt install ./package.deb 安装软件

# 编辑源配置文件,注意先备份好
sudo vim /etc/apt/sources.list

# 复制下面代码到配置文件的最上面
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

# 执行下面代码更新,注意先设置好不更新系统内核
sudo apt update
sudo apt upgrade -y

Linux 所有防火墙

  • SELinux 是美国国家安全局发布的一个强制访问控制系统
  • Netfilter 是Linux 2.4.x引入的一个子系统,作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制
  • iptables 是Linux下功能强大的应用层防火墙工具
  • firewallcentos7 里面新的防火墙管理命令
  • ufwUbuntu 下的一个简易的防火墙配置工具

iptables

# 启动 iptables
modprobe ip_tables

# 关闭 iptables,要依次执行下面的命令。否则在执行modproble -r ip_tables时将会提示FATAL: Module ip_tables is in use.
iptables -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
modprobe -r ip_tables

# 清除预设表filter中的所有规则链的规则
iptables -F
# 清除预设表filter中使用者自定链中的规则
iptables -X
# 以数字形式查看iptables规则
iptables -L -n
# 抛弃所有不符合三种链规则的数据包
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# 允许IP访问
# 命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作(DROP、REJECT、ACCEPT)
iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT
# 开放SSH端口22
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -j ACCEPT
# 删除SSH端口22
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
iptables -D INPUT -p tcp --sport 22 -j ACCEPT

ufw

# 安装
sudo apt-get install ufw

# 设置为自启动,并设置默认拒绝所有外部访问
sudo ufw enable
sudo ufw default deny

# 查看防火墙状态
sudo ufw status

# 关闭防火墙
sudo ufw disable

# 开启与禁用端口
# 开启端口号允许被访问
sudo ufw allow 80
# 删除端口的放行规则
sudo ufw delete allow 80
# 允许来自指定IP的访问
sudo ufw allow from 192.168.1.1
# 禁止外部访问进程 smtp
sudo ufw deny smtp
# 删除指定名称的规则
sudo ufw delete allow smtp
# 重置所有规则
sudo ufw reset

# 打开ssh
sudo ufw allow 22
# 如果没有更改,则默认进程名称 ssh 对应的端口号就是22
# 所以上面放行22也可以使用下面命令替代
sudo ufw allow ssh
# 只打开 tcp/ip 协议的22端口
sudo ufw allow 22/tcp

# 放行指定程序
sudo ufw allow 'Nginx Full'

用户和权限权限

sudo每次都要求密码

由于 Sudo 用于记录认证时间的时间戳目录权限设置不正确,这存在安全风险,因此sudo会要求你每次都必须输入密码,执行下面命令修复时间戳目录的权限,这个命令会将目录权限设置为仅允许所有者(root)写入,其他用户只能读取和执行,修复这个权限问题后,sudo 默认的15分钟密码缓存机制应该就能正常工作了-6open in new window。这意味着成功输入一次密码后,在接下来的15分钟内再次使用sudo就不需要重复输入,

sudo chmod 0755 /run/sudo/ts

如果你觉得默认的15分钟太长或太短,可以通过下面命令调整保存密码的时长,timestamp_timeout 后面表示小时

echo 'Defaults timestamp_timeout=24' | sudo tee -a /etc/sudoers

用户相关

详情
# 查看指定用户所属的 group
groups chanchaw
# 返回如下数据
chanchaw : chanchaw adm cdrom sudo dip plugdev lxd docker
# 说明当前登录账号 chanchaw 属于组有:chanchaw,adm,sudo 等等
# 其中第一个 chanchaw 是账号所属的主要组

设置可执行权限

chmod +x 文件名称

取得管理员权限

# 执行下面命令后进入管理员角色
sudo su
# 退出管理员
su 用户名

递归设置文件夹及文件

普通用户通过 MobaXterm 上传文件时会提示没有权限,要通过下面命令递归设置目录和文件权限后才可以上传

# 表示设置当前 cmd 所在路径下的所有子目录以及其中的文件的读写运行权限给当前用户
# 后面的参数 -R 表示递归设置所有目录和文件
# 当前处于 /usr 目录下,执行下面命令表示设置 /usr/local 下的所有子目录和文件的读写执行权限给当前用户
# 有了写入目录的权限才能上传文件
sudo chmod 777 local -R

cd没有权限

# 使用 cd 目录切换路径时提示没有权限,使用下面命令查看目录的权限
ls -ld /etc/wireguard/
# 显示如下
# drwx------ 2 root root 4096 Jul 26 12:27 /etc/wireguard/
# 表示只允许 root 账号读写,通过下面命令赋予当前账号权限
# d后面的 rwx 3个位分别对应 root 账号的读写执行
# 后面3个 - 表示所属组的读写执行权限
# 最后3个 - 表示其他用户的读写执行权限
sudo chmod 755 /etc/wireguard/
# 之后就可以切换到这个没有权限的目录了

注意

不可以 sudo chmod -R 777 usr 设置该目录的权限,会导致无法再使用 root 的情况,所以新系统记得先设置 root 密码

# 使用下面命令设置 root 的密码(先以普通用户登录系统)
sudo passwd
# 使用下面命令切换到 root 用户
su - root

文件系统

格式化USB设备的硬盘,下面的命令是格式化为 exfat 格式,兼容 Windows/macOS/Linux 并且指示单文件超过4G

# 设置当前目录下的 data 目录为可读写+执行权限
# 当前用户读写+执行
# 当前组读写+执行
# 其他用户读写+执行
# -R 表格递归
sudo chmod -R 777 data


# 格式化USB设备
sudo mkfs.exfat /dev/sdc1
# 如果提示没有该命令则需要先下载安装
sudo apt install exfatprogs
# 查看挂载的USB设备,一般为 sdb1,sdc1,sdd1
lsblk
# 挂载USB设备到本地目录,后面的 /media/sdb 是本机目录
sudo mount /dev/sdb1 /media/sdb
sudo mount /dev/sdd1 /media/sdd

# 给新的挂载点赋予读写权限,uid=1000 表示当前用户,可通过 id -u 查看得到
# /dev/sdf1 表示USB设备
# /srv/jellyfin/media/shareav 是USB设备挂载到的目录
sudo mount -o rw,uid=1000 /dev/sdf1 /srv/jellyfin/media/shareav

# 卸载上面的挂载
sudo umount /srv/jellyfin/media/shareav

系统指令

# 关机,-p 表示关闭电源
sudo halt -p
# 10分钟后自动关机
sudo shutdown -h 10
# 立刻关机
sudo shutdown -h now
# 查看位数(x86或者64位系统)
getconf LONG_BIT

时区

# 查看当前时区
date -R
# 修改时区,执行下面命令
tzselect
# 然后选择亚洲,中国,北京
# 复制文件
cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
# 再次调用第一个命令查看时区

IP

L2TP

注意如果是新安装的系统要做类似 CentOS 的禁用更新内核一样的操作,保证更新软件包时不更新系统内核,见本文 [锁定内核版本,阻止自动更新]

# 1. 更新软件包
sudo apt upgrade -y
# 2. 安装依赖
sudo apt install xl2tpd strongswan ppp -y
# 3. 配置 IPsec
sudo vim /etc/ipsec.conf
# 添加以下内容:
config setup
    charondebug="ike 2, knl 2, cfg 2"
    uniqueids=no

conn %default
    keyexchange=ikev1
    authby=secret
    ike=aes128-sha1-modp1024!
    esp=aes128-sha1!

conn L2TP-PSK
    keyexchange=ikev1
    authby=secret
    type=transport
    left=<Your Server IP>
    leftprotoport=17/1701
    right=<VPN Server IP>
    rightprotoport=17/1701
    auto=start

# 4. 配置预共享密钥
sudo vim /etc/ipsec.secrets
# 添加下面内容
192.168.1.121 乐达3天翼云服务器外网IP : PSK "chanchaw"

# 5. 配置 xl2tpd
sudo vim /etc/xl2tpd/xl2tpd.conf
# 添加下面代码
[global]
port = 1701

[lns default]
ip range = 192.168.1.128-192.168.1.254
local ip = 192.168.1.99
refuse chap = yes
refuse pap = yes
require authentication = yes
name = ccusl2tpd
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

# 6. 配置 PPP
sudo vim /etc/ppp/options.xl2tpd
# 添加下面代码
require-mschap-v2
refuse-eap
refuse-pap
refuse-chap
refuse-mschap
noccp
auth
mtu 1280
mru 1280
lock
connect-delay 5000
name ccusl2tpd
lcp-echo-interval 30
lcp-echo-failure 4

# 7. 配置 PPP 用户认证
sudo vim /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
devUbuntuServerXsmf ccusl2tpd 7758chanchaw 121.224.72.159

# 8. 启动和启用服务
sudo systemctl restart strongswan
sudo systemctl enable strongswan

sudo systemctl restart xl2tpd
sudo systemctl enable xl2tpd

# 9. 连接到 VPN
sudo ipsec up L2TP-PSK
sudo xl2tpd
sudo ipsec down L2TP-PSK

# 使用下面命令查看联通日志
sudo tail -f /var/log/syslog

更新软件包

概述

关于软件包更新的使用见下面命令

apt update                 只检查,不更新(已安装的软件包是否有可用的更新)
apt list --upgradable      列出升级的软件包列表
apt-mark hold 软件包        标记指定软件包为保留(held back),阻止软件自动更新
apt-mart unhold 软件包      取消指定软件包的保留(held back)标记,解除阻止自动更新
apt-mark showhold          列出设为保留的软件包
apt upgrade                更新

更新软件包

sudo apt update
sudo apt upgrade -y

锁定内核版本,阻止自动更新

锁定内核版本的方法见下面命令

# 使用下面命令查看当前内核版本号
uname -r
# 如果查询到的版本号是:5.15.0-78-generic
# 使用下面命令锁定所有与该版本相关的软件包,从而不更新
sudo apt-mark hold linux-image-5.15.0-78-generic linux-headers-5.15.0-78-generic linux-modules-5.15.0-78-generic linux-modules-extra-5.15.0-78-generic

# 下面还是禁用自动更新,将所有配置项目都修改为0
sudo vi /etc/apt/apt.conf.d/10periodic

下面是阻止自动更新

# 使用管理员权限编辑配置文件
sudo vi /etc/apt/apt.conf.d/20auto-upgrades
# 打开文件后显示的两行配置项都修改为0
# 然后使用:wq!,强制保存退出(文件原属性是只读的)
# 注意设置配置文件后要重启系统:reboot