Bạn thêm một peer vào /etc/wireguard/wg0.conf, chạy systemctl restart wg-quick@wg0, và peer biến mất khỏi tệp khi bạn nhìn lại. Không có gì làm hỏng gì cả. Khởi động lại là một lần dừng theo sau là một lần khởi động, và bước dừng có thể ghi trạng thái thời gian chạy hiện tại đè lên tệp bạn vừa sửa. Cài đặt chịu trách nhiệm nằm trong chính tệp bạn đang sửa, và đó là điều khiến vòng lặp này khó hiểu đến vậy trong lần đầu gặp phải.

Hai trạng thái, một tệp và một lần lưu khi tắt

Trạng thái thời gian chạy của WireGuard và tệp cấu hình wg-quick có liên quan nhưng khác nhau. Tệp là đầu vào: wg-quick đọc nó, tạo giao diện, đặt địa chỉ và tuyến đường và cấu hình các peer. Thiết bị kernel là đối tượng sống, và những thay đổi cấp thấp thực hiện bằng wg không bao giờ tự ghi lại.

Trừ một hướng. Khi SaveConfig = true xuất hiện trong phần giao diện, wg-quick lưu cấu hình sống vào tệp như một phần của việc hạ giao diện. Hướng dẫn wg-quick cảnh báo đúng về điều này: những thay đổi được thực hiện trên tệp trong khi giao diện đang hoạt động có thể bị ghi đè khi nó bị gỡ bỏ. Đây là lần lưu khi tắt, không phải bộ hẹn giờ nền, nên nó chỉ kích hoạt khi có thứ gì đó dừng giao diện.

ActionWhat it writesWhen it surprises you
wg set on a live interfaceKernel state onlyAfter reboot, when the file was never updated
wg-quick down with SaveConfigLive state into the fileRight after you edited the file
wg syncconfKernel state onlyNever; it does not touch the file
wg-quick upKernel state from the fileIf the file is stale, you get the old tunnel

Hãy đọc bảng như một cảnh báo về thứ tự. Mọi mất mát tình cờ trong lĩnh vực này đều đến từ một chỉnh sửa xảy ra trước một lần lưu thay vì sau đó.

Dừng trước, sửa thứ hai, khởi động cuối cùng

Nếu tệp là nguồn sự thật của bạn, hãy làm cho tệp có thẩm quyền bằng cấu trúc thay vì bằng hy vọng. Hạ giao diện, xác nhận nó đã biến mất, rồi sửa, rồi đưa nó trở lại. Quy tắc rất đơn giản: không có chỉnh sửa nào tồn tại khi một lần lưu vẫn có thể chạy.

sudo cp -a /etc/wireguard/wg0.conf /root/wg0.conf.$(date +%F-%H%M)
sudo wg-quick down wg0
ls /sys/class/net/wg0 2>/dev/null || echo "interface is gone"
sudoedit /etc/wireguard/wg0.conf
sudo wg-quick up wg0

Dòng sao lưu không phải là nghi lễ. Nếu đường hầm là cách bạn đến máy này, bước hạ có thể kết thúc phiên của bạn, và một bản sao trên đĩa cùng một bảng điều khiển hoặc một đường ngoài băng tần là cách khôi phục duy nhất hoạt động. Hãy kiểm tra dòng thứ hai đó trước khi tin vào nó: một tên giao diện cũ trong một script thất bại âm thầm chính là cách người ta sửa một tệp vẫn còn sống.

Đặt SaveConfig = false trước một lần hạ bình thường là con đường được chấp nhận khác, và phải được thực hiện trong tệp mà wg-quick thực sự đọc. Nó ngăn lần lưu tự động đó. Nó không khiến một hồ sơ NetworkManager riêng, một bản xuất router hay một điểm vào container tải lại các chỉnh sửa của bạn, vì những trình quản lý đó hoàn toàn không đọc tệp này.

Áp dụng thay đổi peer mà không xé giao diện

Không phải mọi chỉnh sửa đều cần gián đoạn. Các thay đổi cấp peer có thể được áp dụng cho một giao diện đang chạy bằng cách chuyển tệp thành cấu hình và đồng bộ nó, điều này tránh hoàn toàn bước hạ và do đó tránh lần lưu:

sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
sudo wg show wg0 peers
sudo wg show wg0 latest-handshakes

Bước strip quan trọng. Nó in tệp với các khóa chỉ thuộc wg-quick bị loại bỏ, để địa chỉ, DNS và các chỉ thị định tuyến không đi vào một công cụ không hiểu chúng. Sau đó đồng bộ áp dụng peer và khóa cho thiết bị sống mà không tạo lại giao diện, nên các phiên và tuyến đường hiện có vẫn tồn tại.

Hãy chính xác về các giới hạn. Đồng bộ peer không thay đổi địa chỉ giao diện, các tuyến đường wg-quick đã thêm hay cấu hình resolver, vì không thứ nào trong đó thuộc về thiết bị WireGuard. Thêm một subnet vào AllowedIPs và mong kernel định tuyến nó là cách đọc sai kinh điển; tuyến đường phải được wg-quick thêm khi nâng lên hoặc do bạn thêm.

Kiểm tra ai sở hữu giao diện trước khi sửa bất cứ thứ gì

Trên một máy tính để bàn hoặc máy chủ được quản lý bởi hệ thống cấu hình, tệp có thể là đầu ra thay vì đầu vào. Một kết nối NetworkManager, một hồ sơ do router tạo hoặc một script khởi động container đều có thể sở hữu cùng một tên giao diện, và trong trường hợp đó một chuỗi wg-quick hoàn hảo vẫn sửa nhầm hiện vật.

systemctl status wg-quick@wg0 --no-pager
nmcli connection show | grep -i wireguard
sudo wg showconf wg0 | head -n 5

Lệnh thứ ba in cấu hình sống ở cùng định dạng như tệp, bao gồm khóa riêng, điều này hữu ích để so sánh và nguy hiểm trong một ticket. Hãy che nó trước khi dán; khóa riêng trong một luồng hỗ trợ là rò rỉ vĩnh viễn, không phải lỗi đánh máy.

Nếu đơn vị dịch vụ không hoạt động nhưng giao diện tồn tại, thứ khác đã tạo ra nó và tệp không có thẩm quyền. Quan sát duy nhất đó tiết kiệm một giờ sửa một tệp mà không gì đọc.

Xác minh lần khởi động lại tiếp theo, rồi giữ một bản khôi phục

Phép thử thực sự chứng minh bản sửa là lần khởi động lại thứ hai, vì đó là chuỗi đã thất bại lần đầu. Xác nhận peer sống sót và cấu hình sống vẫn khớp với những gì trên đĩa:

sudo systemctl restart wg-quick@wg0
sudo wg show wg0 latest-handshakes
sudo grep -c '^\[Peer\]' /etc/wireguard/wg0.conf

Chạy khởi động lại hai lần. Một lần qua sạch có thể là may mắn: lần khởi động lại đầu có thể tiêu thụ một thay đổi thời gian chạy chưa được lưu, nên lần thứ hai là lần cho bạn biết tệp và thời gian chạy đã đồng ý ở cuối lần đầu.

Giữ bản sao lưu từ đầu quá trình cho đến khi bạn làm xong lần khởi động lại kép, rồi xóa nó hoặc chuyển nó ra khỏi thư mục cấu hình. Một wg0.conf.bak lạc bên cạnh tệp thật là vô hại với wg-quick và gây nhầm lẫn cho người tiếp theo, người cuối cùng sẽ sửa nhầm tệp.

Bài viết liên quan