洋蔥

耳不闻人是非,目不视人之短,口不言人之过。

Ubuntu Server 24.04 LTS

以下是部分安装步骤,其他步骤请直接点击【Done】继续。

网络配置

配置ubuntu存档镜像

自定义存储布局

Ubuntu最佳分区方式:只需要两个分区 /swap 。swap 一般设置为 2 倍或 1.5 倍的 RAM。

下面创建根分区(/),不创建 swap 分区:

配置用户名密码

跳过 Ubuntu Pro

Ubuntu Pro 是 Canonical 推出的 企业级付费支持和增强服务,在普通 Ubuntu 的基础上增加了安全更新、合规性工具和长期支持等功能,主要面向企业或专业用户。

个人用户 / 小团队

  • Ubuntu Pro 对个人用户有免费额度(通常支持 5 台机器免费激活)。

企业用户 / 大规模部署

  • 需要付费订阅,可享受官方 SLA 支持、更多机器数量和附加安全服务。

开启ssh远程

常用的snap包

安装完成后重启

重启

删除安装介质

重启后,Ubuntu 会提示移除安装镜像。

具体操作:取消 虚拟机设置 中的设备 启动时连接,然后按 Enter。

安装中文环境

安装英文版ubuntu,在打开含有中文字符文件时会乱码,有需要给Ubuntu Server装中文环境

1、安装之前,执行 echo $LANG
屏幕显示:en_US.UTF-8
说明现在是英语环境,需要切换到中文环境。

2、安装中文语言包

apt-get update && apt-get install language-pack-zh-hans

3、vim /etc/default/locale
把原来英语 US 的都换成如下的内容,并且注意配置文件中不能有多余的空格

1
2
3
4
5
6
7
8
9
10
11
12
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh"
LC_NUMERIC="zh_CN"
LC_TIME="zh_CN"
LC_MONETARY="zh_CN"
LC_PAPER="zh_CN"
LC_NAME="zh_CN"
LC_ADDRESS="zh_CN"
LC_TELEPHONE="zh_CN"
LC_MEASUREMENT="zh_CN"
LC_IDENTIFICATION="zh_CN"
LC_ALL="zh_CN.UTF-8"

4、vim /etc/environment
原来有一行 PATH=.. 不要动这一行
另起一行,复制粘贴以下内容,并且注意配置文件中不能有多余的空格

1
2
3
4
5
6
7
8
9
10
11
12
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh"
LC_NUMERIC="zh_CN"
LC_TIME="zh_CN"
LC_MONETARY="zh_CN"
LC_PAPER="zh_CN"
LC_NAME="zh_CN"
LC_ADDRESS="zh_CN"
LC_TELEPHONE="zh_CN"
LC_MEASUREMENT="zh_CN"
LC_IDENTIFICATION="zh_CN"
LC_ALL="zh_CN.UTF-8"

5、重启机器 reboot

CentOS-8.1.1911

以下是部分安装步骤,其他步骤可以根据实际需求自行选择。

软件选择

安装目标位置(自定义分区)

网络和主机名

root密码

安装完成后重启

重启

删除安装介质

重启完成后操作:取消 虚拟机设置 中的设备 启动时连接

解锁root用户

1
2
3
4
5
6
7
sudo passwd -S root # 查看 root 状态
sudo passwd -l root # -l → Locked(锁定用户)
sudo passwd -u root # -u → unlock(解锁用户)
sudo passwd -d root # 删除 root 的密码(删除 /etc/shadow 里的加密串)
sudo passwd root # 设置root用户的密码

su root # 测试是否可以进入 root 用户

开启root用户远程登录

安装SSH

先检查是否安装

1
2
dpkg -l | grep ssh
rpm -qa | grep ssh

开放本机 SSH 服务,请安装服务端:

1
2
apt install openssh-server
dnf install openssh-server

连接远程主机,请安装客户端:

1
2
apt install openssh-client
dnf install openssh-client

查看SSH服务

1
2
3
ps -ef | grep ssh
systemctl status ssh # Ubuntu 上服务名是 ssh
systemctl status sshd # CentOS 上服务名是 sshd

SSH配置文件

ssh 有两个主要的配置文件,它们的作用和针对的对象不同

特性 ssh_config sshd_config
角色 客户端配置 服务端配置
进程 ssh (当使用 ssh 远程连接时会看到该进程) sshd (SSH Daemon 是一个守护进程,它一直在监听连接请求)
控制 客户端如何发起连接 服务器如何接受连接
位置 /etc/ssh/ssh_config~/.ssh/config 通常是 /etc/ssh/sshd_config
生效 立即生效(客户端读取) 需要重启服务 (sshd)

客户端配置手册:https://manpages.debian.org/trixie/openssh-client/ssh_config.5.en.html

服务端配置手册:https://manpages.debian.org/trixie/openssh-server/sshd_config.5.en.html

客户端常用配置项

