VMware Ubuntu 22.04 NAT模式下配置GitHub SSH完整教程(含踩坑实录+报错_成功信息对照)
在虚拟机环境中通过SSH连接GitHub,是开发中常见的需求。本文将详细记录在VMware Ubuntu 22.04(NAT模式)下配置GitHub SSH的完整流程,包括关键步骤、遇到的问题及针对性解决方案,明确标注每个步骤的成功输出与报错信息,让新手能快速对照判断,高效解决问题。
一、前置准备
1. 确认虚拟机网络连通性
NAT模式下,虚拟机需正常联网才能与GitHub通信。打开Ubuntu终端,执行以下命令测试网络:ping github.com
成功信息
收到连续的ICMP回复,示例: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”,示例:ping: connect: Network is unreachable
# 或
PING github.com (::1) 56 data bytes
From ::1 icmp_seq=1 Destination host unreachable
解决办法
若能收到回复,说明联网正常;若不通,可重启虚拟机网络或检查 VMware NAT 服务:# 重启网络服务
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`算法生成密钥,安全性更高,执行以下命令:# 替换为你的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:→ 直接回车(无密码,或重复输入密码后回车)
成功信息
密钥生成完成,输出示例: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`算法,会提示:unknown key type ed25519
替代方案
改用RSA算法生成密钥: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私钥的进程,需先启动并将私钥添加进去:# 启动ssh-agent
eval "$(ssh-agent -s)"
成功信息
进程启动,输出示例:Agent pid 45380 # PID为随机值,格式正确即成功
报错信息
若启动失败,会提示:eval: 1: Syntax error: "(" unexpected
解决办法
确保命令输入完整,重新执行:eval "$(ssh-agent -s)"(注意引号和括号格式)。
接着添加私钥:
# 若修改过密钥保存路径,需替换为实际路径
ssh-add ~/.ssh/id_ed25519
成功信息
私钥添加完成,输出示例:Identity added: /home/king/.ssh/id_ed25519 (your_email@example.com)
报错信息
若私钥路径错误或权限异常,会提示:Could not open a connection to your authentication agent.
# 或
Permissions 0755 for '/home/king/.ssh/id_ed25519' are too open.
解决办法
# 若提示无法连接agent,重新启动ssh-agent
ssh-agent -k && eval "$(ssh-agent -s)"
# 若提示权限过松,修复私钥权限
chmod 600 ~/.ssh/id_ed25519
步骤3:将公钥添加到GitHub
1. 查看并复制公钥完整内容:cat ~/.ssh/id_ed25519.pub
成功信息
输出公钥完整内容,示例:ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKZ8kU3u4zUfG6cQzL2F8eX7Yt4aG9xQwVh5d6s7f8gH your_email@example.com
需全选复制(包括开头的ssh-ed25519和结尾的邮箱)。
- 登录GitHub上传公钥:
- 点击右上角头像 →
Settings→ 左侧菜单SSH and GPG keys→New SSH key Title:自定义名称(如“Ubuntu-VM-NAT”,便于区分设备)Key:粘贴刚才复制的公钥完整内容- 点击
Add SSH key,验证GitHub密码即可完成添加
成功信息
GitHub页面提示 “SSH key added successfully”,在 SSH and GPG keys 列表中可看到新增的密钥(显示标题和指纹)。
报错信息
若公钥粘贴不完整,会提示:
Key is invalid. It must begin with 'ssh-rsa', 'ssh-ed25519', etc.
解决办法
重新执行cat ~/.ssh/id_ed25519.pub,确保复制完整内容(无多余空格、无换行缺失)。
步骤4:测试SSH连接(首次测试遇坑)
执行以下命令测试连接:ssh -T git@github.com
首次测试报错信息
要求输入git@github.com的密码,多次输入后认证失败:
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日志,发现关键报错信息:
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文件
sudo nano /etc/hosts
正常情况
若文件中存在::1 github.com或127.0.0.1 github.com,直接删除(本文环境中hosts文件正常,无错误配置)。
文件内容无错误绑定,示例:
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.com或127.0.0.1 github.com,需直接删除该条目。
排查步骤2:查看当前DNS服务器(NAT 网关 DNS 不可靠)
Ubuntu 22.04 默认使用systemd-resolved管理 DNS,执行以下命令查看当前 DNS 配置:
# 查看实际使用的上游DNS
resolvectl status
报错信息(DNS异常)
输出显示DNS服务器为VMware NAT网关IP(如192.168.28.2),该网关 DNS 解析异常,需手动配置公共 DNS(无公共DNS):
Link 2 (ens33)Current Scopes: DNSProtocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.28.2DNS Servers: 192.168.28.2
解决方案:通过netplan配置公共DNS
1. Ubuntu 22.04 使用 netplan 管理网络,先找到netplan配置文件:ls /etc/netplan/
编辑配置文件(本文以01-network-manager-all.yaml为例):
成功信息
编辑配置文件(本文以01-network-manager-all.yaml为例):
列出配置文件,示例:
01-network-manager-all.yaml
- 编辑配置文件:
sudo nano /etc/netplan/01-network-manager-all.yaml
- 添加公共 DNS 配置(注意 YAML 格式缩进,用 2 个或 4 个空格,不可用 Tab):
network:version: 2renderer: NetworkManagerethernets:ens33: # 网卡名称,通过resolvectl status确认 输出Link 2 (ens33),括号里的ens33就是网卡名称dhcp4: true # NAT模式默认DHCP自动获取IPnameservers:addresses: [8.8.8.8, 114.114.114.114, 1.1.1.1] # 公共DNS
- 应用配置并重启服务:
# 应用netplan配置
sudo netplan apply
# 重启网络相关服务
sudo systemctl restart NetworkManager
sudo systemctl restart systemd-resolved
应用配置时的报错信息
若配置文件格式错误(如缩进用Tab),会提示:Error in network definition /etc/netplan/01-network-manager-all.yaml line 5 column 6: expected indentation
解决办法
将Tab替换为空格,确保每个层级缩进一致(推荐2个空格)。netplan 配置文件权限警告(非致命报错)
现象
执行` sudo netplan apply` 时,出现权限警告:WARNING **: Permissions for /etc/netplan/01-network-manager-all.yaml are too open.
解决办法
修改文件权限为仅root可读写:sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
权限修复成功信息
再次执行sudo netplan apply,无任何警告,直接返回命令行。
- 验证DNS解析是否正常:
# 查看DNS是否切换成功
resolvectl status ens33
# 测试github.com解析
nslookup github.com
DNS切换成功信息
Link 2 (ens33)Current Scopes: DNSProtocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 8.8.8.8DNS Servers: 8.8.8.8 114.114.114.114 1.1.1.1
解析成功信息(nslookup输出)
Server: 8.8.8.8
Address: 8.8.8.8#53Non-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连接:ssh -T git@github.com
输出以下安全警告:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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:1remove 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服务器,主机密钥不一致,系统触发安全保护。
解决方案:删除旧主机密钥
ssh-keygen -f "/home/king/.ssh/known_hosts" -R "github.com"
删除成功信息
# Host github.com found: line 1
/home/king/.ssh/known_hosts updated.
Original contents retained as /home/king/.ssh/known_hosts.old
重新测试SSH连接
ssh -T git@github.com
首次连接提示(需确认)
重新执行测试命令,首次连接会提示确认新的主机密钥,输入yes回车:
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并回车。
主机密钥保存成功信息
Warning: Permanently added 'github.com,140.82.112.3' (ED25519) to the list of known hosts.
四、最终测试与验证
SSH连接成功信息
ssh -T git@github.com
输出以下内容,说明认证成功:
Hi your_github_username! You've successfully authenticated, but GitHub does not provide shell access.
仓库克隆测试(验证SSH可用性)
此时即可通过 SSH 协议操作 GitHub 仓库,例如克隆GitHub仓库(替换为你的仓库地址):
git clone git@github.com:your_username/your_repo.git
克隆成功信息
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.
克隆报错信息(若仍有问题)
Permission denied (publickey).
fatal: Could not read from remote repository.Please make sure you have the correct access rights
and the repository exists.
解决办法
- 确认GitHub上的公钥与本地公钥一致:
cat ~/.ssh/id_ed25519.pub对比GitHub上的密钥。 - 重新添加私钥到ssh-agent:
ssh-add ~/.ssh/id_ed25519。
五、总结与注意事项
核心关键点
- NAT模式下,虚拟机DNS默认继承自VMware网关,若网关DNS不可靠,需手动配置公共DNS(8.8.8.8、114.114.114.114等)。
- SSH密钥对生成后,需确保私钥权限为600、.ssh目录权限为700,否则密钥认证会失效。
known_hosts文件会记录主机密钥,更换连接目标(或目标服务器密钥变更)时,需删除旧条目。- YAML格式对缩进敏感,修改netplan配置文件时务必注意缩进一致性。
常见避坑指南
- 若出现“Permission denied”,优先检查公钥是否与GitHub上的一致、私钥是否添加到ssh-agent。
- 若解析仍异常,可重启虚拟机确保网络配置完全生效。
- 密钥算法选择:优先
ed25519,若系统不支持,改用rsa -b 4096。 - 所有操作的成功/报错信息已明确标注,操作时可逐步对照,快速定位问题。
通过以上步骤,即可在VMware Ubuntu 22.04 NAT模式下稳定使用SSH连接GitHub,后续开发中无需重复输入账号密码,提升操作效率。
