Post

macOS ↔ Debian 双网卡直连开发环境搭建

macOS ↔ Debian 双网卡直连开发环境搭建

如果你在做双机开发——Mac 负责 Xcode / iOS Simulator,Debian 台式机负责后端、Docker、数据库和编译——那么 Mac 与 Debian 之间最值得优先投入的,往往不是更快的 Wi‑Fi,而是一根 Cat6 网线直连

本文介绍一套 双网卡有线直连 方案:

  • Mac 的 Ethernet 与 Debian 的一张网卡通过独立网线 点对点直连,SSH 与开发流量全程走网线,稳定、低延迟、不占用 Wi‑Fi 带宽;
  • Debian 通过 第二张网卡(板载网口 / Wi‑Fi / USB 网卡)独立访问互联网,apt updatedocker pullgit clone 都不依赖 Mac;
  • Mac 用 devbox.local 访问 Debian,由 mDNS / Avahi 自动解析到直连网卡的 10.10.10.2不需要记 IP,Debian 换个网络地址也不影响。

适用场景:

  • 一台 Mac(笔记本 / mini)承担 Xcode、iOS Simulator 等 Apple 平台开发;
  • 一台 Debian 台式机承担后端、Docker、数据库与编译任务;
  • 希望 SSH、后端 API、数据库连接走专用网线,稳定且不占 Wi‑Fi;
  • 希望 Debian 的 Internet 访问与开发链路相互独立,互不拖累。

如果你还没有搭建双机开发的整体框架,建议先阅读《/posts/dual-machine-dev-environment-guide/》;本文是其中「网络链路」部分的独立深化版,也可以单独使用。

全文按实施顺序展开,分为以下几个部分:

  1. 方案概览与 IP 规划(1 ~ 3)
  2. macOS 有线接口配置(4)
  3. Debian 双网卡配置与路由验证(5 ~ 8)
  4. 打通 .local 与 SSH(9 ~ 21)
  5. 后端服务、Docker 与 iOS 联调(22 ~ 24)
  6. Headless 使用、健康检查与故障排查(25 ~ 35)
  7. 日常使用方式与配置模板(36 ~ 40)

1. 方案概览

推荐的最终网络结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                         Internet
                            │
                    ┌───────┴───────┐
                    │               │
                Wi‑Fi/路由器     Wi‑Fi/路由器
                    │               │
                    ▼               ▼
               ┌─────────┐      ┌─────────────┐
               │ macOS   │      │   Debian    │
               │ Mac M2  │      │ 13900K PC   │
               └────┬────┘      └──────┬──────┘
                    │                  │
             Ethernet/USB-C       Ethernet NIC 1
             10.10.10.1/24        10.10.10.2/24
                    │                  │
                    └──── Cat6 ────────┘

                                      │
                                NIC 2 / Wi‑Fi
                                      │
                                      ▼
                                  Internet

Debian 的两个网络接口职责明确:

设备接口示例地址默认网关用途
MacWi‑FiDHCPMac 自己上网
MacEthernet10.10.10.1/24直连 Debian
DebianEthernet NIC 110.10.10.2/24直连 Mac
DebianWi‑Fi / NIC 2DHCPDebian 自己上网

最重要的设计原则:

Mac ↔ Debian 的直连网卡不配置默认网关,也不配置 DNS。

这样:

  • ssh devbox.local → 走 Cat6 网线;
  • http://devbox.local:3000 → 走 Cat6 网线;
  • Debian 的 apt updatedocker pullgit clone → 走 Debian 自己的第二张网卡;
  • Mac 自己访问 Internet → 走 Mac 的 Wi‑Fi;
  • 两台机器互不依赖对方进行 NAT/网络共享。

2. 硬件要求

2.1 Mac

Mac 需要一个可用的 Ethernet 接口。

如果 Mac 没有 RJ45:

1
2
3
4
5
6
7
Mac USB-C / Thunderbolt
        │
        ▼
USB-C → Ethernet Adapter
        │
        ▼
      Cat6

1GbE 已经足够 SSH、后端 API、数据库和远程开发。

如果未来需要频繁传输大型 Docker 镜像、数据集或构建产物,可以使用 2.5GbE。

2.2 Debian 台式机

理想情况:

