Featured image of post Linux 远程登录与安全实践:SSH 公私钥、scp 免密、Wake-on-LAN 远程开机与网络配置

Linux 远程登录与安全实践:SSH 公私钥、scp 免密、Wake-on-LAN 远程开机与网络配置

2017 时代 Linux 远程管理全套——SSH 公私钥登录、sshpass 免密、scp 远程拷贝、sshd_config 安全配置、Wake-on-LAN 远程开机、ethtool 网卡唤醒、Debian/Ubuntu 网络配置(interfaces/netplan/systemd-resolved)

一、为什么是 2017 年这一份

2017 年这个时间点前后,Linux 远程管理进入"工具标准化"阶段:

  • OpenSSH 7.x(2016-2017 时代)已修复大量历史漏洞,sshd 默认配置趋于安全
  • Wake-on-LAN 仍是有线网卡机器远程开机的主流方案
  • Debian/Ubuntu 的网络配置正经历重构——Debian 9 (2017-06) 仍用 /etc/network/interfaces,但 Ubuntu 18.04 (2018-04) 起改用 netplan
  • systemd-resolved 在 Ubuntu 17.10 (2017-10) 起成为默认 DNS 解析

这一篇覆盖远程登录、远程拷贝、远程开机、网卡配置、DNS 配置——一个系统管理员日常要用的"远程"工具箱。

阅读建议:本文分四块——远程登录(SSH)、远程拷贝(SCP)、远程开机(WoL)、网络配置。强烈建议所有公开服务器禁止密码登录,只用密钥。

二、SSH 远程登录

2.1 sshpass:脚本里的免密登录

sshpass 允许在一条命令里把密码带上——典型场景是自动化脚本里临时用一下,生产环境请用 SSH 公私钥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 安装(CentOS)
yum install -y sshpass

# 安装(Debian/Ubuntu)
apt install -y sshpass

# 免密 SSH 登录
sshpass -p 'your-password' ssh root@<host-ip>

# sshpass + ssh 不提示 yes/no
sshpass -p 'your-password' ssh \
    -o StrictHostKeyChecking=no user@<host-ip>

2.2 优化:去掉"是否连接"的提示

第一次 SSH 连接到新主机时,会问"是否信任该主机(yes/no)"。在自动化场景下这个交互很烦。两种解决方案:

客户端配置(影响本机的所有 SSH 客户端):

1
2
3
4
vim /etc/ssh/ssh_config

# 加上这一行
StrictHostKeyChecking no

服务端配置(影响所有客户端连这台机器):

1
2
3
4
5
6
vim /etc/ssh/sshd_config

GSSAPIAuthentication no
UseDNS no

service sshd restart

三、SSH 公私钥登录:生产环境标配

强烈推荐:所有公开服务器禁止密码登录,只用密钥。

3.1 生成密钥对

1
2
3
4
5
6
ssh-keygen -t rsa
# 默认 2048 位 RSA,公私钥存在 ~/.ssh/

# 当前目录下多出两个文件
# id_rsa       ← 私钥(**绝不能泄露**)
# id_rsa.pub   ← 公钥(要上传到服务器)

3.2 上传公钥到服务器

方法一:手动复制

1
2
3
4
5
6
7
8
# 假设你已经在服务器上
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 把本地公钥内容粘贴进去
cat id_rsa.pub >> ~/.ssh/authorized_keys

方法二ssh-copy-id(如果装了)

1
ssh-copy-id -i ~/.ssh/id_rsa.pub user@<host-ip>

3.3 服务端配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
vim /etc/ssh/sshd_config

# 启用 RSA 认证(默认是 yes)
RSAAuthentication yes
PubkeyAuthentication yes

# 指定公钥文件位置
AuthorizedKeysFile .ssh/authorized_keys

# 允许 root 登录(视业务)
PermitRootLogin yes

# **关键:禁用密码登录**
PasswordAuthentication no

# 重启 sshd
service sshd restart

顺序很重要:先确认至少有一个账号能用公钥登录了,再去禁密码。否则一旦失联,就只能接显示器登录。

3.4 多个公钥

1
cat other_id_rsa.pub >> ~/.ssh/authorized_keys