配置项 作用 常用值/说明
Host 定义一个别名或模式,其后的配置将对该别名生效。 别名如 myserver,模式如 *192.168.1.*
HostName 远程主机的实际地址(IP 或域名)。 如果与 Host 别名不同时才需要设置。
User 连接远程主机时默认使用的用户名。 省略则使用本地用户名。
Port 远程主机的端口。 如果远程服务器端口不是默认的 22,则在此设置。
IdentityFile 用于公钥认证的私钥文件路径。 例如 ~/.ssh/id_rsa。可以为不同主机指定不同的密钥。
ServerAliveInterval 客户端向服务器发送“保活”消息的间隔时间(秒)。 设为 60 可防止本地网络闲置导致的连接中断。
ConnectTimeout SSH 连接建立的最大等待时间(秒)。 避免因网络问题导致长时间卡死。
ProxyCommand 【高级】 通过执行一个外部命令来建立与远程服务器的连接。 例如:ProxyCommand ssh -p 22 -W %h:%p jumpbox
常用于通过 SOCKS 代理或老版本跳板机。
-p 22:连接跳板机的port。
-W %h:%p转发选项,告诉 SSH 客户端:建立连接后,请在远程主机上执行一个转发操作到 %h:%p%h 是目标主机,%p 是目标端口。
jumpbox:连接的跳板机的IP
ProxyJump 【推荐】 指定一个或多个跳板机(Bastion Host)。 例如:ProxyJump jump.example.com。功能上取代了大部分 ProxyCommand 的跳板用途。

服务端常用配置项

配置项 作用 常用值/说明
Port 指定 SSH 服务监听的端口。 默认为 22。为了安全,常改为其他端口(如 2222)。
ListenAddress 指定 SSH 服务绑定的网络接口 IP。 默认为 0.0.0.0(所有接口)。可设为特定 IP 以限制访问。
PermitRootLogin 是否允许 root 用户直接通过 SSH 登录。 推荐设为 no。应使用普通用户登录后再切换到 rootsusudo)。
PasswordAuthentication 是否允许使用密码进行身份验证。 推荐设为 no。当使用公钥认证时,禁用密码可以大大提高安全性。
PubkeyAuthentication 是否允许使用 公钥 进行身份验证。 通常设为 yes。这是最安全的登录方式。
AllowUsers / DenyUsers 明确允许或拒绝某些用户登录。 例如:AllowUsers user1 user2@192.168.1.10
MaxAuthTries 每个连接允许的最大认证尝试次数。 默认为 6。较低的数值可以阻止暴力破解。
ClientAliveInterval 服务器向客户端发送“保活”消息的间隔时间(秒)。 默认为 0(不发送)。设为 3060 可防止连接因超时而被关闭。

允许Root用户远程登录

编辑服务端配置文件:vim /etc/ssh/sshd_config

找到并修改:

1
2
3
4
#PermitRootLogin prohibit-password
PermitRootLogin yes # 允许root用户登录

#PasswordAuthentication yes # 指定是否使用密码认证。此关键字的参数必须为 yes(默认值)或 no

重新加载配置:

1
2
3
systemctl reload ssh   # 仅重新加载配置,不中断现有会话
#
systemctl restart ssh # 重启服务,会断开现有会话

测试登录

从远程机器执行:

1
ssh root@服务器IP

卸载无用的系统服务

1
2
3
4
# 查看所有正在运行的服务
systemctl list-units --type=service --state=running
# 查看开机启动的服务
systemctl list-unit-files --type=service --state=enabled

禁用swap分区

https://man.archlinux.org/man/swapoff

https://man.archlinux.org/man/swapon

临时禁用(立即生效,重启失效)

1
2
3
4
cat /proc/swaps
swapoff -a # 禁用 /proc/swaps 中的所有 swaps
swapon --show
free -h

永久禁用 Swap 自动挂载

1
2
3
4
# 编辑 /etc/fstab 文件
vim /etc/fstab
# 找到包含 swap 关键字的行,并注释掉。
#/swap.img none swap sw 0 0

删除Swap分区

略…

删除Swap文件(针对 Swap 文件用户)

1
2
3
# 如果您的Swap不是一个分区,而是一个文件(例如 /swap.img),您还需要删除该文件。
# 如果Swap是一个分区,您也可以尝试删除它,但这可能需要更复杂的LVM 操作。
rm -rf /swap.img

换源

https://developer.aliyun.com/mirror/ubuntu

https://developer.aliyun.com/mirror/centos

ubuntu 查看源

