/etc/wireguard/wg0.conf에 peer를 추가하고 systemctl restart wg-quick@wg0을 실행한 뒤 다시 보면 peer가 파일에서 사라져 있습니다. 무엇도 무엇을 손상시키지 않았습니다. 재시작은 중지 후 시작이며, 중지 단계가 현재 런타임 상태를 방금 편집한 파일 위에 다시 쓸 수 있습니다. 책임지는 설정은 편집하던 바로 그 파일에 있으며, 그것이 이 루프를 처음 겪을 때 그토록 혼란스럽게 만드는 이유입니다.

두 상태, 하나의 파일, 그리고 종료 시 저장

WireGuard의 런타임 상태와 wg-quick 구성 파일은 관련이 있지만 서로 다릅니다. 파일은 입력입니다: wg-quick이 그것을 읽고 인터페이스를 만들며 주소와 경로를 설정하고 peer를 구성합니다. 커널 장치는 살아 있는 객체이며, wg로 수행한 저수준 변경은 결코 스스로 다시 쓰이지 않습니다.

한 방향만 예외입니다. 인터페이스 섹션에 SaveConfig = true이 있으면 wg-quick은 인터페이스를 내리는 과정의 일부로 살아 있는 구성을 파일에 저장합니다. wg-quick 설명서는 바로 이것을 경고합니다: 인터페이스가 켜져 있는 동안 파일에 가한 변경은 인터페이스를 제거할 때 덮어써질 수 있습니다. 이것은 종료 시 저장이며 백그라운드 타이머가 아니므로, 무언가 인터페이스를 멈출 때만 작동합니다.

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

표를 순서에 관한 경고로 읽으십시오. 이 영역의 모든 우발적 손실은 저장 이후가 아니라 저장 이전에 일어난 편집에서 비롯됩니다.

먼저 중지하고, 다음에 편집하고, 마지막에 시작하십시오

파일이 당신의 진실 원천이라면 희망이 아니라 구조로 파일을 권위 있게 만드십시오. 인터페이스를 내리고 사라졌는지 확인한 다음 편집하고, 그다음 다시 올리십시오. 규칙은 간단합니다: 저장이 아직 실행될 수 있는 동안에는 편집이 존재해서는 안 됩니다.

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

백업 줄은 의식이 아닙니다. 터널이 이 머신에 도달하는 방법이라면 내리는 단계가 세션을 끝낼 수 있으며, 디스크의 사본과 콘솔 또는 대역 외 경로만이 작동하는 유일한 롤백입니다. 두 번째 줄을 믿기 전에 확인하십시오: 조용히 실패하는 스크립트의 오래된 인터페이스 이름이 바로 사람들이 아직 살아 있는 파일을 편집하는 방식입니다.

일반적인 내리기 전에 SaveConfig = false을 설정하는 것이 다른 허용되는 경로이며, wg-quick이 실제로 읽는 파일에서 해야 합니다. 그것은 그 한 번의 자동 저장을 막습니다. 별도의 NetworkManager 프로필, 라우터 내보내기 또는 컨테이너 진입점이 편집 내용을 다시 로드하게 만들지는 않습니다, 그 관리자들은 이 파일을 전혀 읽지 않기 때문입니다.

인터페이스를 찢지 않고 peer 변경을 적용하십시오

모든 편집에 중단이 필요한 것은 아닙니다. 파일을 구성으로 변환하고 동기화하여 실행 중인 인터페이스에 peer 수준 변경을 적용할 수 있으며, 이는 내리는 단계를 완전히 피하고 따라서 저장도 피합니다:

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

strip 단계가 중요합니다. wg-quick 전용 키를 제거한 파일을 출력하므로 주소, DNS 및 라우팅 지시문이 그것을 이해하지 못하는 도구로 전달되지 않습니다. 그런 다음 동기화가 인터페이스를 다시 만들지 않고 peer와 키를 살아 있는 장치에 적용하므로 기존 세션과 경로가 살아남습니다.

한계에 대해 정확하십시오. peer 동기화는 인터페이스 주소, wg-quick이 추가한 경로 또는 리졸버 구성을 변경하지 않습니다, 그중 어느 것도 WireGuard 장치에 속하지 않기 때문입니다. AllowedIPs에 서브넷을 추가하고 커널이 그것을 라우팅하기를 기대하는 것은 전형적인 잘못된 읽기입니다: 경로는 올릴 때 wg-quick이 추가하거나 당신이 추가해야 합니다.

무엇이든 편집하기 전에 인터페이스 소유자를 확인하십시오

구성 시스템이 관리하는 데스크톱이나 서버에서는 파일이 입력이 아니라 출력일 수 있습니다. NetworkManager 연결, 라우터가 생성한 프로필 또는 컨테이너 시작 스크립트가 모두 같은 인터페이스 이름을 소유할 수 있으며, 그 경우 완벽한 wg-quick 순서도 잘못된 산출물을 편집합니다.

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

세 번째 명령은 살아 있는 구성을 파일과 같은 형식으로 출력하며 개인 키도 포함하는데, 비교에는 유용하고 티켓에서는 위험합니다. 붙여넣기 전에 가리십시오: 지원 스레드의 개인 키는 영구적인 침해이며 오타가 아닙니다.

서비스 단위가 비활성인데 인터페이스가 존재한다면 다른 무언가가 그것을 만들었고 파일은 권위가 없습니다. 그 하나의 관찰이 아무것도 읽지 않는 파일을 편집하는 한 시간을 절약합니다.

다음 재시작을 검증한 다음 롤백을 유지하십시오

수정을 실제로 증명하는 테스트는 두 번째 재시작입니다, 처음에 실패한 것이 바로 그 순서이기 때문입니다. peer가 그것을 견디고 살아 있는 구성이 여전히 디스크의 내용과 일치하는지 확인하십시오:

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

재시작을 두 번 실행하십시오. 한 번의 깨끗한 통과는 운일 수 있습니다: 첫 번째 재시작이 아직 저장되지 않은 런타임 변경을 소비할 수 있으므로, 두 번째가 첫 번째 끝에서 파일과 런타임이 합의했음을 알려줍니다.

이중 재시작을 마칠 때까지 프로세스 시작부터 백업을 유지한 다음 삭제하거나 구성 디렉터리 밖으로 옮기십시오. 실제 파일 옆에 남은 wg0.conf.bak은 wg-quick에 무해하고 다음 사람을 혼란스럽게 하여 결국 잘못된 것을 편집하게 만듭니다.

관련 글