一行一个公钥,OpenSSH 按顺序匹配。

四、scp 远程拷贝

4.1 本地 → 远程

1
2
3
4
5
6
7
8
# 文件
scp /local/file.txt user@<host>:/remote/path/

# 目录(加 -r)
scp -r /local/dir user@<host>:/remote/path/

# 携带密码(自动化场景)
sshpass -p 'your-password' scp -r /local/dir user@<host>:/remote/path/

4.2 远程 → 本地

1
2
3
4
5
6
7
8
# 文件
scp user@<host>:/remote/file.txt /local/path/

# 目录
scp -r user@<host>:/remote/dir /local/path/

# 携带密码
sshpass -p 'your-password' scp user@<host>:/remote/file.txt /local/path/

4.3 常用选项

选项含义
-P port指定端口(大写 P,不是 -p
-q去掉进度显示
-l limit限速(单位 Kbit/s)
-C压缩传输
-i keyfile指定私钥文件

更现代的替代rsyncsftp 都已经基本替代 scp 在生产环境的位置。rsync 增量传输、sftp 支持断点续传,scp 适合"小文件、临时一次性"的场景。

五、Wake-on-LAN 远程开机

WoL(Wake-on-LAN)允许通过网络发一个"魔术包",让关机状态下的机器开机。要求机器的有线网卡和主板都支持。

5.1 检查网卡是否支持 WoL

1
2
3
4
ethtool eno1
# 找到 "Supports Wake-on:" 和 "Wake-on:" 两行
# Supports Wake-on: pumbg
# Wake-on: d        ← d = 禁用
字段值含义
pWake on PHY activity
uWake on unicast messages
mWake on multicast messages
bWake on broadcast messages
aWake on ARP
gWake on MagicPacket(最常用
sEnable SecureOn password for MagicPacket
dDisable(默认)

5.2 启用 WoL

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 立即启用(重启后失效)
ethtool -s eno1 wol g

# 永久启用:写进网卡配置
# CentOS/RHEL
echo "ETHTOOL_OPTS='-s eno1 wol g'" >> /etc/sysconfig/network-scripts/ifcfg-eno1

# Debian/Ubuntu
# 在 /etc/network/interfaces 里加
# up ethtool -s eno1 wol g

5.3 查网卡物理地址(MAC)

1
2
ip a
# link/ether 58:11:22:c3:1b:4d

5.4 安装并发送魔术包

1
2
3
4
5
6
7
8
9
# 安装 wakeonlan
apt install wakeonlan    # Debian/Ubuntu
yum install wakeonlan    # CentOS(需 EPEL)

# 在同一局域网内发送
wakeonlan 58:11:22:c3:1b:4d

# 指定目标 IP(跨网段需要中继)
wakeonlan -i 10.8.33.5 58:11:22:c3:1b:4d

5.5 BIOS 也要打开 WoL

掉电恢复来电后 WoL 经常失效——这是主板 BIOS 没开

开机进 BIOS → Power Management Setup

  • Wake On LAN → 设为 Enable
  • 没有就找 Wake On PCI Card → 设为 Enable注意:PCI 选项可能有两个,确保只开一个,否则循环重启)
  • PME Event Wake Up → 设为 Enabled

两种 WoL 模式的区别

  • Wake On LAN —— 完全关机也能唤醒
  • Wake On PCI Card —— 深度休眠(hibernate)才能唤醒

5.6 远程关机

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 立即关机
shutdown now
# 或
shutdown --poweroff now

# 取消关机
shutdown -c

# 预关机(带警告)
shutdown --poweroff

# 深度睡眠
pm-hibernate

# 重启
shutdown --reboot

六、Debian / Ubuntu 网络配置

6.1 Debian 9/10:/etc/network/interfaces

1
2
3
4
5
6
# 重启网络
/etc/init.d/networking restart
systemctl restart networking

# 网卡配置
vim /etc/network/interfaces
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*

# 环回口
auto lo
iface lo inet loopback

# DHCP 自动获取
auto eth0
iface eth0 inet dhcp

# 静态 IP
auto eth0
iface eth0 inet static
address 192.168.1.122
netmask 255.255.255.0
gateway 192.168.1.2

6.2 查看 DNS

1
2
3
4
5
6
7
# 临时配置
cat /etc/resolv.conf
# nameserver 8.8.8.8
# nameserver 114.114.114.114

# 永久配置
sudo apt install resolvconf

6.3 Ubuntu 18.04+:netplan

Ubuntu 18.04 起改用 netplan(YAML 格式):

1
2
# 配置
vim /etc/netplan/00-installer-config.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
network:
  ethernets:
    eno1:
      dhcp4: false
      addresses:
        - 192.168.10.127/24
      routes:
        - to: default
          via: 192.168.10.1
      nameservers:
        addresses: [211.138.24.66, 114.114.114.114, 192.168.10.1]
    eno2:
      dhcp4: true
    eno3:
      dhcp4: true
    eno4:
      dhcp4: true
  version: 2
1
2
# 应用配置
netplan apply

从 interfaces 迁移到 netplan:2017-2018 是过渡期,老教程仍是 interfaces,新机器按 netplan 走。

6.4 DNS:systemd-resolved

Ubuntu 17.10 起默认启用 systemd-resolved。

1
2
3
4
5
6
7
8
vim /etc/systemd/resolved.conf

[Resolve]
# 几个公开 DNS(示例)
#DNS=1.1.1.1 8.8.8.8
DNS=114.114.114.114

systemctl restart systemd-resolved

/etc/resolv.conf 经常被覆盖/etc/resolv.conf 实际上是软链接到 /run/systemd/resolve/stub-resolv.conf,手动改 /etc/resolv.conf 重启后会失效。正确做法是改 /etc/systemd/resolved.conf

七、Debian 静态 IP 实际案例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 查当前 IP
ip a
# 或
ifconfig

# 2. 备份原配置
cp /etc/network/interfaces /etc/network/interfaces.bak

# 3. 改成静态
cat > /etc/network/interfaces << "EOF"
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.1.122
netmask 255.255.255.0
gateway 192.168.1.2
EOF

# 4. 重启
systemctl restart networking

八、前置知识 / 下一步

  • 想了解 SSH 高级用法(端口转发、代理)→ 翻独立文章
  • 想了解 fail2ban 防爆破 → 翻本系列《Linux 用户管理与安全加固》
  • 想了解 Wake-on-LAN 跨网段(需要路由器支持)→ 翻独立文章
  • 想了解 rsync 增量同步替代 scp → 翻独立文章
  • 想了解 ufw 防火墙配置 → 翻本系列《Ubuntu 发行版实战》

九、参考资源


2024 视角:7 年后远程管理的"新王"和"新坑"

2017 那篇的 SSH 公私钥、scp、Wake-on-LAN 在 2024 仍管用——但有 3 个新趋势必须知道:

一、ed25519 全面替代 RSA 2048

2017 那篇示范 ssh-keygen -t rsa(默认 2048 位)。2024 实际项目里 ed25519 已经是事实标准:

算法密钥长度性能抗量子兼容性
RSA 20482048 位慢(签名/验签 1-3ms)弱(量子 Shor 算法秒破)全平台
RSA 40964096 位极慢(10-30ms)较弱全平台
ed25519256 位极快(< 0.1ms)中(仍是椭圆曲线)OpenSSH 6.5+(2014)
ECDSA P-256256 位OpenSSH 5.7+(2008)
ML-DSA(Dilithium)1312 字节强(抗量子)OpenSSH 9.x 实验中

2024 默认推荐

1
2
3
4
5
6
# ed25519
ssh-keygen -t ed25519 -C "lwd@<your-host>"

# 加 passphrase(用 ssh-agent / GNOME Keyring 记)
ssh-keygen -t ed25519 -a 100 -C "lwd@<your-host>"
# -a 100 = 100 轮 KDF,增强私钥文件抗爆破

二、SSH 配置的"现代化"补充

  • Include /etc/ssh/sshd_config.d/*.conf2024 推荐——把配置拆到 /etc/ssh/sshd_config.d/ 目录,sshd 8.0+ 已支持。
  • KDF rounds on private key:私钥 KDF 迭代次数(-a 参数)。
  • Include ~/.ssh/config.d/*.conf:客户端也可以 Include 拆分。
  • GSSAPI / DNS 关闭默认已 ok。
  • Include 路径匹配
1
2
3
4
5
6
7
8
9
# 客户端 ~/.ssh/config
Include config.d/*.conf

# /etc/ssh/sshd_config.d/00-hardening.conf
PasswordAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
X11Forwarding no
AllowAgentForwarding no

三、scp 全面弃用,改用 sftp / rsync

  • OpenSSH 9.0(2022-04)开始打印 WARNING: scp is deprecated
  • sftp(基于 SSH 的 FTP)支持断点续传目录浏览
1
2
3
4
5
# 上传
sftp user@host <<< 'put -r /local/dir /remote/path'

# 下载
sftp user@host <<< 'get -r /remote/path /local/'
  • rsync(增量同步)做"两台机器同步":
1
2
3
4
5
rsync -avz --progress /local/dir/ user@host:/remote/dir/
# -a 归档模式
# -v 详细
# -z 传输时压缩
# --progress 显示进度

四、Wake-on-LAN 在云时代的"替代方案"

  • 2017 那篇 WoL 在家用 / 局域网场景仍管用。
  • 但 2024 云服务器根本没 WoL 概念——开机通过云厂商 API。
  • 远程开机的现代姿势:
    • AWS:Lambda + CloudWatch Events + EC2 API
    • 阿里云:函数计算 + 定时触发器 + ECS StartInstance
    • 小米插座 / 智能插线板:远程给机器上电(家里老台式机)
1
2
3
4
5
6
7
8
# 阿里云 SDK 远程开机
from aliyunsdkcore.client import AcsClient
from aliyunsdkecs.request.v20140526 import StartInstanceRequest

client = AcsClient('<access-key-id>', '<access-key-secret>', 'cn-hangzhou')
request = StartInstanceRequest.StartInstanceRequest()
request.set_InstanceIds(['i-bp1xxxxxxxxxxxxxx'])
client.do_action_with_exception(request)

五、WireGuard 替代 SSH 隧道 + frp

  • 2017 那篇没提 SSH 端口转发 -L / -R。2024 的"点对点 VPN"首选是 WireGuard
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 装
apt install wireguard

# 生成密钥
wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey

# 配置 /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
PrivateKey = <server-private-key>
ListenPort = 51820

[Peer]
PublicKey = <client-public-key>
AllowedIPs = 10.0.0.2/32
  • 优势:内核态实现(性能是 OpenVPN 4 倍)、配置极简(单文件)、roaming 友好(IP 变化不重连)。
  • SSH 隧道还在用:但主要是"临时单端口转发",长期组网全部走 WireGuard / Tailscale / ZeroTier。

六、网络配置:NetworkManager 已成"事实上默认"

  • 2017 那篇给的 /etc/network/interfaces 写法,在 Debian 12+(2023-06)已经被 NetworkManager 取代
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 看现有连接
nmcli connection show

# 改 IP
nmcli connection modify "Wired connection 1" \
    ipv4.addresses 192.168.1.100/24 \
    ipv4.gateway 192.168.1.1 \
    ipv4.dns "1.1.1.1,8.8.8.8" \
    ipv4.method manual

nmcli connection up "Wired connection 1"
  • Ubuntu 22.04+ / Debian 12+:服务器版仍可装 ifupdowninterfaces,但新项目默认 NetworkManager
  • nmcli / nmtui 比手写 YAML 更易维护。

七、Tailscale / ZeroTier 终结"内网穿透"

  • 2017 那篇 SSH 远程登录到"内网"用 frp(2017 那篇还没提 frp,那篇主要是 SSH)。2024 趋势
    • Tailscale(基于 WireGuard,5 分钟建全球组网)—— 个人免费 100 台设备
    • ZeroTier(P2P + 控制器)—— 同样免费 25 台
    • Cloudflare Tunnel(云原生时代)—— cloudflared 一行命令把内网服务暴露公网
1
2
3
4
# Tailscale(2024 年最易上手)
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up
# 自动获得 100.x.x.x 虚拟 IP,全网互通
使用 Hugo 构建
主题 StackJimmy 设计