1
2
3
4
5
cat /etc/apt/sources.list                                   # 主配置文件
cat /etc/apt/sources.list.d/ubuntu.sources # 主配置文件,24.04 之后
ll /etc/apt/sources.list.d/*.sources # 主配置文件+额外软件源(第三方 PPA、软件商提供的源)
grep -rh "URIs:" /etc/apt/sources.list.d/*.sources # 查看已启用的软件源文件
apt-cache policy # 查看已配置的所有源(启用+禁用)

centos 查看源

1
2
3
4
ll /etc/yum.repos.d/*.repo  # 仓库配置文件
dnf repolist --help
dnf repolist --enabled # 显示已经启用的仓库(默认)
dnf repolist --all # 显示所有的软件仓库(启用+禁用)

更新和升级

ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
apt-get update               # 从配置的软件源获取最新的软件包列表信息(元数据),更新本地的软件包索引和缓存。

apt-get upgrade # 只更新已安装的软件包。会安装新的依赖包。如果升级某个包需要移除其他已安装的包,会跳过升级,避免破坏现有系统环境。
apt-get dist-upgrade # 升级时智能处理依赖关系。会安装新的依赖包、移除不再需要/冲突的包、更换核心软件包。用于跨版本升级或内核升级。

apt-get autoclean # 清除旧的已安装的包缓存文件
apt-get autoremove --purge # 移除不再需要的软件包及其配置文件。--purge 参数的作用是同时删除残留配置文件
apt-get clean # 清除所有已下载的包缓存文件

# apt 选项 --purge:可和 remove、autoremove 等组合,用于卸载软件并删除残留配置文件
# apt 子命令 purge:卸载软件并删除残留配置文件
apt purge pkg 等价于 apt remove --purge pkg

centos

1
2
3
4
5
6
7
8
9
dnf makecache           # 下载软件包仓库中的软件包列表和其他元数据到本地缓存,以便快速查找和安装软件。是一个准备操作

dnf check-upgrade # 查询系统已安装的软件包在仓库中是否有新版本。不下载、不安装,只显示更新信息。
dnf -y update # 更新系统中已经安装的软件包到可用的最新版本。默认只升级已经安装的软件,不会删除任何包。请使用 upgrade。
dnf -y upgrade # 与 update 不同的是,它会处理包依赖变化,有时会自动移除不需要的旧包。“更彻底的更新”。推荐!!!

dnf clean packages # 删除所有缓存的软件包文件(通常是 .rpm 文件)。
dnf clean metadata # 删除所有仓库的元数据文件(XML 格式,包含软件包列表、版本、依赖关系等信息)。
dnf clean all # 清理所有缓存文件,包括软件包、元数据 等等。

发行版

/etc/*-release 文件,它们用来 识别和描述操作系统发行版信息

1
2
find /etc | grep -E ".*-release"
cat /etc/os-release # 现代 Linux 统一标准文件(systemd 之后几乎都有)

内核

1
2
3
4
# 查看当前使用的内核版本
uname -r # 仅显示内核版本号(最常用)。
uname -a # 显示所有内核信息,包括内核版本、操作系统、主机名、架构等。
cat /proc/version # 这个文件记录了 Linux 内核的版本、用于编译内核的 gcc 的版本、内核编译的时间,以及内核编译者的用户名。

内核清理

ubuntu

1
2
3
4
5
6
7
8
# 查看系统已安装的内核
dpkg -l | grep linux-image
dpkg --get-selections | grep linux-image

# 删除旧内核
apt-get autoremove --purge # 系统一般会保留 2~3 个旧内核以防万一
# 手动删除
apt-get purge linux-image-6.8.0-45-generic linux-headers-6.8.0-45-generic

centos

1
2
3
4
5
6
7
8
9
# 查询系统已安装的内核
rpm -qa | grep kernel
dnf list installed | grep kernel

# 删除旧内核
dnf autoremove
dnf remove --oldinstallonly # 一键删除旧内核
# 手动删除
dnf remove kernel-modules-core-5.14.0-522.el9.x86_64 kernel-core-5.14.0-522.el9.x86_64

网关、IP、DNS

1
2
3
4
5
6
7
8
9
ip route                                  # 查看网关地址
ip addr show # 显示系统中所有网络接口的IP地址和相关配置信息,包括MAC地址、接口状态和网络配置。

# resolvectl 是一个在较新的Linux系统中用于管理和查询系统DNS解析配置的命令行工具,它是 systemd-resolved 服务的一部分。
resolvectl status # 显示每个网络接口(网卡)的详细配置。全面状态
resolvectl dns # 是 resolvectl status 输出内容的子集。聚焦DNS服务器
resolvectl dns <interface> <DNS server> # 为指定的网络接口(例如 ens33)设置静态DNS 服务器地址(例如 8.8.8.8)
resolvectl query www.baidu.com # 执行DNS查询,获取百度的IP地址,它会报告查询使用的协议和网络接口。
resolvectl flush-caches # 清除DNS缓存。当DNS记录发生变化时,使用此命令清楚本地DNS缓存,强制系统重新查询DNS服务器。

从DHCP改为固定IP

使用 ip addr 命令查看您的网络接口名称(例如 eth0ens33)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@localhost:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:7d:6c:a0 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.0.102/24 metric 100 brd 192.168.0.255 scope global dynamic ens33
valid_lft 6189sec preferred_lft 6189sec
inet6 fe80::20c:29ff:fe7d:6ca0/64 scope link
valid_lft forever preferred_lft forever
root@localhost:~#
root@localhost:~# ls /etc/netplan
50-cloud-init.yaml

备份原配置 sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak

编辑 Netplan 配置文件 sudo vim /etc/netplan/50-cloud-init.yaml 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 保持缩进正确:Netplan 使用 YAML 格式,缩进必须用空格,不能用 Tab
network:
version: 2
ethernets:
ens33: # 网卡名称
dhcp4: no
addresses:
- "192.168.0.7/24" # /24 是CIDR表示法,表示子网掩码,也就是该IP所在网络的大小。将IPv4转换为32位整数值,前24位是网络号,剩下的8位是主机号。
routes:
- to: "default" # default 是 0.0.0.0/0 的简写,表示 IPv4 默认路由,“匹配所有目的地址的流量”,即所有未匹配到其他路由的包都走这里”
via: "192.168.0.101" # 查看网关 ping tplogin.cn
metric: 100 # 路由优先级,数字越小优先级越高。如果系统存在多条默认路由,内核会根据 metric 选择哪条路由发送流量。默认写 100 就可以,一般不需要改动,除非你有 多网卡 / 多路由策略。
nameservers:
addresses:
- 114.114.114.114
- 114.114.115.115
search: [] # 默认DNS搜索域

保存文件后执行

1
2
3
4
# 系统会应用新的网络设置,可通过 ip addr 或 ping -c 4 www.runoob.com 测试网络是否可用
netplan apply
# 如果 apply 出错,请重启网络服务
systemctl restart systemd-networkd

修改hostname

主机名是用于标识网络上设备的标签,在同一网络上,你不应有两台或更多台具有相同主机名的计算机。

hostnamectl

hostnamectl 是 systemd 系统和服务管理器套件的一部分,用于查询和修改系统主机名。

Linux 系统通常涉及三种不同类型的主机名,hostnamectl 可以分别或同时进行管理:

  • 静态主机名 (Static hostname): 这是保存在配置文件(通常是 /etc/hostname)中的标准主机名。它在系统启动时被初始化。永久的。
  • 瞬态主机名 (Transient hostname): 由内核在运行时维护的主机名。DHCP 客户端、云平台(比如 OpenStack、AWS)分配主机名时常用它。临时的,重启失效。默认与静态主机名相同
  • “美观”主机名 (Pretty hostname): 一个更友好、供人类阅读的主机名,可以包含空格和特殊字符(例如:”My Laptop”)。保存在 /etc/machine-info

你可以使用 --static--transient--pretty 选项来单独查询或设置这些主机名。

1
2
3
4
5
6
7
hostnamectl --help 
hostnamectl status # 查看系统主机名

hostnamectl set-hostname halbin-dev-zhaolq.halbin.mars.com # 会同时更新 静态主机名 和 瞬态主机名
hostnamectl set-hostname halbin-dev-zhaolq.halbin.mars.com --static # 静态主机名,永久的
hostnamectl set-hostname halbin-dev-zhaolq.halbin.mars.com --transient # 瞬态主机名,临时的,重启失效
reboot

hostname 是一个传统的命令行工具,属于 inetutilsnet-tools 包。它修改的是 瞬态主机名

1
2
hostname                                      # 查看系统主机名
hostname halbin-dev-zhaolq.halbin.mars.com # 瞬态主机名,临时的,重启失效

修改配置文件(老方法)

1
2
3
cat /etc/hostname
cat /etc/hosts
reboot

防火墙

192.168.0.0/24:表示一个包含 256 个地址(从 192.168.0.0192.168.0.255)的子网,其中 192.168.0.0 是网络地址,192.168.0.255 是广播地址,192.168.0.1192.168.0.254 是可分配的设备 IP 地址。

192.168.0.1/24:表示子网 192.168.0.0/24 中的第一个有效 IP 地址,通常被分配给网关或路由器。

Ubuntu

在 Ubuntu 系统中,最常用和推荐的防火墙管理工具是 UFW (Uncomplicated Firewall)

UFW 是一个对标准 Linux 防火墙工具 iptables 进行封装的前端工具,它大大简化了配置规则的复杂性,让用户可以轻松管理网络连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#************************************ UFW 状态检查与管理
ufw status # 查看 UFW 的当前状态(active 或 inactive)和已配置的规则。
ufw status verbose # 显示更详细的信息,包括默认策略和日志级别。
ufw enable # 启用 UFW,系统启动时会自动运行。注意:在启用前,请确保您已允许 SSH 端口,以防失去远程连接。
ufw disable # 完全禁用 UFW。
ufw reset # 清除所有规则,将默认策略设置为拒绝 (deny),并将状态设置为禁用 (inactive)。谨慎使用!

#************************************ 配置默认策略
ufw default deny incoming # 拒绝所有传入的连接(入站规则)。服务器和安全桌面的标准配置。这意味着除了您明确允许的端口(如 SSH、HTTP、HTTPS)外,所有外部或内部尝试连接您的机器的请求都会被拒绝。
ufw default allow incoming
ufw default deny outgoing # 拒绝所有传出的连接(出站规则)。严格安全环境或特定应用服务器。这会阻止您的机器主动发起任何网络连接,除非您明确允许(例如,允许您的服务器连接到外部 DNS 或更新服务器)。这通常会使日常桌面使用变得困难。
ufw default allow outgoing # 允许所有传出的连接(出站规则)。服务器和安全桌面的标准配置。

#************************************ 添加允许(Allow)规则(拒绝请使用deny)
# 基于 服务名、端口号、协议 来允许流量通过。
ufw allow ssh # 按服务名。允许 SSH 连接(自动解析为 TCP 端口 22)。
ufw allow 80 # 按端口号。允许所有协议(TCP/UDP)的 80 端口(HTTP)流量。
ufw allow http # 允许 80/tcp
ufw allow https # 允许 443/tcp
ufw allow 443/tcp # 按端口和协议。仅允许 TCP 协议的 443 端口(HTTPS)流量。
ufw allow 6000:6007/udp # 按端口范围。允许 6000 到 6007 之间的 UDP 端口。
ufw allow from 192.168.0.0/24 # 特定子网。允许来自 192.168.0.0/24 子网的所有传入(Incoming)连接。
ufw allow from 192.168.0.100 # 特定IP地址。允许来自特定 IP 地址的所有流量。
ufw allow from 192.168.0.100 to any port 25 # IP和端口。仅允许该 IP 地址访问本机的 25 端口(SMTP)。

#************************************ 添加拒绝(Deny)和限制(Limit)规则
ufw deny 23 # 拒绝所有尝试连接到 23 端口(Telnet)的流量。
ufw limit ssh # 允许 SSH 连接,但在 30 秒内如果同一 IP 尝试连接超过 6 次,则阻止该 IP 地址。这是防止暴力破解的推荐做法。
ufw reject 143/tcp # 拒绝连接请求,但发送一个拒绝响应(如 ICMP port unreachable),而不是直接丢弃数据包(deny行为)。

#************************************ 删除规则
# 按规则内容删除 (推荐):直接在命令前加上 delete 关键字,内容与添加规则时完全相同。
ufw delete allow 80/tcp # 删除允许 80 端口的规则
# 按编号删除 (适用于规则多且复杂的情况)
ufw status numbered # 先查看带有编号的规则列表
sudo ufw delete 2 # 然后使用编号删除

Centos

CentOS 7及更高版本默认使用 firewalld 作为防火墙管理工具,它采用**区域(Zone)**的概念来管理网络连接和接口的信任级别。

以下是使用 firewall-cmd 命令管理防火墙的一些常用操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#************************************ firewalld 服务管理
systemctl status firewalld # 检查 firewalld 服务是否正在运行。
systemctl start firewalld # 启动 firewalld 服务。
systemctl stop firewalld # 停止 firewalld 服务。
systemctl enable firewalld # 设置 firewalld 开机自启。
systemctl disable firewalld # 禁止 firewalld 开机自启。

#************************************ 常用防火墙配置命令
firewall-cmd --help # 查看帮助
firewall-cmd --version # 查看版本
firewall-cmd --get-default-zone # 查看当前默认的区域(通常是 public)。
firewall-cmd --get-active-zones # 查看区域信息
firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域信息
firewall-cmd --list-all # 查看默认区域的运行时所有规则(服务、端口等)。
firewall-cmd --zone=public --list-all # 查看 public 区域的所有运行时规则。
firewall-cmd --reload # 应用永久配置,使更改立即生效,且不中断现有连接。

#************************************ 区域(Zone)概念
# 区域是 firewalld 的核心概念,用于根据网络环境定义不同的信任级别:
# 区域名称 信任级别 默认行为
# trusted(信任) 最高 允许所有网络连接。
# home(家庭) 中高 信任网络上的大多数计算机,允许少量入站连接。
# work(工作) 中 信任工作环境中的计算机,允许少量入站连接。
# public(公共) 低 默认区域,不信任网络上的其他计算机,只接受选定的入站连接(例如您手动开放的服务)。
# drop(丢弃) 最低 丢弃所有入站数据包,不回复任何信息,只允许出站连接。
firewall-cmd --set-default-zone=public # 修改默认区域

#************************************ 开放/关闭端口或服务,默认情况在 public 区域进行配置
# firewalld 的配置分为 运行时(runtime)和永久(permanent) 两种。
# 运行时配置立即生效,但在服务重启或系统重启后会丢失。
# 永久配置需要使用 --permanent 标志,并且需要重新加载防火墙才能生效。!!!!!!
firewall-cmd --zone=public --add-service=ssh --permanent # 添加服务(永久生效)
firewall-cmd --zone=public --remove-service=ssh --permanent # 关闭服务(永久生效)
firewall-cmd --zone=public --list-ports # 查看指定区域所有开放的端口号
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放端口(永久生效)
firewall-cmd --zone=public --remove-port=80/tcp --permanent # 关闭端口(永久生效)
firewall-cmd --zone=public --add-port=18881:65534/tcp --permanent # 开放指定范围的端口号

#************************************ 紧急模式
# 紧急模式是一个极端的安全措施,用于在系统检测到攻击或严重威胁时,立即丢弃(drop)所有网络数据包。
firewall-cmd --panic-on # 开启紧急模式。立即丢弃所有传入和传出的网络数据包。通常在系统遭受拒绝服务(DoS)攻击或检测到严重入侵企图时使用,以完全隔离服务器。
firewall-cmd --panic-off # 关闭紧急模式。停止丢弃所有数据包,恢复到正常运行时的防火墙规则。在安全威胁解除后,用于恢复正常的网络连接。
firewall-cmd --query-panic # 查询紧急模式状态。检查 firewalld 当前是否处于紧急模式。返回 yes 或 no。

设置交互式shell的环境变量

系统升级会覆盖 /etc/profile 吗?

答案是:有风险,但不一定会直接抹掉。

Linux 的处理机制:

  • 当你修改了 /etc/profile,系统在升级核心软件包(如 bash 或 base-files)时,包管理器(如 apt 或 dnf)通常会检测到该文件已被手动修改。

常见的处理方式:

  • Debian/Ubuntu:会弹出提示,询问你“使用发行版维护者的版本”还是“保留本地修改版本”。

  • CentOS/RHEL:可能会保留你的文件,但将新版本重命名为 /etc/profile.rpmnew;或者反过来,覆盖你的文件并将旧版本存为 /etc/profile.rpmsave。

结论:

  • 虽然有保护机制,但手动合并代码非常麻烦。不建议直接修改 /etc/profile 主文件。

最佳实践(为了方便,我并没有这么做):

  • 使用 /etc/profile.d/ 目录。
  • 几乎所有主流 Linux 发行版的 /etc/profile 脚本里都有一段逻辑:遍历并执行 /etc/profile.d/ 目录下所有以 .sh 结尾的文件。
  • 创建文件: touch /etc/profile.d/my_env.sh,默认权限是 644,不需要 755(在 644 的基础上 chmod +x ),因为大多数发行版的 /etc/profile 只是读取(source)这些文件,并不强制要求执行权限,但赋予 +x 也是常见的做法。
  • 在 crontab 定时任务脚本中执行 source /etc/profile

Git环境变量

参考官网,编译安装

1
2
3
4
5
grep -qxF 'export PATH=/data/local/git/bin:$PATH' /etc/profile || \
echo 'export PATH=/data/local/git/bin:$PATH' >> /etc/profile

source /etc/profile
git -v

JDK环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
# 若存在 JAVA_HOME 行就替换,不存在就添加
grep -q "^export JAVA_HOME=" /etc/profile \
&& sed -i 's|^export JAVA_HOME=.*|export JAVA_HOME=/data/local/java/jdk-17.0.14+7|' /etc/profile \
|| echo 'export JAVA_HOME=/data/local/java/jdk-17.0.14+7' >> /etc/profile

# -q: 找到匹配项后不会向标准输出打印任何内容。
# -x: 强制仅匹配整行。这意味着模式必须匹配从行首到行尾的全部内容,该行的前后不会有任何其他内容。
# -F: 确保搜索模式中的所有字符(特别是 $、/、: 等)都按字面意思匹配,而不是被误认为是正则表达式的特殊含义。
grep -qxF 'export PATH=$JAVA_HOME/bin:$PATH' /etc/profile || \
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile

source /etc/profile
java -version

Maven环境变量

1
2
3
4
5
grep -qxF 'export PATH=/data/local/apache-maven-3.9.11/bin:$PATH' /etc/profile || \
echo 'export PATH=/data/local/apache-maven-3.9.11/bin:$PATH' >> /etc/profile

source /etc/profile
mvn -v

Gradle环境变量

https://gradle.org/install/

1
2
3
4
5
grep -qxF 'export PATH=/data/local/gradle-7.6.6/bin:$PATH' /etc/profile || \
echo 'export PATH=/data/local/gradle-7.6.6/bin:$PATH' >> /etc/profile

source /etc/profile
gradle -v

让交互式shell执行某个脚本

1
2
3
4
5
6
7
grep -qxF 'source /data/local/env/ideps-env.sh' /etc/profile || \
echo 'source /data/local/env/ideps-env.sh' >> /etc/profile

grep -qxF '. /data/local/env/ideps-env.sh' /etc/profile || \
echo '. /data/local/env/ideps-env.sh' >> /etc/profile

source /etc/profile

https://www.jetbrains.com/help/idea/tutorial-deployment-in-product.html

使用Win11的sftp命令

在 Windows 需要传输文件的目录下打开 cmd,然后执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

PS X:\workspaces\local-demo> sftp -P 8989 root@192.168.0.7
root@192.168.0.7's password:
Connected to 192.168.0.7.
sftp> pwd
Remote working directory: /root
sftp> cd /data/test/local-demo
sftp> put doc.txt
Uploading doc.txt to /data/test/local-demo/doc.txt
doc.txt 100% 5 0.0KB/s 00:00
sftp> get test.txt
Fetching /data/test/local-demo/test.txt to test.txt
test.txt 100% 4 0.0KB/s 00:00
sftp>

使用idea的sftp部署

全局配置方式1

image-20260417152020001

image-20260417152337389

image-20260417152433575

全局配置方式2

image-20260417142852192

使用入口1

image-20260417142813003

使用入口2

image-20260417151828307

使用idea的WebDAV部署

remote-dev-server

在 JetBrains 的远程开发体系中,remote-dev-server.sh 是运行在远程服务器上的核心脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@localhost:/# ./remote-dev-server help

Usage: ./remote-dev-server [ij_command_name] [/path/to/project] [arguments...]
Examples:
./remote-dev-server installPlugins [arguments...]
./remote-dev-server status
./remote-dev-server dumpLaunchParameters
./remote-dev-server stop
./remote-dev-server run [arguments...]
./remote-dev-server printEnvVar [arguments...]
./remote-dev-server warm-up /path/to/project [arguments...]
./remote-dev-server cwmHostStatus
./remote-dev-server remoteDevStatus
./remote-dev-server serverMode
./remote-dev-server registerBackendLocationForGateway
./remote-dev-server warmup /path/to/project [arguments...]
./remote-dev-server invalidate-caches
./remote-dev-server help
Environment variables:
REMOTE_DEV_SERVER_TRACE set to any value to get more debug output from the startup script
REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS set to '0' to skip using bundled X11 and other Linux libraries from plugins/remote-dev-server/self-contained. Use everything from the system. by default bundled libraries are used
REMOTE_DEV_TRUST_PROJECTS set to any value to skip project trust warning (will execute build scripts automatically)
REMOTE_DEV_NEW_UI_ENABLED set to '1' to start with forced enabled new UI
REMOTE_DEV_NON_INTERACTIVE set to any value to skip all interactive shell prompts (set automatically if running without TTY)

常用子命令说明(官方)

命令 功能说明
status 查看 remote-dev-server 当前状态
remoteDevStatus 检查是否有远程开发实例正在运行
run 启动远程开发实例(最常用)
stop 停止当前远程开发会话
warm-up /path/to/project 预热索引(构建缓存)
invalidate-caches 清理缓存
serverMode 启动后台模式(长期监听 Gateway 连接)
registerBackendLocationForGateway 为 Gateway 注册本地 IDE 位置
installPlugins 安装插件(离线部署常用)

注册 IDE 后端

registerBackendLocationForGateway 命令用于将远端主机上已经解压/安装的 IDE 后端路径注册到 JetBrains Gateway 的“可用后端/构建”列表,使 Gateway 能发现并显示该已安装的后端 IDE(而不是让 Gateway 从网络下载它)。

1
2
3
4
5
6
7
8
9
./bin/remote-dev-server.sh registerBackendLocationForGateway

# 手动注册路径:会在此目录下创建符号链接(指向实际的IDE安装位置),以便 Gateway 识别这些用户提供的IDE后端。
ll ~/.cache/JetBrains/RemoteDev/userProvidedDist/
# 自动下载路径:默认情况下,此目录存放 Gateway 自动下载的IDE后端。
ll ~/.cache/JetBrains/RemoteDev/dist

# 查看当前目录下所有子目录和文件的具体大小
cd ~/.cache/JetBrains && du -h --max-depth=1 # du -h -d 1

目录介绍:

Windows 目录 Linux 目录 内容
AppData\Local\JetBrains (本地缓存) ~/.cache/JetBrains/ 存储体积大、临时性、可重建的数据,如缓存、索引、临时文件、日志等。这些数据是特定于本地计算机的,不应进行网络同步,以节省带宽和时间。
AppData\Roaming\JetBrains (漫游) ~/.config/JetBrains/ 存储用户设置、配置、许可文件等关键且体积小的数据。设计用于在企业环境中,当用户在不同机器上登录时,这些设置能够通过网络被同步(漫游),保证用户体验的一致性。
AppData\Roaming\JetBrains\***\plugins ~/.local/share/JetBrains/ 从应用商店下载安装的外部插件(Plugins)

启动 IDE 后端(不常用)

角色:服务器端的启动脚本 / 后端服务(而非本地客户端)。

功能:启动并托管 IDE 后端(文件访问、索引、语言服务、运行/调试后端等)。

连接方式:由 JetBrains Gateway 或受支持的客户端发起连接到该后端。

目的:让本地 IDE 能够远程编辑、运行和调试项目,保持一致的开发体验。

(补充说明:它是服务器端的会话/代理组件,不是本地 IDE 本身。)

1
2
3
4
5
6
mkdir -p /logs/remote-dev-server
tail -f /logs/remote-dev-server/fresh.log

cd /data/local/JetBrains/idea-IU-252.23892.409/bin
# 启动后,会输出三个链接。
nohup ./remote-dev-server.sh run /data/local/workspaces/mars-test/ >/logs/remote-dev-server/fresh.log 2>&1 &

从 IntelliJ IDEA 连接到远程服务器

https://www.jetbrains.com/zh-cn/help/idea/remote-development-starting-page.html

远程开发常见问题解答

https://www.jetbrains.com/help/idea/faq-about-remote-development.html

IDEA 远程调试,像运行本地代码一样调试远程主机上的程序,以排查远程程序的BUG或代码执行流程。

概述

原理:本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信,传递调试指令和调试信息。 被调试程序的远程虚拟机:作为 Debug 服务端,监听 Debug 调试指令。jdwp是Java Debug Wire Protocol的缩写。 调试程序的本地虚拟机:IDEA 中配置的 Remote Server,指定 Debug 服务器的Host:Port,以供 Debug 客户端程序连接。

设置

IDEA 中指定 Debug 服务器

  • 点击主窗口菜单 Run -> Edit Configurations...,打开 Run/Debug Configurations 窗口;
  • 点击工具栏上的 + 按钮,下拉菜单中选择 Remote
  • 设置 Host 为远程服务器的域名或IP,保持 Port=5005 无需调整;
  • 选择 JDK 版本并复制命令行参数 Command line arguments for remote JVM, 形如 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005,具体参数内容由 JDK 版本决定。

远程服务中开启 Debug 服务

对于 SpringBoot: 命令行添加选项,并重启:

1
2
# 注意新参数必须在 -jar 之前
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar test.jar

对于 Tomcat: 启动脚本中添加选项,并重启:

1
2
# sudo vim $CATALINA_HOME/bin/catalina.sh
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

远程服务器防火墙端口放行

1
2
3
# sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5005 -j ACCEPT
# 重启生效: sudo systemctl restart iptables

开始调试

  • 要求:双方代码一致,否则远程调试无法启动;
  • 本地启动刚刚配置的 Remote Server,正常时会看到日志: Connected to the target VM, address: 'localhost:5005', transport: 'socket'
  • 本地 IDEA 代码中设置断点
  • 浏览器或手机 HTTP 访问服务器
  • IDEA 即可在断点暂停并跟踪

关闭调试

服务器上多开放个端口是不安全的,调试完毕后可恢复防火墙设置。 而 Java 服务器开启 Debug 服务器的功能可以保留,以便之后再次调试。

IDEA 远程调试的细节

1、细节1:停在本地断点,关闭程序后会继续执行吗 如果远程调试在自己的断点处停下来了,此时关闭IDEA中的项目停止运行,则还会继续运行执行完剩下的逻辑吗? 会的,这点比较不容易记住

以下面的代码为例,在第一行停住了。然后IDEA中停掉,发现停掉之后控制台还是打印了剩下的日志。 2、细节2:jar包代码和本地不一致会怎么样? IDEA 里的代码如果不和jar包的一致,会怎么样。

结论:要保证和远程启动的代码一致。

否则你debug的时候的行数会对不上。报错抛异常倒是不会。像这种还是能对得上行数的

比如你调试test1方法,test2方法在test1下面,在test2里加代码,这样并不影响test1中的行号,这种是可以在调试的时候准确反应行号的 3、细节3:日志打印在哪里? 日志不会打印在IDEA的控制台上。即System.out 以及 log.info 还是打印在远程的。

1
2
3
4
5
6
7
8
@GetMapping("/test1")
public String test1() {
System.out.println("第一行");
System.out.println("第二行");
log.info("log 第一行");
log.info("log 第二行");
return "ok";
}

4、细节4:调试时其他人会不会卡住? 远程调试的时候,打了断点,停住后会不会导致页面的请求卡住。 比如你使用远程调试,别的QA在测试这个页面,结果他们看到的结果是怎么样的? 会卡住吗?会的,已经实际遇到过这种情况了。

5、细节5:本地代码修复bug远程调用的时候 如果在远程调试过程自己发现了bug,本地改好后重新启动IDEA里的项目,再到页面调用一次,能修复吗? 不能,运行的还是远程部署的jar中的代码

这个直接击碎了远程页面点一点触发本地代码进行debug的梦想。如果可以的话那调试代码就方便太多。

6、细节6:当开发者计算机无权访问数据库时,可使用远程调试查看数据处理过程

推荐链接:

超文本传输协议 (HTTP) - 维基百科

超文本传输安全协议 (HTTPS) - 维基百科

HTTP状态码 - 维基百科

HTTP持久连接 - 维基百科

HTTP | MDN

HTTP 基础 - HTTP | MDN

数据 URI (Data URLs) - HTTP | MDN

HTTP 教程 | 菜鸟教程

HTTP状态码 | 菜鸟教程

HTTP 方法:GET 对比 POST | 菜鸟教程

Http GET请求缓存问题

漫画:什么是 HTTPS 协议?

四种常见的 POST 提交数据方式

postman中 form-data、x-www-form-urlencoded、raw、binary的区别

目标URL存在跨站漏洞和目标URL存在http host头攻击漏洞处理方案

阅读全文 »
0%