SSH
Truy cập guest qua SSH từ Mac — địa chỉ nào thực sự hoạt động, một dòng thêm vào ssh config, khóa, tài khoản và tin cậy host key.
SSH tắt trên mọi máy cho đến khi bạn bật. Bật mở đường đăng nhập vào guest, và không ai nên có được nhầm.
1vm ssh enable dev
1vm ssh config --install # add the Include line to ~/.ssh/config
ssh dev # plain ssh now resolves the machine
Cũng có pane Configure → SSH trong app với cùng điều khiển; không giao diện nào bọc giao diện kia.
Địa chỉ nào thực sự hoạt động
Phần này làm người ta vấp, và phụ thuộc engine. Địa chỉ guest trong 1vm list
không phải lúc nào cũng kết nối được.
| Engine | Network | Mac → guest |
|---|---|---|
| Virtualization.framework | NAT or host-only | Direct, to the guest's 192.168.64.x lease |
| Virtualization.framework | Bridged | Direct, to its LAN address |
| 1VM engine | NAT or host-only | Through a loopback port forward only |
| 1VM engine | Bridged | Direct, to its LAN address |
Trên engine 1VM guest nằm sau stack mạng user-mode tại 10.0.2.15 cố định,
và Mac không có interface trên subnet đó. ssh 10.0.2.15 không bao giờ hoạt
động ở đó. Forward hoạt động:
ssh -p 2222 onevm@127.0.0.1
Bật SSH tạo forward đó, áp dụng live — không reboot. Forward bind
127.0.0.1, nên bật SSH không bao giờ lộ guest ra mạng.
Một dòng thêm vào ssh config
1vm ssh config --install thêm đúng một khối sentinel, ở đầu ~/.ssh/config:
# >>> 1VM managed >>> do not edit this block
Include ~/Library/Application Support/OneVM/VMs/.ssh/config
# <<< 1VM managed <<<
Mọi thứ khác sinh vào .ssh/ của thư viện, file bạn chỉ một dòng và 1VM sở
hữu phần còn lại. ONEVM_HOME di chuyển toàn bộ, nghĩa là thư viện cục bộ
dự án mang ssh config riêng.
Quy tắc vì sửa file không sở hữu:
- Đầu file, vì
ssh_configfirst-obtained-wins —Includesau khốiHost *hiện có sẽ im lặng thua. - Idempotent. Chạy mười lần vẫn một khối.
- Atomic, with a backup. Bản gốc copy sang
config.1vm-backup-…có timestamp trước khi ghi. - Reversible.
--uninstallxóa đúng khối sentinel, không gì khác.--printhiện không ghi. - Từ chối thay vì sắp xếp lại. Nếu config đã đặt tùy chọn cho mọi host phía trên chỗ khối sẽ vào, 1VM báo và từ chối thay vì sắp xếp file.
- Không che host thật. Nếu tên máy đã resolve trong ssh config, chỉ alias
<name>.1vmđược phát.
Khối sinh trông như sau — port và địa chỉ từ quy tắc reachability, không bao giờ từ IP guest thô:
Host dev dev.1vm
HostName 127.0.0.1
Port 22417
User dev
IdentityFile ".../dev.vm/agent-key"
IdentitiesOnly yes
AddressFamily inet
StrictHostKeyChecking yes
ConnectTimeout 5
Keys
Mỗi máy có khóa Ed25519 riêng trong bundle tại agent-key, mode 0600. Vì
nằm trong thư mục, 1vm clone mang theo và clone truy cập được cùng identity.
Bạn có thể dùng khóa riêng. 1VM lưu đường dẫn và chỉ copy .pub khớp vào
guest — không đọc, copy hay lưu nửa private.
1vm ssh keys dev # show the machine key
1vm ssh keys dev --print-public # the public line
1vm ssh keys dev --regenerate # new keypair
1vm set dev ssh.identityFile ~/.ssh/id_ed25519
Accounts
1vm set dev ssh.users … quản lý tài khoản trong guest. Tên được xác thực
theo họ guest — Linux và macOS nhận [a-z_][a-z0-9_-]{0,31}, Windows tối đa
20 ký tự và từ chối dấu câu dành riêng — và quyền admin map wheel/sudo,
Administrators, hoặc admin.
onevm dành riêng. Đó là tài khoản 1vm exec, 1vm task run và MCP
server đăng nhập, nên đổi tên hoặc xóa sẽ hỏng chúng. Pane hiện hàng khóa
gắn nhãn agent account thay vì ẩn — login tồn tại nhưng vô hình trong danh
sách là nói dối.
root và Administrator cũng dành riêng, và root login tắt.
Host-key trust
Hầu hết công cụ tin bất cứ ai trả lời lần đầu. 1VM tốt hơn vì có kênh out-of- band: đọc host key công khai guest qua kênh guest-agent, không đi qua mạng đang xác thực, và ghim.
| State | What you see | What ssh does |
|---|---|---|
| Not learned yet | "the first connection will trust whatever answers" | StrictHostKeyChecking accept-new |
| Learned | the SHA256:… fingerprint and the date | StrictHostKeyChecking yes |
| Mismatch | a warning naming the date the old key was pinned, and a Relearn button | yes — so the connection correctly fails |
1vm ssh trust dev # pin the current host key
1vm ssh trust dev --relearn # re-pin after a legitimate change
Mismatch bình thường sau 1vm reset, sau restore snapshot trước khi có sshd,
hoặc sau cài lại. Cũng đúng như tấn công trông — nên luôn là nút bạn bấm,
không bao giờ ghi đè im lặng.
Cloning. Khóa identity copy sang clone cố ý; ghim host-key không, vì hai
máy cùng một host key là vấn đề thật. Dùng 1vm clone dev test --rekey-ssh
để tái tạo host key guest lần boot đầu.
Security defaults
- Xác thực chỉ khóa. Password và keyboard-interactive tắt, root login tắt, không agent hay X11 forwarding.
- Forward bind loopback, guest không bao giờ lộ ra LAN khi bật SSH. Bind địa chỉ công cộng có thể nhưng cảnh báo bằng lời rõ ràng.
- Khóa private và tham số tạo tài khoản chỉ đi kênh private, không vào log.
Rollback mode xóa tài khoản SSH
Rollback mode hủy mọi thứ ghi từ boot khi tắt nguồn — gồm tài khoản và khóa cấp vào guest. Không phải bug, và 1VM chạy lại provisioning mỗi boot thay vì tin file marker. Kỳ vọng host key guest đổi mỗi lần.
Guest to Mac
Chiều ngược — SSH từ guest tới Mac — tới Mac tại 10.0.2.2 trên engine
1VM, và chỉ cổng có dịch vụ đăng ký. 1VM không bật macOS Remote Login; đó
vẫn là quyết định của bạn trong System Settings.
Current state
SSH triển khai trên app, CLI và cả hai engine, có bộ kiểm thử unit. Hai caveat thật:
- Live-guest soak testing vẫn là cổng chấp nhận còn thiếu.
- Omarchy factory image ship trước khi
opensshthêm vào package list, nên guest Omarchy factory không cósshdcho đến khi image rebuild. Guest Linux khác không ảnh hưởng.