photoncloud-monorepo/nix-nos/modules/bgp/gobgp.nix
centra ce4bab07d6
Some checks failed
Nix CI / filter (push) Failing after 1s
Nix CI / gate () (push) Has been skipped
Nix CI / gate (shared crates) (push) Has been skipped
Nix CI / build () (push) Has been skipped
Nix CI / ci-status (push) Failing after 1s
fiberlb: add native BGP speaker and VM smoke test
2026-03-30 16:13:14 +09:00

90 lines
2.2 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.nix-nos.bgp;
# Generate GoBGP configuration
gobgpConfig = pkgs.writeText "gobgpd.conf" (builtins.toJSON {
global = {
config = {
as = cfg.asn;
router-id = cfg.routerId;
};
};
neighbors = map (peer: {
config = {
neighbor-address = peer.address;
peer-as = peer.asn;
description = if peer.description != "" then peer.description else "BGP peer ${peer.address}";
};
}) cfg.peers;
defined-sets = {
prefix-sets = [
{
prefix-set-name = "nix-nos-announcements";
prefix-list = map (ann: {
ip-prefix = ann.prefix;
}) cfg.announcements;
}
];
};
policy-definitions = [
{
name = "export-announcements";
statements = [
{
conditions = {
match-prefix-set = {
prefix-set = "nix-nos-announcements";
};
};
actions = {
route-disposition = "accept-route";
};
}
];
}
];
});
in {
config = mkIf (config.nix-nos.enable && cfg.enable && cfg.backend == "gobgp") {
# Install GoBGP package
environment.systemPackages = [ pkgs.gobgp pkgs.gobgpd ];
# GoBGP systemd service
systemd.services.gobgpd = {
description = "GoBGP Routing Daemon";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "simple";
ExecStart = "${pkgs.gobgpd}/bin/gobgpd -f ${gobgpConfig}";
Restart = "on-failure";
RestartSec = "5s";
};
};
# Enable IP forwarding for BGP
boot.kernel.sysctl = {
"net.ipv4.ip_forward" = 1;
};
# Add announcements as static routes
networking.localCommands = mkIf (cfg.announcements != []) ''
${concatMapStringsSep "\n" (ann:
let
parts = splitString "/" ann.prefix;
ip = elemAt parts 0;
in
"${pkgs.iproute2}/bin/ip route add ${ann.prefix} ${if ann.nexthop != null then "via ${ann.nexthop}" else "blackhole"}"
) cfg.announcements}
'';
};
}