当前位置: 首页 > news >正文

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和结尾的邮箱)。

  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 列表中可看到新增的密钥(显示标题和指纹)。

报错信息

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

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.com127.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.com127.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
  1. 编辑配置文件:
sudo nano /etc/netplan/01-network-manager-all.yaml
  1. 添加公共 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
  1. 应用配置并重启服务:
# 应用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,无任何警告,直接返回命令行。

  1. 验证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.
解决办法
  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,后续开发中无需重复输入账号密码,提升操作效率。

http://www.dtcms.com/a/597280.html

相关文章:

  • 文生图模型攻击论文原理笔记
  • Goer-Docker系统-1-Dockerfile的构建速度优化
  • 代做网页设计平台站长工具seo综合查询隐私查询导航
  • 方形与圆形滚珠导轨在工业场景如何选型?
  • UCOS-III笔记(一)
  • Unity:lua热更新(一)——AB包AssetBundle、Lua语法
  • 如何在Dev-C++中配置编译选项以支持C++11?
  • 海城区建设局网站快速百度
  • 网站怎样设计网址大全关键词排名提高方法
  • HOT100题打卡第36天——二分查找
  • 【Linux】Linux内存管理与线程控制核心解析
  • dns服务器
  • bash 启动程序的流程
  • 专题:2025中国医疗器械出海现状与趋势创新发展研究报告|附160+份报告PDF、数据、可视化模板汇总下载
  • 工程建设最好的网站石家庄建设网站哪家好
  • c#笔记之面向对象
  • wordpress 移动到回收站发生错误广告公司网络推广计划
  • 汽车乘员热舒适测评的预测模型
  • [6]. SpringAI Alibaba 向量化和向量数据库
  • java学习--包
  • 乐鑫EchoEar开发套件详解:ESP32-S3+端侧AI+全双工语音实战
  • 国外的外贸网站wordpress 页面下文章列表
  • 站长工具服务器查询常州市建设工程管理中心网站
  • 《实施意见》绘就场景应用蓝图,政务服务如何找准自身“坐标”
  • Go 优雅关闭实践指南:从原理到框架落地
  • 使用gRPC实现分片服务的心跳机制
  • 陕西建设厅执业注册中心网站重庆网站建设沛宣
  • 济南 外贸网站建设大连鼎信网站建设公司地址
  • 自动化渗透工具分类及主流工具详解(2025年最新)
  • Qt QPushButton 样式完全指南:从基础到高级实现