`sysctl` недоступен в скрипте, запущенном swanctl на NixOS
Я использую strongswan-swanctl на VPN-сервере под управлением NixOS.
В основном это работает, и я могу подключиться к серверу VPN от клиентов.
services.strongswan-swanctl = {
enable = true;
swanctl = {
authorities = {
"vpnca" = {
cacert = "ca-cert.pem";
};
};
connections = {
"ikev2-eap" = {
version = 2;
proposals = [ "aes192gcm16-aes128gcm16-prfsha256-ecp256-ecp521"
"aes192-sha256-modp3072"
"default" ];
rekey_time = "0s";
pools = [ "primary-pool-ipv4" "primary-pool-ipv6" ];
fragmentation = "yes";
dpd_delay = "30s";
local."1" = {
certs = [ "vpn_example_com.pem" ];
id = "@vpn.example.com";
};
remote."1" = {
auth = "eap-mschapv2";
eap_id = "%any";
};
children = {
"ikev2-eap" = {
local_ts = [ "0.0.0.0/0" "::/0" ];
rekey_time = "0s";
dpd_action = "clear";
esp_proposals = [ "aes192gcm16-aes128gcm16-prfsha256-ecp256-modp3072"
"aes192-sha256-ecp256-modp3072"
"default" ];
updown = "/etc/swanctl/proxyndp.updown";
};
};
local_addrs = [ "192.0.2.1" "2001:db8::2"];
};
};
Проблема у меня внутри /etc/swanctl/proxyndp.updown
сценарий:
#! /bin/sh
case $PLUTO_VERB in
up-client-v6)
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv6.conf.all.proxy_ndp=1
ip -6 neigh add proxy ${PLUTO_PEER_CLIENT%????} dev ens3
;;
down-client-v6)
ip -6 neigh delete proxy ${PLUTO_PEER_CLIENT%????} dev ens3
;;
esac
Программа sysctl
не найден системой при выполнении этого скрипта. В обычной пользовательской оболочке я вижу инструмент в /run/current-system/sw/bin/sysctl
но для этого скрипта я получаю следующие сообщения журнала в системном журнале:
Feb 12 16:04:01 vpn.example.com charon-systemd[9249]: updown: /etc/swanctl/proxyndp.updown: line 5: sysctl: command not found
Feb 12 16:04:01 vpn.example.com charon-systemd[9249]: updown: /etc/swanctl/proxyndp.updown: line 6: sysctl: command not found
Замечания: ip
находится в той же папке и может быть запущен сценарием.
Есть идеи, что там происходит?
1 ответ
Определение поведения вне выражений Nix
Похоже, вы положили proxy.updown
подать в /etc
, Это то, что вы не должны делать в NixOS, поскольку поведение вашей системы будет зависеть не только от выражений Nix. Все должно управляться в вашем configuration.nix
(или файлы, импортированные configuration.nix
). Вместо установки пути в services.strongswan-swanctl.swanctl.connections."ikev2-eap".children."ikev2-eap".updown
Вы можете напрямую указать содержимое файла:
updown = ''
sysctl -w net.ipv6.conf.all.forwarding=1
...
'';
sysctl: команда не найдена
sysctl
Двоичный файл не найден, поскольку он не является частью PATH службы systemd, как вы можете видеть здесь в источниках. Одним из простых способов решения этой проблемы является прямая ссылка на путь магазина Nix sysctl
в обновленном скрипте с "${pkgs.procps}/bin/sysctl ..."
,
updown = ''
${pkgs.procps}/bin/sysctl -w net.ipv6.conf.all.forwarding=1
...
'';
Во время сборки это выражение преобразуется во что-то вроде "/nix/store/8f9cypv6vw5hwkh49l1j6b1rkxi4dbsq-procps-3.3.15/bin/sysctl ..."
,
Альтернатива использованию команды sysctl
Если бы вы могли жить с опцией sysctl, которая определяется постоянно, а не только когда ваш интерфейс работает, вы можете использовать boot.kernel.sysctl
вариант.
{ config, pkgs, lib, ...}:{
boot.kernel.sysctl = {
"net.ipv6.conf.all.forwarding" = "1";
"net.ipv6.conf.all.proxy_ndp" = "1";
};
services.strongswan-swanctl = {
...
}
Ресурсы
Я никогда не использовал strongswan
но я думаю, что ценным ресурсом для изучения лучших практик NixOS являются тесты NixOS. Сильная сторона определяет три виртуальные машины, загружает их и тестирует, может ли первая машина пропинговать третью через VPN.