确保在配置之前已经配置好了防火墙!!!开启了新的ssh端口!
一、SSH配置文件设置
1. SSH配置文件的位置和备份
- 位置: SSH服务器的配置文件通常位于
/etc/ssh/sshd_config
。 - 备份: 在进行任何更改之前,务必备份原始配置文件。这可以在出现问题时轻松恢复到默认设置:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
2. 修改SSH配置文件的关键选项
使用你喜欢的文本编辑器(如 nano
、vim
或 gedit
)以管理员权限打开 /etc/ssh/sshd_config
文件:
sudo nano /etc/ssh/sshd_config
以下是一些需要重点关注和修改的配置选项:
- Port(端口)
- 默认值:
22
- 建议: 更改为非标准端口(例如,1024-65535之间的端口)。这可以减少自动化的SSH扫描和暴力破解尝试。
- 配置示例:
- 默认值:
Port 2222
- ListenAddress(监听地址)
- 默认值: 通常监听所有接口(
0.0.0.0
或::
) - 建议: 如果你的服务器有多个IP地址,并且你只想让SSH在特定IP上监听,可以指定该IP地址。这有助于限制SSH服务的暴露范围。
- 配置示例:
- 默认值: 通常监听所有接口(
ListenAddress 192.168.1.100 # 只监听特定IP
- PermitRootLogin(允许root登录)
- 默认值: 可能是
yes
- 建议: 强烈建议设置为
no
。禁止root用户直接通过SSH登录。你应该创建一个普通用户,通过sudo
来执行需要管理员权限的操作。 - 配置示例:
- 默认值: 可能是
PermitRootLogin no
- PasswordAuthentication(密码认证)
- 默认值: 可能是
yes
- 建议: 强烈建议设置为
no
。禁用密码认证,转而使用更安全的密钥认证方式。 - 配置示例:
- 默认值: 可能是
PasswordAuthentication no
- PubkeyAuthentication(公钥认证)
- 默认值: 通常是
yes
- 建议: 确保启用公钥认证(如果已禁用密码认证,则必须启用)。
- 配置示例:
- 默认值: 通常是
PubkeyAuthentication yes
- AuthorizedKeysFile(授权密钥文件)
- 默认值:
.ssh/authorized_keys
- 建议: 通常不需要修改。它指定了存储允许登录的公钥的文件路径(每个用户的主目录下)。
- 配置示例:
- 默认值:
AuthorizedKeysFile .ssh/authorized_keys
- AllowUsers / AllowGroups (允许的用户/组)
- 默认值: 通常未设置,表示允许所有用户。
- 建议: 设置白名单,只允许特定用户或组通过SSH登录。
- 配置示例:
AllowUsers user1 user2 # 只允许user1和user2登录 AllowGroups sshusers # 只允许sshusers组中的用户登录
- 注意: 请将
user1
、user2
和sshusers
替换为实际的用户名和组名。 - ClientAliveInterval / ClientAliveCountMax(客户端保持连接)
- 默认值: 通常未设置。
- 建议: 设置这些选项可以帮助检测并关闭空闲的SSH连接,防止资源浪费和潜在的安全风险。
- 配置示例:
ClientAliveInterval 60 # 每60秒发送一次保持连接消息
ClientAliveCountMax 3 # 如果连续3次未收到响应,则断开连接
- MaxAuthTries(最大认证尝试次数)
- 默认值: 通常是
6
- 建议: 减少此值(例如,设置为
3
或4
)以降低暴力破解成功的可能性。 - 配置示例:
- 默认值: 通常是
MaxAuthTries 3
- MaxSessions(最大会话数)
- 默认值: 通常是10
- 建议 根据服务器的负载能力和预期连接数调整,过高的数值容易导致服务器崩溃
- 配置示例
MaxSessions 5
- LoginGraceTime(登录宽限时间)
- 默认值: 通常是
2m
(两分钟) - 建议: 缩短此时间(例如,设置为
30s
或1m
)以减少恶意用户尝试登录的时间窗口。 - 配置示例:
- 默认值: 通常是
LoginGraceTime 30s
- UsePAM(使用PAM)
- 默认值:
yes
- 建议: 通常情况下保留默认值
yes
。PAM(Pluggable Authentication Modules)是Linux系统中用于用户身份验证的框架,提供了一种灵活的方式来管理身份验证策略。 - 配置示例:
- 默认值:
UsePAM yes
如果你禁用了密码登录并且启用了UsePAM,请确保ChallengeResponseAuthentication
为no
ChallengeResponseAuthentication no
- X11Forwarding (X11 转发)
- 默认值:
no
- 建议: 除非你确实需要通过SSH隧道传输X11图形应用程序,否则保持禁用状态。
- 配置示例:
- 默认值:
X11Forwarding no
- Banner (登录横幅)
- 默认值: 通常未设置。
- 建议: 可以设置一个包含安全警告或法律声明的文本文件,在用户登录前显示。
- 配置示例:
Banner /etc/ssh/banner.txt
然后,创建/etc/ssh/banner.txt
文件并添加你希望显示的文本。
3. 保存更改并重启SSH服务
完成配置文件的修改后:
- 保存文件: 在
nano
编辑器中,按Ctrl + O
保存,然后按Enter
确认文件名,最后按Ctrl + X
退出。 - 重启SSH服务: 使更改生效。根据你的Linux发行版,使用以下命令之一:
sudo systemctl restart sshd # 对于使用systemd的系统(如Ubuntu 16.04+、Debian 8+、CentOS 7+)
sudo service ssh restart # 对于使用SysVinit的系统(如较旧的Ubuntu/Debian版本)
sudo /etc/init.d/ssh restart # 另一种SysVinit系统的方式
4. 测试新的SSH配置
在完全退出当前SSH会话之前,务必在新终端窗口中测试新的SSH配置:
- 尝试连接: 使用新的端口、用户名和密钥(如果已配置)尝试从另一台计算机或终端连接到服务器。
- 验证设置: 确保所有设置(如端口、root登录限制、密钥认证)都按预期工作。
5. 密钥认证的设置(如果已禁用密码认证)
如果你禁用了密码认证,必须设置密钥认证才能登录。以下是步骤:
- 生成密钥对(在客户端计算机上):
ssh-keygen -t rsa -b 4096 # 生成4096位RSA密钥对(更安全)
按照提示操作,可以选择设置密码(passphrase)来保护私钥。
2. 将公钥复制到服务器:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@your_server_ip -p 2222 #这里需要换成你配置的ssh端口
将 user
替换为你在服务器上的用户名,your_server_ip
替换为服务器的IP地址或域名。如果使用了非标准SSH端口,请通过-p指定
3. 测试密钥认证: 尝试使用SSH连接到服务器,你应该能够无需密码直接登录(如果设置了密钥密码,则需要输入密钥密码)。
二、ssh.socket
设置
1. 理解 systemd 和 ssh.socket
- systemd: systemd 是现代 Linux 发行版中广泛使用的初始化系统和服务管理器。它负责启动和管理系统服务,包括 SSH 服务。
ssh.socket
: 这是一个 systemd socket unit 文件。它定义了 SSH 服务应该监听的网络套接字(IP 地址和端口)。systemd 会根据ssh.socket
的配置来监听连接,然后将传入的连接传递给sshd
进程(由sshd.service
管理)。- 优先级:
ssh.socket
中的设置具有更高的优先级,会覆盖sshd_config
中的Port
选项。
2. 检查和修改 ssh.socket
(如果存在)
首先,你需要检查你的系统是否使用了 ssh.socket
。通常,较新的 systemd 系统会默认使用它。
- 检查
ssh.socket
是否启用:
systemctl is-enabled ssh.socket
- 如果输出
enabled
,则表示ssh.socket
正在使用。 - 如果输出
disabled
或static
,则表示ssh.socket
未启用,SSH 服务直接由sshd.service
管理,你只需修改sshd_config
。 - 如果输出
masked
, 则ssh.socket被屏蔽,需要先unmask
sudo systemctl unmask ssh.socket
- 查看
ssh.socket
的配置:
systemctl cat ssh.socket
这将显示 ssh.socket
文件的内容。你可能会看到类似如下的配置:
[Unit]
Description=SSH Socket for Per-Connection Servers
[Socket]
ListenStream=22
Accept=yes
[Install]
WantedBy=sockets.target
ListenStream=22
指定了 SSH 监听的端口。
3. 修改 ssh.socket
(如果需要更改端口):
- 不要直接编辑原始文件! systemd 推荐使用 override 文件来修改系统单元的配置。
- 创建 override 文件:
sudo systemctl edit ssh.socket
这将打开一个编辑器(通常是 nano
或 vim
)。
- 添加或修改配置: 在打开的文件中,添加或修改
[Socket]
部分的ListenStream
选项。例如,要将端口更改为 2222:
[Socket]
ListenStream=2222
如果你要添加多个监听地址
[Socket]
ListenStream=2222
ListenStream=192.168.1.100:2222
- 保存并关闭文件。
- 重新加载 systemd 配置并重启 SSH:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
sudo systemctl restart sshd.service #可能需要重启sshd.service来使配置在sshd_config的配置生效
三、检查当前 SSH 服务器正在使用的端口
使用 netstat
或 ss
命令 (需要 root 或 sudo 权限)
sudo netstat -tulnp | grep sshd # 较旧的系统可能使用 netstat
# 或者
sudo ss -tulnp | grep sshd # 较新的系统推荐使用 ss
这两条命令都会列出所有正在监听的网络端口及其对应的进程。通过查找 sshd
进程,你可以看到它正在监听哪个端口。输出示例:
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 1234/sshd
tcp6 0 0 :::2222 :::* LISTEN 1234/sshd
在这个例子中,SSH 服务器正在监听 2222 端口。