VMware Ubuntu 22.04 NAT模式下配置GitHub SSH完整教程(含踩坑实录+报错_成功信息对照)

在虚拟机环境中通过SSH连接GitHub,是开发中常见的需求。本文将详细记录在VMware Ubuntu 22.04(NAT模式)下配置GitHub SSH的完整流程,包括关键步骤、遇到的问题及针对性解决方案,明确标注每个步骤的成功输出与报错信息,让新手能快速对照判断,高效解决问题。

一、前置准备

1. 确认虚拟机网络连通性

NAT模式下,虚拟机需正常联网才能与GitHub通信。打开Ubuntu终端,执行以下命令测试网络:

bash 复制代码
ping github.com
成功信息

收到连续的ICMP回复,示例:

plain 复制代码
PING github.com (140.82.112.3) 56(84) bytes of data.
64 bytes from 140.82.112.3 (140.82.112.3): icmp_seq=1 ttl=54 time=29.1 ms
64 bytes from 140.82.112.3 (140.82.112.3): icmp_seq=2 ttl=54 time=28.7 ms
报错信息

无回复或提示"Network is unreachable",示例:

plain 复制代码
ping: connect: Network is unreachable
# 或
PING github.com (::1) 56 data bytes
From ::1 icmp_seq=1 Destination host unreachable
解决办法

若能收到回复,说明联网正常;若不通,可重启虚拟机网络或检查 VMware NAT 服务:

bash 复制代码
# 重启网络服务
sudo systemctl restart NetworkManager
# 主机端需确认VMware NAT Service已启动(Windows:服务列表;Linux:systemctl status vmware-natd)

2. 环境说明

  • 虚拟机:VMware Workstation
  • 系统:Ubuntu 22.04 LTS
  • 网络模式:NAT
  • 核心目标:通过SSH协议克隆、推送GitHub仓库,替代HTTPS方式

二、配置GitHub SSH核心步骤

步骤1:生成SSH密钥对

GitHub推荐使用`ed25519`算法生成密钥,安全性更高,执行以下命令:

bash 复制代码
# 替换为你的GitHub注册邮箱
ssh-keygen -t ed25519 -C "your_email@example.com"
执行过程中的提示与回应
  • 提示1:Enter file in which to save the key (/home/king/.ssh/id_ed25519): → 直接回车(密钥保存路径,默认,无需修改)
  • 提示2:Enter passphrase (empty for no passphrase): → 直接回车(无密码,或输入密码后回车)
  • 提示3:Enter same passphrase again: → 直接回车(无密码,或重复输入密码后回车)
成功信息

密钥生成完成,输出示例:

plain 复制代码
Generating public/private ed25519 key pair.
Your identification has been saved in /home/king/.ssh/id_ed25519
Your public key has been saved in /home/king/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:A5Jiddj6oKbNO4slvyVUZ7LK4PwhlQUHGVaaoQegJSM your_email@example.com
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|                 |
|                 |
|        .        |
|      . S .      |
|     o + * .     |
|    + = B O      |
|   . X * % *     |
|    +*@=B#=      |
+----[SHA256]-----+
报错信息

若系统不支持`ed25519`算法,会提示:

plain 复制代码
unknown key type ed25519
替代方案

改用RSA算法生成密钥:

bash 复制代码
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

生成成功后,~/.ssh目录下会出现两个文件:

  • id_ed25519/id_rsa:私钥(切勿泄露给他人)
  • id_ed25519.pub/id_rsa.pub:公钥(需上传到GitHub)

步骤2:启动ssh-agent并添加私钥

ssh-agent是管理SSH私钥的进程,需先启动并将私钥添加进去:

bash 复制代码
# 启动ssh-agent
eval "$(ssh-agent -s)"
成功信息

进程启动,输出示例:

plain 复制代码
Agent pid 45380  # PID为随机值,格式正确即成功
报错信息

若启动失败,会提示:

plain 复制代码
eval: 1: Syntax error: "(" unexpected
解决办法

确保命令输入完整,重新执行:eval "$(ssh-agent -s)"(注意引号和括号格式)。

接着添加私钥:

bash 复制代码
# 若修改过密钥保存路径,需替换为实际路径
ssh-add ~/.ssh/id_ed25519
成功信息

私钥添加完成,输出示例:

plain 复制代码
Identity added: /home/king/.ssh/id_ed25519 (your_email@example.com)
报错信息

若私钥路径错误或权限异常,会提示:

plain 复制代码
Could not open a connection to your authentication agent.
# 或
Permissions 0755 for '/home/king/.ssh/id_ed25519' are too open.
解决办法
bash 复制代码
# 若提示无法连接agent,重新启动ssh-agent
ssh-agent -k && eval "$(ssh-agent -s)"
# 若提示权限过松,修复私钥权限
chmod 600 ~/.ssh/id_ed25519

步骤3:将公钥添加到GitHub

  1. 查看并复制公钥完整内容:
bash 复制代码
cat ~/.ssh/id_ed25519.pub
成功信息

输出公钥完整内容,示例:

plain 复制代码
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKZ8kU3u4zUfG6cQzL2F8eX7Yt4aG9xQwVh5d6s7f8gH your_email@example.com

需全选复制(包括开头的ssh-ed25519和结尾的邮箱)。

  1. 登录GitHub上传公钥:
  • 点击右上角头像 → Settings → 左侧菜单SSH and GPG keysNew SSH key
  • Title:自定义名称(如"Ubuntu-VM-NAT",便于区分设备)
  • Key:粘贴刚才复制的公钥完整内容
  • 点击Add SSH key,验证GitHub密码即可完成添加
成功信息

GitHub页面提示 "SSH key added successfully",在 SSH and GPG keys 列表中可看到新增的密钥(显示标题和指纹)。

报错信息

若公钥粘贴不完整,会提示:

plain 复制代码
Key is invalid. It must begin with 'ssh-rsa', 'ssh-ed25519', etc.
解决办法

重新执行cat ~/.ssh/id_ed25519.pub,确保复制完整内容(无多余空格、无换行缺失)。

步骤4:测试SSH连接(首次测试遇坑)

执行以下命令测试连接:

bash 复制代码
ssh -T git@github.com
首次测试报错信息

要求输入git@github.com的密码,多次输入后认证失败:

plain 复制代码
git@github.com's password: 
Permission denied, please try again.
git@github.com's password: 
Permission denied, please try again.
git@github.com's password: 
Received disconnect from ::1 port 22:2: Too many authentication failures
Disconnected from ::1 port 22

三、关键问题排查与解决方案(含报错/成功对照)

问题1:域名解析错误(核心坑点)

现象

SSH 连接时,github.com 被解析到本地回环地址 ::1(IPv6 的 127.0.0.1),导致连接的是本地而非真正的 GitHub 服务器。

排查

通过ssh -vT git@github.com查看debug日志,发现关键报错信息:

plain 复制代码
debug1: Connecting to github.com [::1] port 22.
# 正常应显示:debug1: Connecting to github.com [140.82.112.3] port 22.

::1是本地回环地址,说明未连接到真正的GitHub服务器。

正常情况下,github.com 应解析到其公网 IP(如 140.82.112.3),而非本地地址。

排查步骤1:检查 /etc/hosts文件
bash 复制代码
sudo nano /etc/hosts
正常情况

若文件中存在::1 github.com127.0.0.1 github.com,直接删除(本文环境中hosts文件正常,无错误配置)。

文件内容无错误绑定,示例:

plain 复制代码
127.0.0.1       localhost
127.0.1.1       test-virtual-machine
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
报错情况

文件中存在::1 github.com127.0.0.1 github.com,需直接删除该条目。