1
2
NIC 1 → Mac 专用直连
NIC 2 → 路由器 / Internet

第二个接口可以是:

  • 主板 Wi‑Fi;
  • USB Wi‑Fi;
  • 第二个板载 RJ45;
  • PCIe Ethernet 网卡;
  • USB Ethernet 网卡。

2.3 网线

推荐:

1
Cat6

Cat6 可以正常工作在:

  • 1GbE;
  • 2.5GbE;
  • 更高速率取决于距离和设备能力。

现代网卡通常支持 Auto MDI-X,因此 Mac 和 Debian 可以直接使用普通网线连接,不需要交叉线。


3. IP 地址规划

本文统一使用:

1
2
3
4
5
Mac Ethernet:
10.10.10.1/24

Debian Direct Ethernet:
10.10.10.2/24

子网:

1
10.10.10.0/24

对应子网掩码:

1
255.255.255.0

直连网络两端都不要配置 Router / Gateway。

如果你的家庭网络、公司网络或 VPN 已经使用 10.10.10.0/24,请换一个不冲突的私有网段,例如:

1
2
3
4
192.168.250.0/24

Mac:     192.168.250.1
Debian:  192.168.250.2

全文中的地址相应替换即可。


4. 配置 macOS 的有线接口

4.1 插入网线

连接:

1
2
3
4
5
Mac Ethernet Adapter
        │
       Cat6
        │
Debian Direct NIC

不需要交换机,也不需要路由器。


4.2 macOS 设置静态 IPv4

打开:

1
2
3
4
5
系统设置
→ 网络
→ Ethernet / USB LAN / 你的网卡名称
→ 详细信息
→ TCP/IP

设置:

1
2
3
4
5
6
7
8
9
10
配置 IPv4:手动

IP 地址:
10.10.10.1

子网掩码:
255.255.255.0

路由器:
留空

DNS 不需要为这张直连网卡添加任何服务器。

最终应该是:

1
2
3
4
5
Mac Ethernet
IP:       10.10.10.1
Mask:     255.255.255.0
Gateway:  none
DNS:      none

Apple 官方支持在 macOS 的 Network → TCP/IP 中手动设置 IPv4 地址、子网掩码和 Router。

同时开着 Wi‑Fi 和 Ethernet 也没关系: macOS 会按「目标子网」选路。直连网段是独立的 10.10.10.0/24,只有网线两端在用,所以去 10.10.10.2 的流量必然走 Ethernet,其余流量仍走 Wi‑Fi,两者互不干扰;只要不给 Ethernet 填 Router,就不会影响 Mac 自己的默认路由。


4.3 查看 Mac 网络接口

Terminal:

1
ifconfig

也可以:

1
networksetup -listallnetworkservices

假设 USB Ethernet 最终对应:

1
en7

后续排错时会用到这个接口名。


5. 配置 Debian 双网卡

下面主要使用 NetworkManager,因为 Debian Desktop 以及很多常见 Debian 安装默认使用它。

首先查看设备:

1
nmcli device status

也可以:

1
ip -br link

示例:

1
2
3
4
DEVICE    TYPE      STATE
enp5s0    ethernet  connected
wlp4s0    wifi      connected
lo        loopback  connected

假设:

1
2
enp5s0 = Mac 直连网卡
wlp4s0 = Internet Wi‑Fi

请根据自己的机器修改接口名称。


6. Debian:配置 Mac 专用直连网卡

创建一个 NetworkManager connection:

1
2
3
4
5
6
7
8
sudo nmcli connection add \
  type ethernet \
  ifname enp5s0 \
  con-name mac-direct \
  ipv4.method manual \
  ipv4.addresses 10.10.10.2/24 \
  ipv4.never-default yes \
  ipv6.method disabled

启用开机自动连接:

1
2
sudo nmcli connection modify mac-direct \
  connection.autoconnect yes

启动:

1
sudo nmcli connection up mac-direct

如果 enp5s0 之前插过路由器: NetworkManager 可能已有一条旧的自动连接(例如 Wired connection 1)与 mac-direct 抢占这张网卡,导致 mac-direct 起不来或路由不对。可以先删除旧连接再重新启动:

1
2
sudo nmcli connection delete "Wired connection 1"
sudo nmcli connection up mac-direct

