`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.

Другие вопросы по тегам