排查步骤2:查看当前DNS服务器(NAT 网关 DNS 不可靠)

Ubuntu 22.04 默认使用systemd-resolved管理 DNS,执行以下命令查看当前 DNS 配置:

bash 复制代码
# 查看实际使用的上游DNS
resolvectl status
报错信息(DNS异常)

输出显示DNS服务器为VMware NAT网关IP(如192.168.28.2),该网关 DNS 解析异常,需手动配置公共 DNS(无公共DNS):

plain 复制代码
Link 2 (ens33)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.28.2
       DNS Servers: 192.168.28.2
解决方案:通过netplan配置公共DNS
  1. Ubuntu 22.04 使用 netplan 管理网络,先找到netplan配置文件:
bash 复制代码
ls /etc/netplan/

编辑配置文件(本文以01-network-manager-all.yaml为例):

成功信息

编辑配置文件(本文以01-network-manager-all.yaml为例):

列出配置文件,示例:

plain 复制代码
01-network-manager-all.yaml
  1. 编辑配置文件:
bash 复制代码
sudo nano /etc/netplan/01-network-manager-all.yaml
  1. 添加公共 DNS 配置(注意 YAML 格式缩进,用 2 个或 4 个空格,不可用 Tab):
yaml 复制代码
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    ens33:  # 网卡名称,通过resolvectl status确认 输出Link 2 (ens33),括号里的ens33就是网卡名称
      dhcp4: true  # NAT模式默认DHCP自动获取IP
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114, 1.1.1.1]  # 公共DNS
  1. 应用配置并重启服务:
bash 复制代码
# 应用netplan配置
sudo netplan apply
# 重启网络相关服务
sudo systemctl restart NetworkManager
sudo systemctl restart systemd-resolved
应用配置时的报错信息

若配置文件格式错误(如缩进用Tab),会提示:

plain 复制代码
Error in network definition /etc/netplan/01-network-manager-all.yaml line 5 column 6: expected indentation
解决办法

将Tab替换为空格,确保每个层级缩进一致(推荐2个空格)。

netplan 配置文件权限警告(非致命报错)
现象

执行`sudo netplan apply`时,出现权限警告:

plain 复制代码
WARNING **: Permissions for /etc/netplan/01-network-manager-all.yaml are too open.
解决办法

修改文件权限为仅root可读写:

bash 复制代码
sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
权限修复成功信息

再次执行sudo netplan apply,无任何警告,直接返回命令行。

  1. 验证DNS解析是否正常:
bash 复制代码
# 查看DNS是否切换成功
resolvectl status ens33
# 测试github.com解析
nslookup github.com
DNS切换成功信息
plain 复制代码
Link 2 (ens33)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 8.8.8.8
       DNS Servers: 8.8.8.8 114.114.114.114 1.1.1.1
解析成功信息(nslookup输出)
plain 复制代码
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   github.com
Address: 140.82.112.3
Name:   github.com
Address: 2606:50c0:8000::153

正常输出应返回 GitHub 公网 IP(如 140.82.112.3),而非::1

问题2:主机密钥验证失败

现象

DNS修复后,重新测试SSH连接:

bash 复制代码
ssh -T git@github.com

输出以下安全警告:

plain 复制代码
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
Please contact your system administrator.
Add correct host key in /home/king/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/king/.ssh/known_hosts:1
  remove with:
  ssh-keygen -f "/home/king/.ssh/known_hosts" -R "github.com"
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
原因

之前连接错误的"github.com"(本地地址::1)时,已将其主机密钥保存到~/.ssh/known_hosts文件中,现在连接真正的GitHub服务器,主机密钥不一致,系统触发安全保护。

解决方案:删除旧主机密钥
bash 复制代码
ssh-keygen -f "/home/king/.ssh/known_hosts" -R "github.com"
删除成功信息
plain 复制代码
# Host github.com found: line 1
/home/king/.ssh/known_hosts updated.
Original contents retained as /home/king/.ssh/known_hosts.old
重新测试SSH连接
bash 复制代码
ssh -T git@github.com
首次连接提示(需确认)

