从源码安装 SSH

loskyertt Unknown

1.构建基础镜像

在当期目录下(与Dockerfile同目录),添加sources.list文件,并添加镜像源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Ubuntu sources have moved to the /etc/apt/sources.list.d/ubuntu.sources
# file, which uses the deb822 format. Use deb822-formatted .sources files
# to manage package sources in the /etc/apt/sources.list.d/ directory.
# See the sources.list(5) manual page for details.

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
# deb http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse

Ubuntu清华镜像源

Dockerfile编写:

1
2
3
4
5
6
7
8
9
10
11
12
FROM ubuntu

ENV http_proxy=http://172.27.150.74:7890/
ENV https_proxy=http://172.27.150.74:7890/

RUN apt-get update && apt-get install -y nano wget sudo net-tools

COPY sources.list /etc/apt/

EXPOSE 22

WORKDIR /root/

根据自己实际情况设置代理环境(ENV)。

然后开始构建镜像:

1
docker build -t ubuntu:openssh .

2.创建容器

运行一个容器实例:

1
docker run -it --name=ssh ubuntu:openssh

3.从源码安装 SSH

要从源码安装和升级 OpenSSH,在 Ubuntu 上可以按照以下步骤操作:

3.1 准备环境

首先,确保系统中安装了编译 OpenSSH 所需的依赖包。

1
2
sudo apt update
sudo apt install build-essential zlib1g-dev libssl-dev libpam0g-dev libselinux1-dev

3.2 下载 OpenSSH 源码

从官方 OpenSSH 网站下载最新的源码压缩包:

1
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-X.XX.tar.gz

X.XX 替换为最新版本的版本号,可以在 OpenSSH 官网 查询最新版本。

解压缩下载的文件:

1
2
tar -xzf openssh-X.XX.tar.gz先设置下容器的`root`账户的
cd openssh-X.XX

3.3 配置 OpenSSH

在编译 OpenSSH 之前,使用 configure 脚本来生成 Makefile。可以根据你的系统环境和需求指定一些配置选项:

1
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-ssl-engine

常用的选项包括:

  • --prefix=/usr: 将安装路径设置为 /usr 而不是默认的 /usr/local
  • --sysconfdir=/etc/ssh: 指定配置文件目录为 /etc/ssh
  • --with-pam: 启用 PAM(可插拔认证模块)。
  • --with-ssl-engine: 使用 OpenSSL 的 SSL 引擎。

你可以使用 ./configure --help 来查看所有可用的配置选项。

3.4 编译 OpenSSH

配置完成后,编译源码:

1
make

编译完成后,可以通过 make tests 运行测试,以确保 OpenSSH 正确构建。

3.5 安装 OpenSSH

在编译成功并通过测试后,使用 make install 来安装 OpenSSH。

1
sudo make install

这个命令将会把编译好的文件安装到系统中。

执行时可能会出现这种错误:

1
Privilege separation user sshd does not exist

该错误与sshd用户的缺失有关,这是 OpenSSH 用于权限隔离的一个功能。没有这个用户,SSH 守护进程可能无法正常启动。

解决办法:

  • 创建sshd用户:

    1
    sudo useradd -r -d /var/empty -s /usr/sbin/nologin sshd
  • 验证配置:

    1
    sudo /usr/sbin/sshd -t -f /etc/ssh/sshd_config

    如果没有输出或错误,说明配置文件是正确的。

3.6 配置 OpenSSH

安装完成后,检查 OpenSSH 的配置文件 /etc/ssh/sshd_config

找到以下配置项,并确保它们没有被注释掉(前面没有#)并且值设置正确:

1
2
PasswordAuthentication yes
PermitRootLogin yes

记得设置容器中root用户的密码:

1
passwd

升级或重新安装可能会覆盖某些配置,因此你可能需要备份原有的配置文件并重新应用它们:

1
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

编辑新的配置文件:

1
sudo nano /etc/ssh/sshd_config

3.7 重启 SSH 服务

安装完成后,需要重新启动 SSH 服务来应用新版本:

1
sudo systemctl restart ssh

你可以通过以下命令确认 SSH 版本是否更新:

1
ssh -V

环境中可能没有systemctl,先检查下是否有service

1
which service

可以用service来控制:

1
sudo service ssh status
1
sudo service ssh start

如果service不可用,可以直接运行sshd来启动:

1
which sshd

运行:

1
/usr/sbin/sshd

8. 防止自动更新覆盖

默认情况下,Ubuntu 使用 apt 来自动管理和更新软件包。如果你不希望 OpenSSH 通过 apt 更新被覆盖,可以将其锁定:

1
sudo apt-mark hold openssh-server openssh-client

这样可以确保 apt 不会自动更新 OpenSSH。

3.9 验证安装

最后,确保 OpenSSH 正常运行。通过以下命令验证 SSH 是否正在监听:

1
sudo systemctl status ssh

没有systemctl的话,可以用:

1
ps aux | grep sshd

输出是这样表示启动成功:

1
2
root       10106  0.0  0.0   8784  4508 ?        Ss   06:28   0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
root 10150 0.0 0.0 3528 1872 pts/0 S+ 06:32 0:00 grep --color=auto sshd

3.8 连接

在宿主机中测试:

1
ssh root@<container_IP>
  • Title: 从源码安装 SSH
  • Author: loskyertt
  • Created at : 2024-09-11 11:24:33
  • Updated at : 2024-11-13 03:07:10
  • Link: https://redefine.ohevan.com/2024/09/11/从源码安装SSH/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments