本文介绍了如何增强Ubuntu服务器的安全性,特别是在运行以太坊节点时。内容涵盖系统更新、用户账户管理、防火墙配置、SSH安全、服务管理、日志监控、文件系统权限以及时间同步等多个方面,旨在帮助读者提高服务器的整体安全性。
ufw
,限制端口/服务。始终保持你的系统更新是一个好的实践,因为漏洞和错误会不断被修复,或者功能得到改进。这可以手动或自动完成。你需要确保尽快修补安全更新,而其他更新可能需要在安装前进行审查。按照以下步骤使你的系统保持最新,并配置自动更新:
这从 Ubuntu 的软件仓库中提取最新的软件包信息。
sudo apt update
应用可用的更新而不删除软件包:
sudo apt upgrade -y
如果你希望 Ubuntu 自动处理依赖关系更改(有时需要用于内核或库更新):
sudo apt full-upgrade -y
旧的依赖项或你不再需要的库:
sudo apt autoremove -y
sudo apt autoclean
Ubuntu 有一个用于执行此操作的软件包:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure - priority=low unattended-upgrades
这确保了安全补丁在后台应用。你可以检查/编辑配置文件:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
确保安全仓库( ${distro_id}:${distro_codename}-security";
)已启用。
由于内核至关重要,更新后可能需要重新启动。你可以使用以下命令检查待处理的重新启动:
[ -f /var/run/reboot-required ] && echo "Reboot required"
然后在安全时重新启动:
sudo reboot
完成这些步骤后,你的系统已针对已知漏洞进行了修补,将自动应用未来的安全修复程序,并清除了不必要的旧软件包。
一个重要的安全控制是用户身份验证和权限。强烈建议不要以 root
身份运行服务,包括以太坊客户端。在这里,我分两层执行此操作:(1)一个登录用户,将账户管理和 SSH 与其他用户分开,(2)一个系统用户,隔离以太坊客户端并且只运行客户端进程。
首先,创建登录用户:
## 创建具有 home 目录的用户
sudo adduser ethadmin
## 将用户添加到 sudo 组
sudo usermod -aG sudo ethadmin
## 检查用户所属的组
groups ethadmin
然后,我们可以创建没有 home 目录和登录权限的系统用户:
sudo adduser --system --no-create-home --group --disabled-login ethereum
但是我们确实需要一个由系统用户拥有的数据目录,像这样:
sudo mkdir -p /var/lib/ethereum
sudo chown -R ethereum:ethereum /var/lib/ethereum
sudo chmod 700 /var/lib/ethereum
这里有一些关于权限的说明。我们将 ethadmin
用户添加到 sudo
组,以便我们可以管理以太坊客户端,并为运行客户端的 ethereum
用户强制执行最小权限原则。ethereum
用户只是一个服务账户,并且只能访问我们刚刚创建的数据目录。
弱密码是攻击者入侵的最简单方式。通过强制复杂度,即使有人尝试暴力破解,搜索空间也会变得巨大。因此,强制使用强密码是一个好的实践——至少 8-12 个字符长,混合使用大写字母、小写字母、数字和符号。为此,你可以安装 libpam-pwquality
软件包并编辑其配置文件:
sudo apt install libpam-pwquality -y
sudo nano /etc/security/pwquality.conf
推荐的设置是:
minlen = 12 # 最小密码长度
minclass = 3 # 要求混合使用大写/小写/数字/符号
retry = 3 # 用户在更改密码期间可以重试多少次
这确保了当账户设置或更改密码时,将强制执行这些安全要求。
你可以通过在重复的身份验证失败尝试后锁定用户帐户来保护你的系统免受暴力登录尝试。Linux 的一个 可插拔身份验证模块(PAM)是 faillock
,它是一个身份验证安全工具,可以跟踪每个用户的失败登录尝试次数。它可以在一定数量的失败后暂时锁定帐户,并保护 SSH 登录、控制台登录和其他支持 PAM 的服务。
软件包 faillock
通常预装在 Ubuntu 中,或者可以通过 libpam-modules
手动安装。你可以使用以下命令查看/编辑配置文件:
sudo nano /etc/security/faillock.conf
通常,默认值就足够了,但可以根据你的需求和安全要求进行更改。你可以调整失败尝试的次数(deny
参数)或帐户解锁的时间(unlock_time
参数)。有关如何配置 faillock 的更多详细信息,请参阅文档。
要启用 faillock,你需要更新 PAM 配置文件,该文件位于 /etc/pam.d/common-auth
中。确保你的配置文件如下所示:
## 在像 pam_unix.so 这样的实际认证模块之前添加 pam_faillock.so preauth
auth required pam_faillock.so preauth
## 这里是每个软件包的模块(“Primary”块)
auth [success=2 default=ignore] pam_unix.so nullok
## 如果没有模块成功,这里是备用方案
auth requisite pam_deny.so
## 如果还没有,使用肯定的返回值来启动堆栈;
## 这避免了我们仅仅因为没有任何东西设置成功代码而返回错误
## 因为上面的模块只会跳来跳去
auth required pam_permit.so
## 这里是更多每个软件包的模块(“Additional”块)
auth optional pam_cap.so
## 添加 sufficient pam_faillock.so authsucc last 来清除 failcount
auth sufficient pam_faillock.so authsucc
## pam-auth-update 配置结束
你需要添加第一行和最后一行:
auth required pam_faillock.so preauth auth sufficient pam_faillock.so authsucc
同时将第二行中的 success
参数更新为 2
。
保存并退出配置文件后,就全部设置好了!
要显示失败的登录尝试或重置用户的失败次数,你可以使用:
faillock # 显示失败的登录尝试
sudo faillock --user username --reset # 重置用户的失败次数
你的服务器在端口上监听。每个服务(如 SSH、以太坊节点、HTTP 等)都使用特定的端口号,攻击者会扫描网络以寻找可利用的开放端口。因此,我们将配置你的服务器的防火墙,仅允许必要的服务访问服务器,从而减少攻击面。
如果服务器仅运行以太坊节点,则需要打开的唯一端口是 SSH 和以太坊客户端的端口。
Ubuntu 附带一个默认的防火墙管理器 Uncomplicated Firewall ( ufw
)。ufw
提供了一个用于管理 Ubuntu 的数据包过滤系统(称为 netfilter
)的框架,以及一个用于操作防火墙的命令行界面。你可以使用以下命令限制端口:
## 允许 SSH(端口 22 或自定义端口号(减少噪音))
sudo ufw allow 22/tcp
sudo ufw limit 22/tcp # 减缓暴力登录尝试
## 允许以太坊 P2P(端口 30303)
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
## (可选)如果你只想将 RPC 开放给 localhost
sudo ufw allow from 127.0.0.1 to any port 8545
## 默认拒绝其他所有内容(可能已设置)
sudo ufw default deny incoming
sudo ufw default allow outgoing
## 启用防火墙
sudo ufw enable
## 检查状态
sudo ufw status verbose
更多命令可以在 ufw
的 手册 中找到。
现在,为了测试这一点,我使用了移动应用程序 Termux . 但在你可以测试它之前,你需要找到你的公共 IP。在你的终端中输入 curl ifconfig.me
,如果你有一个公共 IP,它将返回你的公共 IP。
拥有公共 IP 后,打开 Termux 应用程序(或等效应用程序)并运行以下命令:
nmap -6 -Pn -p 22,30303 <你的公共IP>
这会向你的公共 IP 发送一个请求。如果 IP 可达,终端会返回 Host is up
,你将看到端口是 open
还是 closed
。如果端口 30303 是 closed
,暂时不用担心,因为我们没有正在运行它的以太坊客户端。一旦以太坊节点启动,我们可能会重新访问这一部分。
出于安全原因,SSH 的关闭端口 22 也是有益的,因为没有人能够从你的本地网络外部访问你的服务器。如果你想远程访问服务器,可以将其配置为打开。但这里不会介绍这一点。
SSH(安全外壳)对于管理以太坊节点至关重要,因为它提供了一种安全、加密的方式来远程访问和控制你的服务器。运行节点需要定期更新、监控和故障排除,而 SSH 允许你执行这些任务,而无需实际位于机器旁。它通过加密你的客户端和服务器之间的所有通信,来保护敏感凭据和命令不被暴露给攻击者。如果没有 SSH,你需要物理访问服务器或依赖不安全的远程方法,这可能会使你的系统和区块链网络都面临风险。
在 Ubuntu Server 上,通常默认安装了 OpenSSH。使用以下命令检查:
sudo systemctl status ssh
如果你看到它正在运行,那就很好。如果它缺失,安装它:
sudo apt update
sudo apt install openssh-server -y
启用并启动该服务:
sudo systemctl enable ssh
sudo systemctl start ssh
并为用户创建一个 SSH 目录:
sudo mkdir -p /home/ethadmin/.ssh
通过 SSH 连接的更安全的方式是使用密钥对。按照这些步骤生成密钥对并相应地配置 SSH:
ssh-keygen -t ed25519 -C "ethadmin access"
按 Enter 将其保存在默认位置 ( ~/.ssh/id_ed25519_ethadmin
)。可以选择设置一个密码短语以获得额外的安全性。
ssh-copy-id username@your_server_ip
或者你可以手动复制粘贴你的公钥(id_ed25519_ethadmin.pub
文件的内容)。(使用 Windows 上的记事本查看公钥并复制它)。
然后将其粘贴到服务器的文件中:
sudo nano /home/ethadmin/.ssh/authorized_keys
sudo chown -R ethadmin:ethadmin /home/ethadmin/.ssh
sudo chmod 700 /home/ethadmin/.ssh
sudo chmod 600 /home/ethadmin/.ssh/authorized_keys
这确保只有用户具有读/写权限。
使用 ssh -p portnumber username@your_server_ip
测试你的 SSH 登录。你应该登录而无需输入密码或要求输入你的密码短语(如果已配置)。
在你测试了你的密钥对并且它工作后,你可以禁用密码登录以使服务器更安全。使用以下命令打开 ssh 配置文件:
sudo nano /etc/ssh/sshd_config
并设置以下值:
PermitRootLogin no # 禁用 root 登录
PasswordAuthentication no # 禁用密码验证
PubkeyAuthentication yes # 启用公钥验证
AllowUsers ethadmin # 将 ssh 限制为 ethadmin (需要添加)
## 可选
ClientAliveInterval 600 # 检查客户端是否存活的间隔
ClientAliveCountMax 0 # 如果没有响应则立即断开连接
保存并重新启动 SSH:
sudo systemctl reload sshd
sudo systemctl restart ssh
为了进一步增强你的 ssh 连接的安全性并减少暴力破解尝试的潜在噪音,你可以将你的端口号设置为不同的数字,例如 2222。你可以简单地编辑 /etc/ssh/sshd_config
并设置 Port 2222
(或另一个数字)。
在上一节中,我们已经为端口 22 配置了防火墙,端口 22 是 ssh
的默认端口。你可以使用 sudo ufw status
检查你的防火墙配置,它应该显示端口 22 是 ALLOWED
。
如果你在前面的步骤中选择了自定义端口号,你需要相应地配置防火墙并在该端口允许流量。同时禁用默认端口 22。
sudo ufw allow portnumber/tcp
sudo ufw limit portnumber/tcp
sudo ufw delete 22
Fail2ban 通过检测重复的失败登录尝试并自动阻止攻击者的 IP 一段时间来保护你的服务器,从而降低暴力攻击的风险。
要安装它并检查其状态,请使用:
sudo apt update
sudo apt install fail2ban -y
sudo systemctl status fail2ban
Fail2ban 附带一个默认配置,位于 /etc/fail2ban/jail.conf
。
永远不要直接编辑此文件——而是创建一个本地副本。这确保你的更改在更新后仍然存在。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
要配置 SSH 保护,请打开本地配置文件:
sudo nano /etc/fail2ban/jail.local
找到 [sshd] 部分(在底部)并设置:
[sshd]
enabled = true # 激活 jail
port = ssh # 如果你配置了自定义端口,请调整
filter = sshd
logpath = /var/log/auth.log
maxretry = 5 # 阻止之前的失败尝试次数
bantime = 10m # IP 被阻止的时间(例如,10 分钟)
findtime = 10m # 计算重试次数的时间窗口
保存,退出并运行:
sudo systemctl restart fail2ban
要确认 Fail2ban 正在监视 SSH 或查看所有活动 jail:
sudo fail2ban-client status sshd # 或者
sudo fail2ban-client status
你可以在 /etc/fail2ban/jail.local
中将你自己的 IP 列入白名单:
ignoreip = 127.0.0.1/8 你的家庭IP
有关 ssh
命令的更多详细信息,请参阅 OpenSSH 文档。
一个好的实践是仅运行服务器真正需要的服务,以减少攻击面并避免不必要的问题。
要检查当前在你的 Ubuntu Server 上启用了哪些服务,请使用:
systemctl list-unit-files --type=service --state=enabled
使用以下命令,你可以禁用不需要的服务。仔细检查真正需要的东西,这可能因你的配置、硬件和你服务器上使用的软件而异。
sudo systemctl disable --now <服务名称>
软件更新后,某些服务可能会重新启用,因此重要的是,请重新检查以确保你将启用的服务保持在最低限度。
首先,我们启用防火墙的日志记录。这在发生事件或同步问题时分析网络流量很有用。
默认防火墙 ufw
允许你记录防火墙活动。以下命令告诉 ufw
开始记录到 /var/log/ufw.log 中。每当连接被阻止或收到或发送特定数据包时,都会写入日志。默认情况下,启用日志记录会将级别设置为低(最小),该级别以最少的详细信息记录被阻止的流量。该级别可以从低、中、高到全进行调整。
sudo ufw logging on
sudo ufw logging <low|medium|high|full>
此功能允许你稍后查看对等方是否正在尝试连接到你的以太坊节点,有助于调试防火墙是否意外地断开连接,并且可能有助于发现扫描、暴力破解尝试或不需要的 RPC 访问尝试。
journalctl
是一个命令行工具,用于查看由系统日志服务 systemd-journald 收集的日志。它从多个来源捕获日志,例如 Systemd 服务、内核消息、启动日志和用户进程。它已默认安装在 Ubuntu Server 上。但是最好调整配置,以便正确管理日志并且不要占用太多存储空间。在这里,我们将可用于日志记录的总存储空间限制为 2GB,限制文件大小和日志文件数量。我们还确保在一个月的时间内轮换日志。
sudo nano /etc/systemd/journald.conf
然后相应地调整参数:
Storage=persistent # 跨重启保留日志(默认为“auto”)
Compress=yes # 压缩旧日志
SystemMaxUse=2G # 最大日志磁盘使用量
SystemKeepFree=500M # 始终保留此空间空闲
SystemMaxFileSize=200M # 当单个日志文件超出此值时轮换
SystemMaxFiles=20 # 要保留的轮换日志文件的数量
MaxRetentionSec=1month # 可选:放弃超过 30 天的日志
保存(ctrl+o)并退出(ctrl+x)后,你需要重新启动该程序:
sudo systemctl restart systemd-journald
journalctl
现在允许你轻松访问日志数据和过滤器查看更多详情请查阅文档。
有几种基本的 Linux 监控工具,其中一些默认已经安装。每个工具都关注你服务器性能的不同层:
[htop](https://manpages.ubuntu.com/manpages/noble/en/man1/htop.1.html)
: CPU、RAM、进程的交互式视图。
使用场景:当你想要快速了解系统负载或查看哪些进程占用了资源时。
[iotop](https://linux.die.net/man/1/iotop)
: 实时查看磁盘 I/O。
使用场景:当你怀疑磁盘瓶颈时(区块链节点上常见)。
[iftop](https://linux.die.net/man/8/iftop)
: 按连接实时查看网络流量使用情况。
使用场景:当你想要查看实时对等流量或检查是否有意外情况正在使用带宽时。
[sysstat](https://man7.org/linux/man-pages/man5/sysstat.5.html)
( iostat
, mpstat
, sar
): 历史 CPU/磁盘/网络统计信息。
使用场景:当你想要跟踪几个小时/几天内的资源使用情况,而不仅仅是立即跟踪时。
[vnstat](https://linux.die.net/man/1/vnstat)
: 跟踪每日/每月网络使用情况。
使用场景:当你想要跟踪你的以太坊节点在一段时间内上传/下载了多少流量时(对于带宽规划很重要)。
sudo apt install htop iotop iftop sysstat vnstat
要了解有关如何使用每个工具的更多信息,请单击关联的链接。
我们要安装的最后一件事是监控 Node Exporter(Node Exporter)。这是来自 Permetheus 生态系统的一个轻量级监控代理。它作为服务器上的一个后台服务运行,并收集系统级指标(CPU、内存、磁盘、网络、文件系统等),然后通过 HTTP 以纯文本格式公开这些指标。Permetheus(或任何兼容的收集器)可以抓取该端点来存储、分析和可视化数据(例如,Grafana 仪表板)。
运行以太坊客户端需要大量资源,而 Node Exporter 将帮助检测性能瓶颈、设置告警以及可视化资源趋势。以太坊客户端(Geth、Nevermind)也可以导出他们自己的以太坊特定指标,用于监控与区块链相关的活动。
你可以按照这些步骤安装和配置 Node Exporter:
通过 curl 安装 Node Exporter,但首先在 Permetheus 的 Github 上仔细检查版本。
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz
tar xvf node_exporter-1.9.1.linux-amd64.tar.gz
sudo mv node_exporter-*/node_exporter /usr/local/bin/
node_exporter --version # 验证它是否工作
Node Exporter 获得一个专用用户(node_exporter
),以确保安全和隔离。由于它只需要读取系统指标并通过端口 9100 公开它们,因此它不需要完整的系统权限。以它自己的非登录用户身份运行它意味着,如果 Node Exporter 受到攻击,攻击者不会获得 root 或 shell 访问权限——他们将被限制在一个最小的账户中,该账户没有 home 目录、没有 shell 并且没有额外的权限。这是后台服务的标准 Linux 强化实践。
sudo useradd --no-create-home --shell /bin/false node_exporter
为了使 Node Exporter 可以在启动时自动在后台运行、在崩溃时保持活动状态,并且可以使用像 systemctl
命令这样的命令轻松控制,它需要一个单元文件。要创建一个,请使用:
sudo nano /etc/systemd/system/node_exporter.service
并设置或更新配置:
[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
保存并退出。现在你将能够重新加载 systemd
并启动 Node Exporter:
sudo systemctl daemon-reexec
sudo systemctl enable --now node_exporter
你可以使用以下命令检查状态:
systemctl status node_exporter
在浏览器中或使用 curl 检查指标:
curl http://localhost:9100/metrics
你应该看到一个大的文本转储指标 ( node_cpu_seconds_total
, node_memory_MemAvailable_bytes
等)。
/tmp
目录是世界可写的,这使其成为攻击者的常见目标。恶意软件通常尝试直接从 /tmp
中执行有效负载,或滥用 setuid 和设备文件功能来提升权限。为了降低这种风险,我们可以将 /tmp
隔离为其自己的挂载点,并应用更严格的挂载选项。这可以防止二进制文件在那里执行,禁止创建设备文件,并阻止通过 setuid 位提升权限——同时仍然允许应用程序存储临时文件。
在以下位置创建一个新的单元文件:
sudo nano /etc/systemd/system/tmp.mount
粘贴以下配置:
[Unit]
Description=Temporary Directory (/tmp)
Documentation=man:hier(7)
Before=local-fs.target
DefaultDependencies=no
Conflicts=umount.target
ConditionPathIsSymbolicLink=!/tmp
[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime,noexec,nodev,nosuid
保存并退出。
2. 重新加载 systemd 并启动挂载
sudo systemctl daemon-reload
sudo systemctl start tmp.mount
使用 mount | grep /tmp
验证 /tmp
的挂载选项,它应该显示如下内容:
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime)
这意味着,/tmp
作为 tmpfs
挂载,选项如下:
noexec
→ 防止从 /tmp
执行二进制文件nodev
→ 阻止在 /tmp
中创建设备文件nosuid
→ 禁用 /tmp
中的 setuid/setgid 权限提升这些选项在不干扰正常系统或以太坊节点功能的情况下,显着减少了攻击面。
即使有 32 GB 的 RAM,在你的以太坊节点上配置一个小交换空间也是明智的。交换空间充当安全网:如果你的客户端或支持服务暂时飙升内存使用率,内核不会立即通过 OOM killer 终止进程。相反,很少使用的页面可以被推出,防止崩溃并确保你的节点保持同步。借助快速的 NVMe SSD 和调整的 swappiness,性能影响最小,而稳定性显着提高。
Ubuntu 24.04 已经支持 zram(压缩 RAM 交换空间),对于具有充足内存的服务器来说,这通常比磁盘交换空间要好。理想的设置是 2–4 GB zram + 一个小的 2 GB 基于磁盘的交换文件作为备份。这样,zram 可以非常快速地处理小的峰值,并且如果内存压力非常大,交换文件可以作为最后的后备手段。
安装 zram-tool:
sudo apt update
sudo apt install zram-tools -y
配置它(默认值通常很好,但我们将其调整为大约 4 GB):
echo 'ALGO=lz4
PERCENT=12
PRIORITY=100' | sudo tee /etc/default/zramswap
## ALGO=lz4 → 快速压缩
## PERCENT=12 → 大约 RAM 的 12%(32 GB 上约为 3.8 GB)
## PRIORITY=100 → 确保 zram 在磁盘交换空间之前使用
启用并启动:
sudo systemctl enable --now zramswap.service
即使 zram 将处理大多数小的内存峰值,它也位于 RAM 中。如果你的以太坊客户端加上其他服务达到非常高的内存压力,仅靠 zram 就无济于事,因为它仍然在使用 RAM。这就是为什么我们还要在 磁盘上添加一个小交换文件——它速度较慢(即使在 NVMe 上也是如此),但它可以作为一个安全阀,防止内核终止进程。
因此,我们在 /swapfile
目录中创建一个 2GB 文件,而实际上并没有填充它以实现快速分配。我们限制只有 root 才能读取/写入并将其格式化为交换空间,然后再激活它(包括在重新启动时):
sudo fallocate -l 2G /swapfile # 创建用于分配的交换文件(2GB)
sudo chmod 600 /swapfile # 更新权限
sudo mkswap /swapfile # 格式化为交换空间
sudo swapon /swapfile # 激活
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # 在重新启动时激活
默认情况下,Linux 可能会过于激进地开始使用交换空间(swappiness = 60)并过快地回收 RAM 中用于文件系统元数据的缓存(cache_pressure=100)。这并不是你想要用于性能敏感型工作负载(如以太坊节点)的内容。
我们将 swappiness 降低到 10,将缓存压力降低到 50,这意味着:
要配置这一点,我们使用:
## 使设置永久生效
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # 立即重新加载它,而无需重新启动
你可以检查设置并确认 swappiness 设置为 10,缓存压力设置为 50:
cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure
时间同步对于以太坊节点来说至关重要,因为区块链协议依赖于准确的块、交易和共识时间戳。如果你的服务器时钟漂移太大,你的节点可能会:
在 Ubuntu Server 上,最佳实践是使用 systemd-timesyncd(轻量级且默认包含)或 chrony(更高级和健壮)。systemd-timesyncd 可能已经安装和激活,因此我们逐步完成配置 chrony。
安装 chrony:
sudo apt install chrony -y
sudo systemctl enable chrony --now
然后检查它的状态:
systemctl status chrony
并确认同步:
chronyc tracking
现在,你的以太坊节点是安全的。显然,你可以实施更多的安全措施。但是这些应该足以在家中运行的服务器。如果你有任何问题或想更详细地讨论本文中的任何内容,请随时联系或发表评论。感谢阅读 :)
- 原文链接: medium.com/the-pirate-st...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!