重新执行测试命令,首次连接会提示确认新的主机密钥,输入yes回车:

plain 复制代码
The authenticity of host 'github.com (140.82.112.3)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

输入yes并回车。

主机密钥保存成功信息
plain 复制代码
Warning: Permanently added 'github.com,140.82.112.3' (ED25519) to the list of known hosts.

四、最终测试与验证

SSH连接成功信息

bash 复制代码
ssh -T git@github.com

输出以下内容,说明认证成功:

plain 复制代码
Hi your_github_username! You've successfully authenticated, but GitHub does not provide shell access.

仓库克隆测试(验证SSH可用性)

此时即可通过 SSH 协议操作 GitHub 仓库,例如克隆GitHub仓库(替换为你的仓库地址):

bash 复制代码
git clone git@github.com:your_username/your_repo.git
克隆成功信息
plain 复制代码
Cloning into 'your_repo'...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 10 (delta 1), reused 10 (delta 1), pack-reused 0
Receiving objects: 100% (10/10), done.
Resolving deltas: 100% (1/1), done.
克隆报错信息(若仍有问题)
plain 复制代码
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
解决办法
  1. 确认GitHub上的公钥与本地公钥一致:cat ~/.ssh/id_ed25519.pub 对比GitHub上的密钥。
  2. 重新添加私钥到ssh-agent:ssh-add ~/.ssh/id_ed25519

五、总结与注意事项

核心关键点

  1. NAT模式下,虚拟机DNS默认继承自VMware网关,若网关DNS不可靠,需手动配置公共DNS(8.8.8.8、114.114.114.114等)。
  2. SSH密钥对生成后,需确保私钥权限为600、.ssh目录权限为700,否则密钥认证会失效。
  3. known_hosts文件会记录主机密钥,更换连接目标(或目标服务器密钥变更)时,需删除旧条目。
  4. YAML格式对缩进敏感,修改netplan配置文件时务必注意缩进一致性。

常见避坑指南

  • 若出现"Permission denied",优先检查公钥是否与GitHub上的一致、私钥是否添加到ssh-agent。
  • 若解析仍异常,可重启虚拟机确保网络配置完全生效。
  • 密钥算法选择:优先ed25519,若系统不支持,改用rsa -b 4096
  • 所有操作的成功/报错信息已明确标注,操作时可逐步对照,快速定位问题。

通过以上步骤,即可在VMware Ubuntu 22.04 NAT模式下稳定使用SSH连接GitHub,后续开发中无需重复输入账号密码,提升操作效率。

相关推荐
_不会dp不改名_2 小时前
HCIP笔记5--OSPF域间路由、虚链路、认证
网络·笔记·hcip
百***67032 小时前
Nodemailer使用教程:在Node.js中发送电子邮件
linux·运维·node.js
ddacrp2 小时前
RHEL_NFS服务器
linux·服务器·网络
CoderJia程序员甲2 小时前
GitHub 热榜项目 - 日榜(2025-11-13)
ai·开源·github·1024程序员节·ai教程
码界奇点3 小时前
Linux进程间通信三System V 共享内存完全指南原理系统调用与 C 封装实现
linux·c语言·网络·c++·ux·risc-v
虫洞没有虫3 小时前
Go语言学习笔记(二)
笔记·学习
AA陈超3 小时前
ASC学习笔记0001:处理目标选择系统中当Actor拒绝目标确认时的调用
c++·笔记·学习·游戏·ue5·游戏引擎·虚幻
ZHANG13HAO3 小时前
RV1106 通过 4G 网络基于 libdatachannel 实现 WebRTC 实时视频传输”
linux
..过云雨4 小时前
13.【Linux系统编程】从ELF格式深入理解动静态库
linux·c语言·c++·后端