wg0
wireguard 라는 네트워크가 있다고 가정해 보겠습니다 10.0.0.1/24
. 부팅 시 systemd를 사용하여 시작합니다.
# systemctl enable wg-quick@wg0
10.0.0.1
sshd가 .net 이 아닌 wireguard 주소에서만 수신 대기하기를 원합니다 0.0.0.0
. 그래서 나는 다음과 같이 ListenAddress
설정했습니다 /etc/ssh/sshd_config
.
ListenAddress 10.0.0.1
#ListenAddress ::
AddressFamily inet
노트:여기서는 IPv6가 아닌 IPv4만 사용하기 때문에 주소 계열을 설정했습니다. 설정하지 않으면 ssh는 계속해서 ::
IPv6를 수신할 것입니다.
구성을 저장하고 sshd를 다시 시작하면 제대로 작동합니다. 그러나 서버를 다시 시작한 후에도 systemd에서 ssh를 활성화했음에도 불구하고 여전히 시작하지 못했습니다. 시스템 로그 출력은 이유를 알려줍니다.
sshd[xxx]: error: Bind to port 22 on 10.0.0.1 failed: Cannot assign requested address.
분명히 Wireguard 인터페이스가 준비되기 전에 sshd가 시작을 시도하고 실패하는 경쟁 조건이 있습니다.
확실한 해결책은 편집 /etc/systemd/system/sshd.service
하고 wg-quick@wg0
종속성으로 추가하는 것입니다. 그러나 After=
, Wants=
, 또는 의 조합으로는 Requires=
문제가 해결되지 않습니다. wg-quick@wg0
네트워크 인터페이스가 실제로 아직 준비되지 않았음에도 불구하고 완료되었다고 보고하는 것 같습니다 .
답변1
sys-devices-virtual-net-XXX.device
종속성으로 나열되면 Systemd는 인터페이스가 준비될 때까지 기다립니다. 따라서 sshd가 wg0 인터페이스를 기다리게 하려면 다음 [Unit]
섹션 에 다음 줄을 추가하세요 /etc/systemd/system/sshd.service
.
After=network.target [email protected]
Requires=sys-devices-virtual-net-wg0.device
이는 Wireguard 주소를 수신하는 모든 서비스에서 작동합니다. SSH에서는 또한 After=auditd.service
의 항목이 After=
공백으로 구분되거나 After=
여러 줄에 있을 수 있어야 합니다.
마지막으로 데몬을 다시 로드하고 서비스를 다시 시작합니다.
# systemctl daemon-reload
# systemctl restart sshd