🗒️

NixOS-WSL をプロキシ環境下で使う

2024/12/11に公開

https://adventar.org/calendars/10086

はじめに

Nix 使ってますか?
使用者数がうなぎ上りの Nix ですが、迂回不能なプロキシに阻まれて Nix の使用を諦めている方も多々居ることでしょう
職場での Nix 使用人口を増やすべく、この記事では NixOS-WSL におけるプロキシ + SSL 証明書の設定方法を説明します
(非 WSL 環境の NixOS や他 OS 上の Nix での動作は確認していません)

前提

NixOS-WSL 自体のインストール手順はこの記事では説明しません
下記の手順は NixOS-WSL のインストールが完了し、wsl -u root でシェルに入った状態での作業を想定しています

以下、プロキシ URL を http://host.example.com:1234 と、
SSL 証明書ファイルの場所を /mnt/c/ssl.crt とします

環境情報は下記の通りです

$ wsl.exe --version
WSL バージョン: 2.3.17.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.64
MSRDC バージョン: 1.2.5326
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.22631.4317

$ powershell.exe 'cat $env:USERPROFILE\.wslconfig'
[wsl2]
networkingMode=mirrored

$ nix-info -m
 - system: `"x86_64-linux"`
 - host os: `Linux 5.15.153.1-microsoft-standard-WSL2, NixOS, 24.05 (Uakari), 24.05.20240702.706eef5`
 - multi-user?: `yes`
 - sandbox: `yes`
 - version: `nix-env (Nix) 2.18.4`
 - nixpkgs: `/nix/var/nix/profiles/per-user/root/channels/nixos`

設定: インストール直後

下記コマンドでプロキシと SSL 証明書を nix-daemon に認識してもらいます

export HTTPS_PROXY='http://host.example.com:1234'
export NIX_SSL_CERT_FILE='/mnt/c/ssl.crt'
systemctl set-environment NIX_SSL_CERT_FILE="${NIX_SSL_CERT_FILE}" HTTPS_PROXY="${HTTPS_PROXY}"
systemctl restart nix-daemon

これによって、一時的に nix-channel --updatenixos-rebuild switch が実行できるようになります

余談ですが、 NIX_SSL_CERT_FILE に証明書を指定するだけで curlgit も使えるようになります
これは nixpkgs にある OpenSSL の パッチ nix-ssl-cert-file.patch によって、環境変数が設定されている場合はそっちを読むように挙動が変更されているようです (コードを読んだだけの推測であり、実際に動かしての確認はしていないです)

設定: 恒久対応

上記の設定ではシェル内で定義した環境変数によって直接指定をしているため、WSL の再起動等で揮発してしまいます
次は flake を用いて恒久的なプロキシと SSL 証明書の設定を行います

flake.nix
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    nixos-wsl = {
      url = "github:nix-community/nixos-wsl";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = {
    nixpkgs,
    nixos-wsl,
    ...
  }: let
  in {
    nixosConfigurations = {
      "default" = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [
          nixos-wsl.nixosModules.wsl
          {
            system.stateVersion = "24.05";
            wsl.enable = true;

            security.pki.certificates = [(builtins.readFile /mnt/c/ssl.crt)];
            networking = {
              proxy = let
                proxy = "http://host.example.com:1234";
              in {
                default = proxy;
                allProxy = proxy;
              };
            };
          }
        ];
      };
    };
  };
}

上記の flake.nix そのもの、もしくは同等の定義が入ったものを適当なディレクトリに入れ、下記コマンドで適用します

nix --experimental-features 'nix-command flakes' shell nixpkgs#git --command sh -c 'git init && git add -N . && nixos-rebuild switch --flake .#default --impure'

これで Nix とその他基本的なプログラムは外に出ていけるようになりました

docker や maven 等、汎用の環境変数だけでは設定できないものについては、別途 home-manager やら何やらを使って設定してください

Discussion