NixOS-WSL をプロキシ環境下で使う
はじめに
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 --update
や nixos-rebuild switch
が実行できるようになります
余談ですが、 NIX_SSL_CERT_FILE
に証明書を指定するだけで curl
や git
も使えるようになります
これは nixpkgs にある OpenSSL の パッチ nix-ssl-cert-file.patch によって、環境変数が設定されている場合はそっちを読むように挙動が変更されているようです (コードを読んだだけの推測であり、実際に動かしての確認はしていないです)
設定: 恒久対応
上記の設定ではシェル内で定義した環境変数によって直接指定をしているため、WSL の再起動等で揮発してしまいます
次は flake を用いて恒久的なプロキシと SSL 証明書の設定を行います
{
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