检查:

1
nmcli connection show mac-direct

以及:

1
ip -4 addr show dev enp5s0

应该看到:

1
inet 10.10.10.2/24

6.1 为什么使用 ipv4.never-default yes

这是本方案非常重要的一项设置。

它表示:

mac-direct 这张网卡永远不能成为 Debian 的默认 Internet 路由。

因此 Debian 不会错误地尝试通过 Mac 上网。

NetworkManager 官方定义中,ipv4.never-default=yes 表示该连接不会被分配 IPv4 默认路由。


7. Debian:配置第二张网卡访问 Internet

7.1 如果第二个接口是 Wi‑Fi

查看 Wi‑Fi:

1
nmcli device wifi list

建议使用交互方式输入密码,避免密码写进 shell history:

1
sudo nmcli --ask device wifi connect "你的 Wi-Fi SSID" ifname wlp4s0

检查:

1
nmcli device status

然后:

1
ip route

应该出现类似:

1
2
3
default via 192.168.1.1 dev wlp4s0
10.10.10.0/24 dev enp5s0 proto kernel scope link src 10.10.10.2
192.168.1.0/24 dev wlp4s0 proto kernel scope link

7.2 如果第二个接口也是 Ethernet

例如:

1
2
enp5s0 → Mac
enp6s0 → 路由器

如果 enp6s0 尚未配置:

1
2
3
4
5
6
sudo nmcli connection add \
  type ethernet \
  ifname enp6s0 \
  con-name internet \
  ipv4.method auto \
  ipv6.method auto

启动:

1
sudo nmcli connection up internet

路由器的 DHCP 会为该接口提供:

  • IP;
  • 默认网关;
  • DNS。

8. 验证 Debian 路由是否正确

执行:

1
ip route

正确结构应该类似:

1
2
3
default via 192.168.1.1 dev wlp4s0
10.10.10.0/24 dev enp5s0 scope link src 10.10.10.2
192.168.1.0/24 dev wlp4s0 scope link

验证去 Mac 的流量

1
ip route get 10.10.10.1

应该包含:

1
2
dev enp5s0
src 10.10.10.2

验证去 Internet 的流量

1
ip route get 1.1.1.1

应该显示:

1
dev wlp4s0

或者 Debian 的第二张有线网卡,例如:

1
dev enp6s0

9. 先验证 Mac ↔ Debian 的基础网络

在 Debian:

1
ping -c 4 10.10.10.1

在 Mac:

1
ping -c 4 10.10.10.2

如果正常,通常会看到非常低的 RTT:

1
< 1 ms

如果 IP 互 ping 都失败,请暂时不要继续 .local 和 SSH 配置,先检查:

  • 网线;
  • USB Ethernet Adapter;
  • Debian 网卡是否 UP;
  • 两边 IPv4 是否在同一 /24
  • 防火墙。

10. 配置 Debian 主机名

本文使用:

1
devbox

设置:

1
sudo hostnamectl set-hostname devbox

检查:

1
hostname

应该输出:

1
devbox

检查 /etc/hosts

1
cat /etc/hosts

如果存在:

1
127.0.1.1 old-hostname

建议改成:

1
127.0.1.1 devbox

编辑:

1
sudoedit /etc/hosts

11. 配置 .local:Avahi / mDNS

.local 不是传统 DNS 的静态映射。

本方案使用:

1
mDNS / Bonjour

Debian 上使用:

1
Avahi

macOS 原生支持 Bonjour/mDNS。

目标是让:

1
devbox.local

自动解析到 Debian 当前公布的地址。


11.1 安装 Avahi

Debian:

1
2
sudo apt update
sudo apt install avahi-daemon avahi-utils

启动并设置开机启动:

1
sudo systemctl enable --now avahi-daemon

检查:

1
systemctl status avahi-daemon

Debian 的 avahi-daemon 会发布本机地址;默认 mDNS 域就是 .local


12. 强烈推荐:让 .local 只通过 Mac 直连网卡发布

这是双网卡环境里最重要的细节之一。

如果不限制 Avahi,Debian 可能同时在:

1
2
enp5s0 → Mac direct
wlp4s0 → 家庭 Wi‑Fi

上发布:

1
devbox.local

