Предположим, у меня есть сеть wireguard с именем wg0 на 10.0.0.1/24. Я использую systemd для запуска при загрузке:

# systemctl enable wg-quick@wg0

Я хочу, чтобы sshd прослушивал только адрес wireguard 10.0.0.1 вместо 0.0.0.0. Поэтому я установил ListenAddress в /etc/ssh/sshd_config:

ListenAddress  10.0.0.1
#ListenAddress  ::
AddressFamily  inet

Примечание. Я установил семейство адресов, потому что здесь я использую только IPv4, а не IPv6. Я думаю, что если он не установлен, ssh будет продолжать прослушивать :: по IPv6.

Если я сохраню конфигурацию и перезапущу sshd, он отлично работает. Но после перезагрузки сервера ssh не запускается, несмотря на то, что он включен в systemd. Вывод системного журнала говорит нам, почему:

sshd[xxx]: error: Bind to port 22 on 10.0.0.1 failed: Cannot assign requested address.

Очевидно, у нас есть состояние гонки, когда sshd пытается (и не может) запуститься до того, как интерфейс wireguard будет готов.

Очевидное решение — отредактировать /etc/systemd/system/sshd.service и добавить wg-quick@wg0 в качестве зависимости. Однако никакая комбинация After=, Wants= или Requires= не помогает. Кажется, wg-quick@wg0 сообщает, что все готово, хотя сетевой интерфейс еще не готов.

1
Keith 17 Дек 2020 в 21:58

1 ответ

Systemd будет ждать готовности интерфейса, если sys-devices-virtual-net-XXX.device указан как зависимость. Итак, чтобы sshd ждал интерфейса wg0, добавьте эти строки в раздел [Unit] /etc/systemd/system/sshd.service:

After=network.target wg-quick@wg0.service
Requires=sys-devices-virtual-net-wg0.device

Это должно работать для любой службы, прослушивающей адрес wireguard. SSH также требует After=auditd.service. Элементы в After= могут быть разделены пробелом или находиться в нескольких строках After=.

Наконец, перезагрузите демон и перезапустите службу:

# systemctl daemon-reload
# systemctl restart sshd
2
Keith 29 Июн 2021 в 22:46
1
Обратите внимание, что вы можете использовать systemctl edit sshd, а затем добавить блок [Unit] и строки выше; тогда вам не нужно будет вносить изменения во встроенный файл службы, и вам не нужно выполнять daemon-reload.
 – 
squidpickles
6 Янв 2021 в 23:11