Trả lời nhanh: File SSH config nằm ở ~/.ssh/config cho phép bạn đặt bí danh cho từng máy chủ kèm mọi tham số đi cùng: tài khoản, cổng, khóa nào, đi qua máy trung gian nào. Sau đó thay vì gõ cả dòng dài với địa chỉ và tham số, bạn chỉ gõ ssh ten-bi-danh. Ba tính năng đáng dùng nhất ngoài việc rút gọn: chọn đúng khóa cho từng máy, nhảy qua máy trung gian tự động, và giữ kết nối sống để phiên không rớt khi bạn để yên vài phút.
Ai quản trị vài máy chủ đều từng dán một danh sách địa chỉ IP đâu đó để chép mỗi lần cần vào. Cách đó vừa chậm vừa dễ vào nhầm máy, mà vào nhầm máy rồi chạy lệnh thì hậu quả tùy lệnh. File cấu hình SSH xóa hẳn vấn đề này, và nó là một trong những file cấu hình cho lợi ích cao nhất so với công sức bỏ ra.
Cấu trúc file
# ~/.ssh/configHost web1 HostName 103.x.x.10 User quantri Port 22 IdentityFile ~/.ssh/id_ed25519 Host db1 HostName 10.0.0.5 User postgres IdentityFile ~/.ssh/id_ed25519_db # Ap dung cho moi mayHost * ServerAliveInterval 60 ServerAliveCountMax 3 AddKeysToAgent yesTừ đó, ssh web1 là đủ. Không chỉ SSH mà cả các lệnh sao chép file cũng hiểu bí danh này, nên scp file.txt web1:/tmp/ chạy được ngay.
Khối cuối áp dụng cho mọi máy. Hai dòng đầu bảo SSH gửi tín hiệu giữ kết nối mỗi phút, nhờ vậy phiên không bị thiết bị mạng ở giữa cắt khi bạn để yên. Đây là dòng cấu hình mà ai làm việc qua mạng di động hoặc mạng công ty sẽ cảm ơn nhất.
Chỉ định khóa cho từng máy
Khi bạn có nhiều khóa, SSH mặc định thử lần lượt từng cái. Nếu số khóa vượt quá số lần thử máy chủ cho phép, bạn bị từ chối dù có đúng khóa trong tay, và thông báo lỗi thì không nói rõ nguyên nhân.
Host github.com User git IdentityFile ~/.ssh/id_ed25519_git IdentitiesOnly yesDòng cuối là chìa khóa của cả mục này: nó bảo SSH chỉ dùng đúng khóa đã khai báo, không thử cái nào khác. Thêm dòng đó cho mọi khối là bạn hết gặp lỗi từ chối khó hiểu.
Cách chia khóa theo máy và theo dịch vụ nằm ở bài về khóa SSH. Ở đây chỉ cần nhớ nguyên tắc: khai báo rõ khóa nào cho máy nào thay vì để SSH đoán.
Nhảy qua máy trung gian
Tình huống rất quen: database nằm trong mạng nội bộ, chỉ vào được qua một máy trung gian. Cách sai là chép khóa riêng lên máy trung gian, và như vậy là vứt bỏ toàn bộ ý nghĩa của việc dùng khóa.
Host trung-gian HostName 103.x.x.10 User quantri Host db-noi-bo HostName 10.0.0.5 User quantri ProxyJump trung-gianVới khai báo này, ssh db-noi-bo tự động đi qua máy trung gian, còn khóa riêng của bạn không bao giờ rời khỏi máy bạn. Máy trung gian chỉ chuyển tiếp kết nối chứ không cầm gì cả.
Cách này cũng hoạt động với sao chép file, nên bạn chép thẳng từ máy mình vào máy trong mạng nội bộ mà không phải trung chuyển qua hai bước. Nếu bạn muốn bỏ hẳn máy trung gian, một mạng riêng như trong bài Tailscale là hướng gọn hơn nữa.
Vài tùy chọn đáng thêm
Host * # Dung lai ket noi da mo, lan sau vao gan nhu tuc thi ControlMaster auto ControlPath ~/.ssh/socket-%r@%h:%p ControlPersist 10m # Nen du lieu, huu ich khi duong truyen cham Compression yesNhóm ba dòng đầu đáng chú ý nhất: lần đầu vào một máy thì mất thời gian bắt tay như thường, nhưng các phiên sau dùng lại kết nối cũ nên mở gần như tức thì. Với người mở đóng phiên liên tục cả ngày, khác biệt rất dễ chịu.
Lưu ý nhỏ: khi dùng cơ chế này, đóng phiên đầu tiên không đóng ngay kết nối nền, nó còn sống thêm theo thời gian bạn đặt. Nếu cần đóng dứt điểm, có lệnh riêng để thoát kết nối chủ.
Nén dữ liệu chỉ nên bật khi đường truyền chậm. Trên đường truyền nhanh, việc nén tốn CPU mà không rút ngắn được gì đáng kể.
Quản lý file này theo thời gian
File cấu hình SSH nên nằm trong repo dotfiles như bài dotfiles mô tả, để mọi máy của bạn đều có cùng bộ bí danh. Nhắc lại lần nữa vì đây là chỗ hay sai: chỉ đưa file cấu hình, tuyệt đối không đưa khóa riêng.
Hai thói quen giúp file này không thành mớ hỗn độn sau một năm:
- Đặt tên bí danh theo vai trò chứ không theo nhà cung cấp. Đặt web-cua-hang dễ nhớ hơn vps-so-3, và khi đổi nhà cung cấp bạn chỉ sửa địa chỉ chứ không phải sửa thói quen.
- Xóa máy đã ngừng dùng. Bí danh trỏ tới địa chỉ IP đã được cấp lại cho khách khác là tình huống bạn không muốn gặp.
Với máy chủ dùng chung trong đội, hãy chia sẻ khối cấu hình mẫu trong tài liệu nội bộ để ai cũng gõ cùng một bí danh. Nghe nhỏ nhưng nó tránh được kha khá nhầm lẫn khi trao đổi qua lại.
Tệp cấu hình mẫu, dùng được ngay
# Dat tai ~/.ssh/config tren may cua ban Host * ServerAliveInterval 30 ServerAliveCountMax 6 AddKeysToAgent yes Host web HostName 103.0.113.10 User trienkhai IdentityFile ~/.ssh/id_ed25519_web Host db HostName 10.0.0.5 User quantri IdentityFile ~/.ssh/id_ed25519_db ProxyJump web Host dev HostName 103.0.113.20 User lap-trinh IdentityFile ~/.ssh/id_ed25519_dev LocalForward 3306 127.0.0.1:3306 # Sau do chi can go: ssh web# Va: ssh db (tu di qua may web lam trung gian)| Tùy chọn | Nó làm gì | Vì sao đáng thêm |
|---|---|---|
| Gửi tín hiệu sống định kỳ | Giữ kết nối không rớt khi bạn rời máy | Đỡ phải đăng nhập lại liên tục |
| Chỉ định khóa cho từng máy | Mỗi máy một khóa riêng | Thu hồi được riêng từng máy |
| Nhảy qua máy trung gian | Vào máy trong mạng nội bộ qua một máy công khai | Không phải mở cổng cho máy nội bộ |
| Chuyển tiếp cổng cục bộ | Nối tới cơ sở dữ liệu trên máy chủ như thể nó ở máy bạn | Không phải mở cổng cơ sở dữ liệu ra internet |
Ba tùy chọn giải quyết vấn đề thật
- Nhảy qua máy trung gian: đây là cách đúng để vào máy trong mạng nội bộ. Nhiều người mở cổng cho từng máy ra internet, và đó là cách sai.
- Chuyển tiếp cổng: cho phép bạn dùng công cụ đồ họa trên máy mình để nối vào cơ sở dữ liệu chạy trên máy chủ, mà cơ sở dữ liệu đó không cần mở cổng ra ngoài.
- Chỉ định khóa riêng cho từng máy: khi cần thu hồi quyền vào một máy, bạn chỉ xóa khóa đó, không ảnh hưởng các máy khác.
Quản lý tệp này theo thời gian
- Đặt tên máy theo quy ước rõ ràng, ví dụ theo dự án và vai trò. Sau hai mươi máy thì tên tùy hứng thành vô dụng.
- Thêm chú thích cho từng mục: máy này của dự án nào, ai quản lý.
- Đưa vào kho cấu hình dùng chung nếu không chứa địa chỉ nội bộ nhạy cảm. Xem bài về mang cấu hình theo máy.
- Rà lại mỗi quý: xóa mục của máy đã hủy, để tệp không phình thành thứ không ai đọc.
Câu hỏi thường gặp
File config SSH đặt ở đâu?
Ở ~/.ssh/config trên máy bạn. Quyền nên là 600, tức chỉ chủ sở hữu đọc ghi được. Nếu quyền quá rộng, SSH sẽ bỏ qua file và bạn sẽ tưởng cấu hình không có tác dụng.
Vì sao SSH báo từ chối dù tôi có đúng khóa?
Thường vì bạn có nhiều khóa và SSH thử lần lượt, vượt quá số lần thử máy chủ cho phép trước khi tới đúng khóa. Khai báo IdentityFile kèm IdentitiesOnly cho máy đó là hết.
ProxyJump có cần cài gì trên máy trung gian không?
Không, chỉ cần bạn đăng nhập được vào máy trung gian. Khóa riêng vẫn nằm trên máy bạn, máy trung gian chỉ chuyển tiếp kết nối, nên đây là cách an toàn hơn hẳn việc chép khóa lên đó.
Có nên đưa file này lên repo công khai không?
File cấu hình không chứa bí mật nên về nguyên tắc là được, nhưng nó tiết lộ địa chỉ và cấu trúc hạ tầng của bạn. Với hệ thống công ty, hãy để trong repo riêng tư.