这样 Mac 有可能获得多个地址,无法保证你想要的 SSH 一定走 Cat6。

因此建议 Avahi 只监听 Mac 直连网卡

编辑:

1
sudoedit /etc/avahi/avahi-daemon.conf

找到现有的:

1
[server]

在这个 section 中加入:

1
2
3
4
[server]
allow-interfaces=enp5s0
use-ipv4=yes
use-ipv6=no

注意:

  • 如果文件已经存在 [server],不要再创建第二个 [server]
  • enp5s0 必须换成你实际连接 Mac 的网卡名;
  • 本文为了让路径最确定,直连链路只使用 IPv4;
  • Avahi 默认会使用系统 hostname,所以不需要额外设置 host-name=devbox

重启:

1
sudo systemctl restart avahi-daemon

确认:

1
systemctl --no-pager --full status avahi-daemon

Debian 官方 avahi-daemon.conf 手册说明:

1
allow-interfaces=

可以指定 Avahi 允许使用的网络接口,其他接口会被忽略。


13. 在 Mac 上测试 .local

首先:

1
ping -c 4 devbox.local

理想输出中应该看到:

1
PING devbox.local (10.10.10.2)

重点是确认解析结果:

1
10.10.10.2

而不是 Debian Internet 网卡上的 192.168.x.x 地址。

如果看到:

1
devbox.local → 10.10.10.2

说明 mDNS 路径已经正确。


14. 安装和配置 SSH Server

Debian:

1
2
sudo apt update
sudo apt install openssh-server

启动:

1
sudo systemctl enable --now ssh

检查:

1
systemctl status ssh

检查监听:

1
ss -lntp | grep ':22'

15. Mac 使用 .local SSH

假设 Debian 用户名:

1
developer

在 Mac:

正常情况下:

1
2
3
4
5
6
7
devbox.local
    ↓ mDNS
10.10.10.2
    ↓ routing
Mac Ethernet
    ↓ Cat6
Debian enp5s0

这意味着即使 Debian 的 Internet 网卡 IP 发生变化,也不会影响:

可选:如果也想从 Debian SSH 到 Mac(例如反向排错),需要在 Mac 上开启 系统设置 → 通用 → 共享 → 远程登录。直连网卡本身不影响这一功能。


16. 验证 SSH 确实走网线

16.1 先看 .local 解析地址

Mac:

1
ping -c 1 devbox.local

应该解析:

1
10.10.10.2

16.2 查看 macOS 对该地址选择的接口

Mac:

1
route -n get 10.10.10.2

查看:

1
interface:

例如:

1
interface: en7

这个接口应该就是你的 Ethernet Adapter。

可以通过:

1
ifconfig en7

确认其地址是:

1
10.10.10.1

16.3 Debian 反向检查

Debian:

1
ip route get 10.10.10.1

应该看到:

1
10.10.10.1 dev enp5s0 src 10.10.10.2

到这里,可以确定:

1
SSH = Cat6

而不是 Wi‑Fi。


17. 推荐配置 SSH Key

17.1 Mac 生成密钥

如果还没有:

1
ssh-keygen -t ed25519 -a 100

默认:

1
2
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub

建议为私钥设置密码。


17.2 将公钥加入 Debian

macOS 不一定预装 ssh-copy-id,可以直接使用:

1
2
3
ssh [email protected] \
  'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys' \
  < ~/.ssh/id_ed25519.pub

然后:

1
2
ssh [email protected] \
  'chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'

测试:


18. 配置 Mac 的 ~/.ssh/config

编辑:

1
nano ~/.ssh/config

加入:

Host dev
    HostName devbox.local
    User developer
    IdentityFile ~/.ssh/id_ed25519

    ServerAliveInterval 30
    ServerAliveCountMax 3

    AddKeysToAgent yes
    UseKeychain yes

设置权限:

1
chmod 600 ~/.ssh/config

以后:

1
ssh dev

即可。

IDE 也可以直接使用:

1
Host: dev

例如:

  • VS Code Remote SSH;
  • Cursor Remote SSH;
  • JetBrains Gateway;
  • rsync;
  • scp;
  • SFTP。

19. 可选:关闭 SSH 密码登录

必须确认 SSH Key 登录成功以后再做。

Debian:

1
sudoedit /etc/ssh/sshd_config.d/99-devbox.conf

写入:

1
2
3
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no

检查配置:

1
sudo sshd -t

如果没有输出,表示语法正确。

重新加载:

1
sudo systemctl reload ssh

修改期间不要关闭当前 SSH Terminal。

新开一个 Mac Terminal:

1
ssh dev

确认还能登录后,再关闭旧连接。


20. 可选:只允许 Mac 直连地址 SSH

如果你希望 SSH 只面向:

1
10.10.10.2

而不监听 Debian 的 Internet/Wi‑Fi 网卡,可以配置:

1
sudoedit /etc/ssh/sshd_config.d/20-listen-direct.conf

加入:

1
ListenAddress 10.10.10.2

测试:

1
sudo sshd -t

然后:

1
sudo systemctl restart ssh

优点:

  • Wi‑Fi/LAN 上看不到 SSH 服务;
  • SSH 只允许从 Mac 专用网线进入。

缺点:

  • 如果直连网卡配置出错,你无法通过第二张网卡 SSH 救援。

对于无显示器服务器,建议等整个环境运行稳定后再启用这一项。


21. 防火墙建议

如果 Debian 没有启用入站阻断防火墙,局部直连网络本身已经相对简单。

如果你使用 UFW,并且默认拒绝入站,可以只开放 Mac:

1
2
3
sudo ufw allow in on enp5s0 \
  from 10.10.10.1 \
  to any port 22 proto tcp

如果 Avahi 被防火墙阻断,还需要允许该直连接口上的 IPv4 mDNS:

1
2
3
sudo ufw allow in on enp5s0 \
  from 10.10.10.1 \
  to 224.0.0.251 port 5353 proto udp

检查:

1
sudo ufw status verbose

在远程无显示器机器上修改防火墙时,一定先保留现有 SSH 会话,再从第二个 Terminal 测试新连接。


22. 后端服务如何通过 .local 访问

例如 Debian 上的后端监听:

1
10.10.10.2:3000

Mac 可以:

1
http://devbox.local:3000

例如:

1
curl http://devbox.local:3000

22.1 后端监听地址

如果服务只需要给 Mac 使用,推荐绑定:

1
10.10.10.2

比:

1
0.0.0.0

更严格。

例如概念上:

1
2
Backend:
listen = 10.10.10.2:3000

这样服务不会自动暴露在 Debian 的 Wi‑Fi / 家庭 LAN 接口上。


23. Docker 推荐绑定方式

如果 Docker Container 内部监听:

1
0.0.0.0:3000

宿主机发布端口时可以只绑定直连地址。

compose.yaml

1
2
3
4
5
services:
  backend:
    image: your-backend
    ports:
      - "10.10.10.2:3000:3000"

Mac:

1
curl http://devbox.local:3000

这样:

1
Mac → devbox.local → 10.10.10.2:3000

可以访问。

而 Debian 第二张网卡的:

1
192.168.x.x:3000

不会因为这个 Docker port mapping 自动暴露服务。


24. iOS Simulator / macOS App 开发

如果 Xcode 和 iOS Simulator 在 Mac 上:

1
2
3
4
5
6
7
8
9
10
11
12
Xcode App / Simulator
        │
        ▼
http://devbox.local:3000
        │
        ▼
Mac Ethernet
        │
       Cat6
        │
        ▼
Debian Backend

这是非常适合本方案的使用方式。

注意:真机 iPhone

真实 iPhone 如果只连接家庭 Wi‑Fi,它并不在 Mac ↔ Debian 的 10.10.10.0/24 直连网络上

因此:

1
2
iOS Simulator → 可以直接访问 devbox.local
真实 iPhone   → 不一定可以

如果需要真实 iPhone 访问后端,可选择:

  1. 让 Debian 后端同时在家庭 LAN 上提供服务;
  2. 由 Mac 做路由/NAT;
  3. 使用开发隧道;
  4. 单独设计开发 VLAN / LAN。

这与 Mac 本地 Simulator 的情况不同。


25. Debian 无显示器 Headless 使用

配置完成以后,Debian 台式机可以不连接显示器。

日常控制:

1
ssh dev

推荐在 Debian 上安装:

1
sudo apt install tmux

开始 Session:

1
tmux new -s dev

断线后重新连接:

1
tmux attach -t dev

这样 SSH 客户端异常退出也不会终止:

  • 编译任务;
  • 后端进程;
  • shell 工作;
  • 数据处理任务。

对于长期运行的服务,更推荐使用:

  • systemd;
  • Docker Compose;
  • Kubernetes;
  • supervisor 等正式服务管理方式。

电源与唤醒: Mac 进入睡眠会断开直连链路,长时间开发可在终端用 caffeinate -i 保持唤醒。Debian 无显示器常开时,建议在 BIOS 里关闭网卡节能(如 PCIe ASPM),需要远程开机时开启主板 Wake-on-LAN。


26. 可选:Debian 图形桌面远程访问

如果 Debian 安装了桌面环境,也可以通过 RDP 使用。

安装:

1
sudo apt install xrdp xorgxrdp

启用:

1
sudo systemctl enable --now xrdp

Mac 远程桌面客户端填写:

1
devbox.local

RDP 默认端口:

1
3389

需要注意:

xrdp 通常是远程图形登录 Session,不一定等同于“镜像台式机物理显示器当前 Session”。

如果只是后端开发,SSH + tmux 通常更加稳定、轻量。


27. 检查物理链路速度

Debian 安装:

1
sudo apt install ethtool

检查:

1
sudo ethtool enp5s0

重点:

1
2
3
Speed: 1000Mb/s
Duplex: Full
Link detected: yes

如果使用 2.5GbE,则可能是:

1
Speed: 2500Mb/s

如果发现:

1
Speed: 100Mb/s

通常需要检查:

  • 网线;
  • RJ45 水晶头;
  • USB Ethernet Adapter;
  • 网卡协商;
  • 驱动。

另外,链路速度由两端协商决定:如果一边是 1GbE、另一边是 2.5GbE,最终会协商到 1GbE。想跑满 2.5GbE,需要 Mac 的 USB 网卡、Debian 的网卡以及网线都支持 2.5GbE。


28. 一次性健康检查

Debian

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo '=== interfaces ==='
ip -br addr

echo
echo '=== routes ==='
ip route

echo
echo '=== route to Mac ==='
ip route get 10.10.10.1

echo
echo '=== route to Internet ==='
ip route get 1.1.1.1

echo
echo '=== SSH ==='
systemctl is-active ssh

echo
echo '=== Avahi ==='
systemctl is-active avahi-daemon

理想结果:

1
2
3
4
10.10.10.2     → enp5s0
default route  → wlp4s0 / Internet NIC
ssh            → active
avahi-daemon   → active

Mac

1
2
3
4
ping -c 1 10.10.10.2
ping -c 1 devbox.local
route -n get 10.10.10.2
ssh dev

重点确认:

1
2
devbox.local → 10.10.10.2
route interface → Ethernet

29. 重启测试

配置好以后一定执行一次完整重启测试。

先重启 Debian:

1
sudo reboot

等待机器启动后,在 Mac:

1
ping devbox.local

然后:

1
ssh dev

进入后检查:

1
ip route

确保:

1
2
default        → Debian Internet NIC
10.10.10.0/24 → Debian Mac Direct NIC

再测试:

1
curl -I https://deb.debian.org/

确认 Debian 自己可以访问 Internet。


30. 常见故障排查

30.1 ping 10.10.10.2 不通

按顺序检查:

Mac

1
ifconfig

确认 Ethernet:

1
10.10.10.1

Debian

1
ip -4 addr

确认 direct NIC:

1
10.10.10.2/24

检查连接:

1
nmcli device status

检查链路:

1
sudo ethtool enp5s0

应该:

1
Link detected: yes

30.2 IP 可以 ping,但 devbox.local 不通

Debian:

1
systemctl status avahi-daemon

检查:

1
hostname

应该:

1
devbox

检查:

1
2
grep -E 'allow-interfaces|use-ipv4|use-ipv6' \
  /etc/avahi/avahi-daemon.conf

确认接口名没有写错。

重启:

1
sudo systemctl restart avahi-daemon

Mac 再测试:

1
ping -c 1 devbox.local

30.3 devbox.local 解析到了 Wi‑Fi IP

例如:

1
devbox.local → 192.168.1.55

而不是:

1
10.10.10.2

说明 Avahi 很可能同时在多张网卡发布。

检查:

1
sudoedit /etc/avahi/avahi-daemon.conf

确保:

1
2
[server]
allow-interfaces=enp5s0

然后:

1
sudo systemctl restart avahi-daemon

再次测试:

1
ping -c 1 devbox.local

31. Debian 插入 Mac 网线后不能上 Internet

这是典型的默认路由错误。

检查:

1
ip route

如果看到:

1
default ... dev enp5s0

说明 Mac 直连网卡错误获得了默认路由。

修复:

1
2
3
sudo nmcli connection modify mac-direct ipv4.never-default yes
sudo nmcli connection down mac-direct
sudo nmcli connection up mac-direct

再检查:

1
ip route

应该只有第二张网卡提供:

1
default

32. Mac 插入网线后 Internet 出问题

检查 Mac Ethernet 配置。

Mac 的直连 Ethernet 应该:

1
2
3
4
IP:       10.10.10.1
Mask:     255.255.255.0
Router:   空
DNS:      空

如果给 Ethernet 设置了 Router,它可能干扰 Mac 原本的 Internet 路由。

本方案不需要:

  • Internet Sharing;
  • NAT;
  • DHCP Server;
  • Bridge;
  • 路由转发。

33. SSH 提示 Host Key Changed

如果重装过 Debian,SSH Host Key 会变化。

Mac 可能提示:

1
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

只有在你确认 Debian 确实刚刚重装或重新生成过 Host Key 时,才删除旧记录:

1
ssh-keygen -R devbox.local

以及:

1
ssh-keygen -R 10.10.10.2

然后重新连接。

如果机器没有重装却突然出现 Host Key 改变,应先排查,不要直接忽略安全警告。


34. SSH 连接仍然偶尔掉线

先确认网络本身:

1
ping devbox.local

Debian 查看 NetworkManager:

1
journalctl -u NetworkManager --since "30 min ago"

查看 SSH:

1
journalctl -u ssh --since "30 min ago"

查看物理 link:

1
sudo ethtool enp5s0

如果出现 link up / link down,优先怀疑:

  • 网线;
  • USB Ethernet Adapter;
  • USB Hub;
  • 驱动;
  • 网卡节能。

ServerAliveInterval 可以帮助 SSH 更快发现失效连接,但无法修复实际物理断链。


35. 如果 Debian 不使用 NetworkManager

不要让多个网络管理器同时管理同一张网卡。

检查:

1
systemctl is-active NetworkManager

如果 Debian 使用传统 ifupdown,可以在:

1
/etc/network/interfaces.d/mac-direct

配置:

1
2
3
4
auto enp5s0

iface enp5s0 inet static
    address 10.10.10.2/24

不要添加 gateway

Internet 接口继续通过 DHCP。

配置完成后应确保该接口没有同时被 NetworkManager 或 systemd-networkd 接管。


36. 推荐的最终日常使用方式

Mac 开发:

1
2
3
4
Xcode
iOS Simulator
Terminal
Browser

Debian:

1
2
3
4
5
6
Docker
PostgreSQL
Redis
Node / Go / Java / Rust / Python
Backend API
编译任务

Mac 日常只记:

1
ssh dev

后端:

1
http://devbox.local:3000

数据库例如:

1
devbox.local:5432

其他服务:

1
devbox.local:<port>

底层始终:

1
2
3
4
5
6
7
devbox.local
      │
      ▼
10.10.10.2
      │
      ▼
Cat6 direct link

37. 最终配置模板

macOS

1
2
3
4
5
6
7
8
Internet:
Wi‑Fi → DHCP → Router

Mac Direct Ethernet:
IP      = 10.10.10.1
Mask    = 255.255.255.0
Gateway = none
DNS     = none

Debian

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Hostname:
devbox

Direct NIC:
Interface = enp5s0
IP        = 10.10.10.2/24
Gateway   = none
DNS       = none
Default   = never

Internet NIC:
Interface = wlp4s0 / enp6s0
IP        = DHCP
Gateway   = DHCP
DNS       = DHCP
Default   = yes

Avahi

1
2
3
4
[server]
allow-interfaces=enp5s0
use-ipv4=yes
use-ipv6=no

Mac SSH

Host dev
    HostName devbox.local
    User developer
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 30
    ServerAliveCountMax 3
    AddKeysToAgent yes
    UseKeychain yes

使用:

1
ssh dev

38. 配置完成后的预期行为

操作路径
ssh devMac Ethernet → Cat6 → Debian
ping devbox.localMac Ethernet → Debian
curl http://devbox.local:3000Mac Ethernet → Debian
Mac 浏览网页Mac Wi‑Fi → Router → Internet
Debian apt updateDebian NIC 2 → Router → Internet
Debian docker pullDebian NIC 2 → Router → Internet
Debian Internet NIC IP 改变不影响 Mac SSH
家庭 Wi‑Fi 波动不影响 Mac ↔ Debian 有线 SSH
路由器 DHCP 更换 Debian LAN IP不影响 devbox.local 的直连路径

39. 核心结论

这套方案可以理解为建立两张完全不同职责的网络:

1
2
3
4
5
6
7
8
开发控制平面:
Mac ← Cat6 → Debian
10.10.10.1   10.10.10.2
      devbox.local

Internet 平面:
Mac    → 自己的 Wi‑Fi → Internet
Debian → 自己的 NIC 2 → Internet

最关键的四项配置是:

1
2
3
4
1. Mac direct Ethernet = 10.10.10.1/24,无 Gateway
2. Debian direct NIC    = 10.10.10.2/24,无 Gateway
3. Debian Internet NIC  = 唯一默认路由
4. Avahi 只发布 direct NIC

最终日常使用不需要记 IP:

1
ssh dev

或者:

这是一个稳定、简单、低延迟,并且非常适合 Mac App 开发 + Debian 后端开发的双机架构。


40. 官方参考资料

  • Apple Support — Use DHCP or a manual IP address on Mac
    https://support.apple.com/guide/mac-help/use-dhcp-or-a-manual-ip-address-on-mac-mchlp2718/mac

  • Apple Support — Find your computer’s name and local hostname / Bonjour .local
    https://support.apple.com/guide/mac-help/find-your-computers-name-and-network-address-mchlp1177/mac

  • NetworkManager Reference Manual — ipv4.never-default
    https://www.networkmanager.dev/docs/api/latest/nm-settings-nmcli.html

  • Debian Manpages — avahi-daemon.conf(5)
    https://manpages.debian.org/trixie/avahi-daemon/avahi-daemon.conf.5.en.html

  • Debian Packages — avahi-daemon
    https://packages.debian.org/trixie/avahi-daemon

  • Debian Packages — openssh-server
    https://packages.debian.org/stable/openssh-server


附:最短部署清单

如果已经理解所有原理,实际部署可以简化成以下流程。

Debian

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看接口
nmcli device status

# 示例:enp5s0 专门连接 Mac
sudo nmcli connection add \
  type ethernet \
  ifname enp5s0 \
  con-name mac-direct \
  ipv4.method manual \
  ipv4.addresses 10.10.10.2/24 \
  ipv4.never-default yes \
  ipv6.method disabled

sudo nmcli connection modify mac-direct connection.autoconnect yes
sudo nmcli connection up mac-direct

# SSH + mDNS
sudo apt update
sudo apt install openssh-server avahi-daemon avahi-utils

sudo hostnamectl set-hostname devbox

sudo systemctl enable --now ssh
sudo systemctl enable --now avahi-daemon

编辑:

1
sudoedit /etc/avahi/avahi-daemon.conf

在已有 [server] 中:

1
2
3
allow-interfaces=enp5s0
use-ipv4=yes
use-ipv6=no

然后:

1
sudo systemctl restart avahi-daemon

macOS

Ethernet:

1
2
3
4
IP       10.10.10.1
Mask     255.255.255.0
Router   empty
DNS      empty

测试:

1
2
3
ping -c 1 10.10.10.2
ping -c 1 devbox.local
ssh [email protected]

最后配置:

1
~/.ssh/config
Host dev
    HostName devbox.local
    User developer
    ServerAliveInterval 30
    ServerAliveCountMax 3

之后日常只需:

1
ssh dev
This post is licensed under CC BY 4.0 by the author.