router: small update
Since I have to rebuild unbound and Linux anyway, might as well change it a bit
This commit is contained in:
parent
64ff8be357
commit
0ac1502979
|
@ -99,12 +99,14 @@
|
||||||
};
|
};
|
||||||
router-emmc = rec {
|
router-emmc = rec {
|
||||||
system = "aarch64-linux";
|
system = "aarch64-linux";
|
||||||
specialArgs.notnft = if devNft then (import /${devPath}/notnft { inherit (nixpkgs) lib; }).config.notnft else notnft.lib.${system};
|
|
||||||
specialArgs.router-lib = if devNixRt then import /${devPath}/nixos-router/lib.nix { inherit (nixpkgs) lib; } else nixos-router.lib.${system};
|
specialArgs.router-lib = if devNixRt then import /${devPath}/nixos-router/lib.nix { inherit (nixpkgs) lib; } else nixos-router.lib.${system};
|
||||||
specialArgs.server-config = nixosConfigurations.nixserver.config;
|
specialArgs.server-config = nixosConfigurations.nixserver.config;
|
||||||
modules = [
|
modules = [
|
||||||
|
{
|
||||||
|
_module.args.notnft = if devNft then (import /${devPath}/notnft { inherit (nixpkgs) lib; }).config.notnft else notnft.lib.${system};
|
||||||
|
}
|
||||||
(import ./system/devices/bpi-r3-router.nix "emmc")
|
(import ./system/devices/bpi-r3-router.nix "emmc")
|
||||||
(if devNixRt then (import /${devPath}/nixos-router) else nixos-router.nixosModules.default)
|
(if devNixRt then import /${devPath}/nixos-router else nixos-router.nixosModules.default)
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
router-sd = rec {
|
router-sd = rec {
|
||||||
|
|
|
@ -80,23 +80,6 @@ in
|
||||||
stdenv = pkgs'.ccacheStdenv;
|
stdenv = pkgs'.ccacheStdenv;
|
||||||
};
|
};
|
||||||
|
|
||||||
hostapd = (pkgs.hostapd.override { stdenv = pkgs'.ccacheStdenv; }).overrideAttrs (old: {
|
|
||||||
# also remove 80211N
|
|
||||||
extraConfig = old.extraConfig + ''
|
|
||||||
CONFIG_OCV=y
|
|
||||||
CONFIG_WPS=y
|
|
||||||
CONFIG_WPS_NFC=y
|
|
||||||
CONFIG_WNM=y
|
|
||||||
CONFIG_IEEE80211AX=y
|
|
||||||
CONFIG_IEEE80211BE=y
|
|
||||||
CONFIG_ELOOP_EPOLL=y
|
|
||||||
CONFIG_MBO=y
|
|
||||||
CONFIG_TAXONOMY=y
|
|
||||||
CONFIG_OWE=y
|
|
||||||
CONFIG_AIRTIME_POLICY=y
|
|
||||||
'';
|
|
||||||
});
|
|
||||||
|
|
||||||
cutter2 = pkgs.callPackage ./rizin/wrapper.nix {
|
cutter2 = pkgs.callPackage ./rizin/wrapper.nix {
|
||||||
unwrapped = pkgs.cutter;
|
unwrapped = pkgs.cutter;
|
||||||
} [ (pkgs.libsForQt5.callPackage ./rizin/rz-ghidra.nix {
|
} [ (pkgs.libsForQt5.callPackage ./rizin/rz-ghidra.nix {
|
||||||
|
|
|
@ -116,7 +116,7 @@ in rec {
|
||||||
'';
|
'';
|
||||||
fixupPhase = "true";
|
fixupPhase = "true";
|
||||||
};
|
};
|
||||||
linux_bpiR3 = pkgs.linux_testing.override {
|
linux_bpiR3 = pkgs.linux_latest.override {
|
||||||
stdenv = pkgs'.ccacheStdenv;
|
stdenv = pkgs'.ccacheStdenv;
|
||||||
buildPackages = pkgs'.buildPackages // {
|
buildPackages = pkgs'.buildPackages // {
|
||||||
stdenv = pkgs'.buildPackages.ccacheStdenv;
|
stdenv = pkgs'.buildPackages.ccacheStdenv;
|
||||||
|
@ -250,14 +250,23 @@ in rec {
|
||||||
# hardware specific stuff
|
# hardware specific stuff
|
||||||
FB = lib.mkForce no;
|
FB = lib.mkForce no;
|
||||||
DRM = no;
|
DRM = no;
|
||||||
|
SOUND = no;
|
||||||
|
INFINIBAND = lib.mkForce no;
|
||||||
CFG80211 = module;
|
CFG80211 = module;
|
||||||
MAC80211 = module;
|
MAC80211 = module;
|
||||||
|
WLAN = yes;
|
||||||
|
|
||||||
NR_CPUS = lib.mkForce (freeform "4");
|
NR_CPUS = lib.mkForce (freeform "4");
|
||||||
SMP = yes;
|
SMP = yes;
|
||||||
|
|
||||||
SFP = yes;
|
SFP = yes;
|
||||||
ARCH_MEDIATEK = yes;
|
ARCH_MEDIATEK = yes;
|
||||||
|
COMMON_CLK_MEDIATEK = yes;
|
||||||
|
COMMON_CLK_MEDIATEK_FHCTL = yes;
|
||||||
|
COMMON_CLK_MT7986 = yes;
|
||||||
|
COMMON_CLK_MT7986_ETHSYS = yes;
|
||||||
|
EINT_MTK = yes;
|
||||||
|
MEDIATEK_GE_PHY = yes;
|
||||||
MEDIATEK_WATCHDOG = yes;
|
MEDIATEK_WATCHDOG = yes;
|
||||||
MTD_NAND_ECC_MEDIATEK = yes;
|
MTD_NAND_ECC_MEDIATEK = yes;
|
||||||
MTD_NAND_ECC_SW_HAMMING = yes;
|
MTD_NAND_ECC_SW_HAMMING = yes;
|
||||||
|
@ -269,6 +278,8 @@ in rec {
|
||||||
MTK_HSDMA = yes;
|
MTK_HSDMA = yes;
|
||||||
MTK_INFRACFG = yes;
|
MTK_INFRACFG = yes;
|
||||||
MTK_PMIC_WRAP = yes;
|
MTK_PMIC_WRAP = yes;
|
||||||
|
MTK_LVTS_THERMAL = yes;
|
||||||
|
MTK_SOC_THERMAL = yes;
|
||||||
MTK_THERMAL = yes;
|
MTK_THERMAL = yes;
|
||||||
MTK_TIMER = yes;
|
MTK_TIMER = yes;
|
||||||
NET_DSA_MT7530 = yes;
|
NET_DSA_MT7530 = yes;
|
||||||
|
@ -282,8 +293,15 @@ in rec {
|
||||||
NET_VENDOR_MEDIATEK = yes;
|
NET_VENDOR_MEDIATEK = yes;
|
||||||
PCIE_MEDIATEK = yes;
|
PCIE_MEDIATEK = yes;
|
||||||
PCIE_MEDIATEK_GEN3 = yes;
|
PCIE_MEDIATEK_GEN3 = yes;
|
||||||
|
PCS_MTK_LYNXI = yes;
|
||||||
|
PINCTRL_MTK = yes;
|
||||||
PINCTRL_MT7986 = yes;
|
PINCTRL_MT7986 = yes;
|
||||||
PWM_MEDIATEK = yes;
|
PWM_MEDIATEK = yes;
|
||||||
|
REGULATOR_MT6380 = yes;
|
||||||
|
MT76_CORE = module;
|
||||||
|
MT76_LEDS = yes;
|
||||||
|
MT76_CONNAC_LIB = module;
|
||||||
|
MT7815E = module;
|
||||||
MT7915E = module;
|
MT7915E = module;
|
||||||
MT7986_WMAC = yes;
|
MT7986_WMAC = yes;
|
||||||
SPI_MT65XX = yes;
|
SPI_MT65XX = yes;
|
||||||
|
|
|
@ -50,7 +50,7 @@ let
|
||||||
|
|
||||||
dnatRuleMode = rule:
|
dnatRuleMode = rule:
|
||||||
if rule.mode != "" then rule.mode
|
if rule.mode != "" then rule.mode
|
||||||
else if rule.target4.address or null == gatewayAddr4 || rule.target6.address or null == gatewayAddr6 then "rule"
|
else if rule.target4.address or null == netAddresses.lan4 || rule.target6.address or null == netAddresses.lan6 then "rule"
|
||||||
else "mark";
|
else "mark";
|
||||||
|
|
||||||
# nftables rules generator
|
# nftables rules generator
|
||||||
|
@ -179,31 +179,27 @@ let
|
||||||
} // extraInetEntries);
|
} // extraInetEntries);
|
||||||
};
|
};
|
||||||
|
|
||||||
unbound-python = pkgs.python3.withPackages (ps: with ps; [ pydbus dnspython requests pytricia nftables ]);
|
netAddressesWithPrefixLen = {
|
||||||
|
lan4 = cfg.network;
|
||||||
|
lan6 = cfg.network6;
|
||||||
|
netns4 = cfg.netnsNet;
|
||||||
|
netns6 = cfg.netnsNet6;
|
||||||
|
};
|
||||||
|
|
||||||
# parse a.b.c.d/x into { address, prefixLength }
|
# parse a.b.c.d/x into { address, prefixLength }
|
||||||
netParsedCidr4 = router-lib.parseCidr cfg.network;
|
netParsedCidrs = builtins.mapAttrs (_: router-lib.parseCidr) netAddressesWithPrefixLen;
|
||||||
netParsedCidr6 = router-lib.parseCidr cfg.network6;
|
|
||||||
netnsParsedCidr4 = router-lib.parseCidr cfg.netnsNet;
|
|
||||||
netnsParsedCidr6 = router-lib.parseCidr cfg.netnsNet6;
|
|
||||||
|
|
||||||
# generate network cidr from device address
|
# generate network cidr from device address
|
||||||
# (normalizeCidr applies network mask to the address)
|
# (normalizeCidr applies network mask to the address)
|
||||||
netCidr4 = router-lib.serializeCidr (router-lib.normalizeCidr netParsedCidr4);
|
netCidrs = builtins.mapAttrs (_: v: router-lib.serializeCidr (router-lib.normalizeCidr v)) netParsedCidrs;
|
||||||
netCidr6 = router-lib.serializeCidr (router-lib.normalizeCidr netParsedCidr6);
|
|
||||||
netnsCidr4 = router-lib.serializeCidr (router-lib.normalizeCidr netnsParsedCidr4);
|
|
||||||
netnsCidr6 = router-lib.serializeCidr (router-lib.normalizeCidr netnsParsedCidr6);
|
|
||||||
|
|
||||||
gatewayAddr4 = netParsedCidr4.address;
|
netAddresses = builtins.mapAttrs (_: v: v.address) netParsedCidrs;
|
||||||
gatewayAddr6 = netParsedCidr6.address;
|
|
||||||
mainNetnsAddr4 = netnsParsedCidr4.address;
|
|
||||||
mainNetnsAddr6 = netnsParsedCidr6.address;
|
|
||||||
|
|
||||||
wanNetnsAddr4 = cfg.wanNetnsAddr;
|
wanNetnsAddr4 = cfg.wanNetnsAddr;
|
||||||
wanNetnsAddr6 = cfg.wanNetnsAddr6;
|
wanNetnsAddr6 = cfg.wanNetnsAddr6;
|
||||||
|
|
||||||
parsedGatewayAddr4 = router-lib.parseIp4 gatewayAddr4;
|
parsedGatewayAddr4 = router-lib.parseIp4 netAddresses.lan4;
|
||||||
parsedGatewayAddr6 = router-lib.parseIp6 gatewayAddr6;
|
parsedGatewayAddr6 = router-lib.parseIp6 netAddresses.lan6;
|
||||||
|
|
||||||
addToIp' = ip: n: lib.init ip ++ [ (lib.last ip + n) ];
|
addToIp' = ip: n: lib.init ip ++ [ (lib.last ip + n) ];
|
||||||
addToIp = ip: n: router-lib.serializeIp (addToIp' ip n);
|
addToIp = ip: n: router-lib.serializeIp (addToIp' ip n);
|
||||||
|
@ -230,7 +226,7 @@ in {
|
||||||
services.openssh.enable = true;
|
services.openssh.enable = true;
|
||||||
services.fail2ban = {
|
services.fail2ban = {
|
||||||
enable = true;
|
enable = true;
|
||||||
ignoreIP = [ netCidr4 netCidr6 ];
|
ignoreIP = [ netCidrs.lan4 netCidrs.lan6 ];
|
||||||
maxretry = 10;
|
maxretry = 10;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -359,19 +355,19 @@ in {
|
||||||
router.interfaces.br0 = {
|
router.interfaces.br0 = {
|
||||||
dependentServices = [ { service = "unbound"; bindType = "wants"; } ];
|
dependentServices = [ { service = "unbound"; bindType = "wants"; } ];
|
||||||
ipv4.addresses = [ {
|
ipv4.addresses = [ {
|
||||||
address = gatewayAddr4;
|
address = netAddresses.lan4;
|
||||||
inherit (netParsedCidr4) prefixLength;
|
inherit (netParsedCidrs.lan4) prefixLength;
|
||||||
dns = [ gatewayAddr4 ];
|
dns = [ netAddresses.lan4 ];
|
||||||
keaSettings.reservations = map (res: {
|
keaSettings.reservations = map (res: {
|
||||||
hw-address = res.macAddress;
|
hw-address = res.macAddress;
|
||||||
ip-address = res.ipAddress;
|
ip-address = res.ipAddress;
|
||||||
}) cfg.dhcpReservations;
|
}) cfg.dhcpReservations;
|
||||||
} ];
|
} ];
|
||||||
ipv6.addresses = [ {
|
ipv6.addresses = [ {
|
||||||
address = gatewayAddr6;
|
address = netAddresses.lan6;
|
||||||
inherit (netParsedCidr6) prefixLength;
|
inherit (netParsedCidrs.lan6) prefixLength;
|
||||||
dns = [ gatewayAddr6 ];
|
dns = [ netAddresses.lan6 ];
|
||||||
gateways = [ gatewayAddr6 ];
|
gateways = [ netAddresses.lan6 ];
|
||||||
radvdSettings.AdvAutonomous = true;
|
radvdSettings.AdvAutonomous = true;
|
||||||
coreradSettings.autonomous = true;
|
coreradSettings.autonomous = true;
|
||||||
# don't autoallocate addresses, keep autonomous ones
|
# don't autoallocate addresses, keep autonomous ones
|
||||||
|
@ -383,10 +379,10 @@ in {
|
||||||
}) cfg.dhcp6Reservations;
|
}) cfg.dhcp6Reservations;
|
||||||
} ];
|
} ];
|
||||||
ipv4.routes = [
|
ipv4.routes = [
|
||||||
{ extraArgs = [ netCidr4 "dev" "br0" "proto" "kernel" "scope" "link" "src" gatewayAddr4 "table" wan_table ]; }
|
{ extraArgs = [ netCidrs.lan4 "dev" "br0" "proto" "kernel" "scope" "link" "src" netAddresses.lan4 "table" wan_table ]; }
|
||||||
];
|
];
|
||||||
ipv6.routes = [
|
ipv6.routes = [
|
||||||
{ extraArgs = [ netCidr6 "dev" "br0" "proto" "kernel" "metric" "256" "pref" "medium" "table" wan_table ]; }
|
{ extraArgs = [ netCidrs.lan6 "dev" "br0" "proto" "kernel" "metric" "256" "pref" "medium" "table" wan_table ]; }
|
||||||
];
|
];
|
||||||
ipv4.kea.enable = true;
|
ipv4.kea.enable = true;
|
||||||
ipv6.radvd.enable = true;
|
ipv6.radvd.enable = true;
|
||||||
|
@ -421,8 +417,8 @@ in {
|
||||||
# things to note: this has the code for switching between rtables
|
# things to note: this has the code for switching between rtables
|
||||||
# otherwise, boring stuff
|
# otherwise, boring stuff
|
||||||
nftables.jsonRules = mkRules {
|
nftables.jsonRules = mkRules {
|
||||||
selfIp4 = gatewayAddr4;
|
selfIp4 = netAddresses.lan4;
|
||||||
selfIp6 = gatewayAddr6;
|
selfIp6 = netAddresses.lan6;
|
||||||
lans = [ "br0" ];
|
lans = [ "br0" ];
|
||||||
wans = [ "wg0" "veth-wan-a" ];
|
wans = [ "wg0" "veth-wan-a" ];
|
||||||
logPrefix = "lan ";
|
logPrefix = "lan ";
|
||||||
|
@ -452,8 +448,8 @@ in {
|
||||||
# allow dnat ("ct status dnat" doesn't work)
|
# allow dnat ("ct status dnat" doesn't work)
|
||||||
];
|
];
|
||||||
inetInboundWanRules = with notnft.dsl; with payload; [
|
inetInboundWanRules = with notnft.dsl; with payload; [
|
||||||
[(is.eq ip.saddr (cidr netnsCidr4)) accept]
|
[(is.eq ip.saddr (cidr netCidrs.netns4)) accept]
|
||||||
[(is.eq ip6.saddr (cidr netnsCidr6)) accept]
|
[(is.eq ip6.saddr (cidr netCidrs.netns6)) accept]
|
||||||
];
|
];
|
||||||
extraInetEntries = with notnft.dsl; with payload; {
|
extraInetEntries = with notnft.dsl; with payload; {
|
||||||
block4 = add set { type = f: f.ipv4_addr; flags = f: with f; [ interval ]; } [
|
block4 = add set { type = f: f.ipv4_addr; flags = f: with f; [ interval ]; } [
|
||||||
|
@ -488,10 +484,10 @@ in {
|
||||||
protocols = if rule.tcp && rule.udp then notnft.dsl.set [ tcp udp ] else if rule.tcp then tcp else udp;
|
protocols = if rule.tcp && rule.udp then notnft.dsl.set [ tcp udp ] else if rule.tcp then tcp else udp;
|
||||||
rule4 = rule.target4; rule6 = rule.target6;
|
rule4 = rule.target4; rule6 = rule.target6;
|
||||||
in with notnft.dsl; with payload;
|
in with notnft.dsl; with payload;
|
||||||
lib.optionals (rule4 != null && rule4.address != gatewayAddr4) [
|
lib.optionals (rule4 != null) [
|
||||||
[ (is.eq meta.iifname "br0") (is.eq ip.protocol protocols) (is.eq ip.saddr rule4.address)
|
[ (is.eq meta.iifname "br0") (is.eq ip.protocol protocols) (is.eq ip.saddr rule4.address)
|
||||||
(is.eq th.sport (if rule4.port != null then rule4.port else rule.port)) (mangle meta.mark wan_table) ]
|
(is.eq th.sport (if rule4.port != null then rule4.port else rule.port)) (mangle meta.mark wan_table) ]
|
||||||
] ++ lib.optionals (rule6 != null && rule6.address != gatewayAddr6) [
|
] ++ lib.optionals (rule6 != null) [
|
||||||
[ (is.eq meta.iifname "br0") (is.eq ip6.nexthdr protocols) (is.eq ip6.saddr rule6.address)
|
[ (is.eq meta.iifname "br0") (is.eq ip6.nexthdr protocols) (is.eq ip6.saddr rule6.address)
|
||||||
(is.eq th.sport (if rule6.port != null then rule6.port else rule.port)) (mangle meta.mark wan_table) ]
|
(is.eq th.sport (if rule6.port != null then rule6.port else rule.port)) (mangle meta.mark wan_table) ]
|
||||||
])
|
])
|
||||||
|
@ -503,10 +499,10 @@ in {
|
||||||
protocols = if rule.tcp && rule.udp then notnft.dsl.set [ tcp udp ] else if rule.tcp then tcp else udp;
|
protocols = if rule.tcp && rule.udp then notnft.dsl.set [ tcp udp ] else if rule.tcp then tcp else udp;
|
||||||
rule4 = rule.target4; rule6 = rule.target6;
|
rule4 = rule.target4; rule6 = rule.target6;
|
||||||
in with notnft.dsl; with payload;
|
in with notnft.dsl; with payload;
|
||||||
lib.optionals (rule4 != null && rule4.address != gatewayAddr4) [
|
lib.optionals (rule4 != null) [
|
||||||
[ (is ct.status (f: f.dnat)) (is.eq meta.iifname "br0") (is.eq ip.protocol protocols) (is.eq ip.saddr rule4.address)
|
[ (is ct.status (f: f.dnat)) (is.eq meta.iifname "br0") (is.eq ip.protocol protocols) (is.eq ip.saddr rule4.address)
|
||||||
(is.eq th.sport (if rule4.port != null then rule4.port else rule.port)) (mangle meta.mark vpn_table) ]
|
(is.eq th.sport (if rule4.port != null then rule4.port else rule.port)) (mangle meta.mark vpn_table) ]
|
||||||
] ++ lib.optionals (rule6 != null && rule6.address != gatewayAddr6) [
|
] ++ lib.optionals (rule6 != null) [
|
||||||
[ (is ct.status (f: f.dnat)) (is.eq meta.iifname "br0") (is.eq ip6.protocol protocols) (is.eq ip6.saddr rule6.address)
|
[ (is ct.status (f: f.dnat)) (is.eq meta.iifname "br0") (is.eq ip6.protocol protocols) (is.eq ip6.saddr rule6.address)
|
||||||
(is.eq th.sport (if rule6.port != null then rule6.port else rule.port)) (mangle meta.mark vpn_table) ]
|
(is.eq th.sport (if rule6.port != null then rule6.port else rule.port)) (mangle meta.mark vpn_table) ]
|
||||||
])
|
])
|
||||||
|
@ -518,8 +514,8 @@ in {
|
||||||
# instead of debugging that, simply change the approach
|
# instead of debugging that, simply change the approach
|
||||||
# [(is.eq ip.saddr vacuumAddress4) (is.ne ip.daddr) (mangle meta.mark iot_table)]
|
# [(is.eq ip.saddr vacuumAddress4) (is.ne ip.daddr) (mangle meta.mark iot_table)]
|
||||||
# [(is.eq ether.saddr cfg.vacuumMac) (mangle meta.mark iot_table)]
|
# [(is.eq ether.saddr cfg.vacuumMac) (mangle meta.mark iot_table)]
|
||||||
[(is.eq ether.saddr cfg.vacuumMac) (is.ne ip.daddr (cidr netCidr4)) (is.ne ip.daddr "@allow_iot4") (log "iot4 ") drop]
|
[(is.eq ether.saddr cfg.vacuumMac) (is.ne ip.daddr (cidr netCidrs.lan4)) (is.ne ip.daddr "@allow_iot4") (log "iot4 ") drop]
|
||||||
[(is.eq ether.saddr cfg.vacuumMac) (is.ne ip6.daddr (cidr netCidr6)) (is.ne ip6.daddr "@allow_iot6") (log "iot6 ") drop]
|
[(is.eq ether.saddr cfg.vacuumMac) (is.ne ip6.daddr (cidr netCidrs.lan6)) (is.ne ip6.daddr "@allow_iot6") (log "iot6 ") drop]
|
||||||
[(mangle ct.mark meta.mark)]
|
[(mangle ct.mark meta.mark)]
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
@ -533,17 +529,17 @@ in {
|
||||||
# (and vice versa)
|
# (and vice versa)
|
||||||
router.veths.veth-wan-a.peerName = "veth-wan-b";
|
router.veths.veth-wan-a.peerName = "veth-wan-b";
|
||||||
router.interfaces.veth-wan-a = {
|
router.interfaces.veth-wan-a = {
|
||||||
ipv4.addresses = [ netnsParsedCidr4 ];
|
ipv4.addresses = [ netParsedCidrs.netns4 ];
|
||||||
ipv6.addresses = [ netnsParsedCidr6 ];
|
ipv6.addresses = [ netParsedCidrs.netns6 ];
|
||||||
ipv4.routes = [
|
ipv4.routes = [
|
||||||
# default config duplicated for wan_table
|
# default config duplicated for wan_table
|
||||||
{ extraArgs = [ netnsCidr4 "dev" "veth-wan-a" "proto" "kernel" "scope" "link" "src" mainNetnsAddr4 "table" wan_table ]; }
|
{ extraArgs = [ netCidrs.netns4 "dev" "veth-wan-a" "proto" "kernel" "scope" "link" "src" netAddresses.netns4 "table" wan_table ]; }
|
||||||
# default all traffic to wan in wan_table
|
# default all traffic to wan in wan_table
|
||||||
{ extraArgs = [ "default" "via" wanNetnsAddr4 "table" wan_table ]; }
|
{ extraArgs = [ "default" "via" wanNetnsAddr4 "table" wan_table ]; }
|
||||||
];
|
];
|
||||||
ipv6.routes = [
|
ipv6.routes = [
|
||||||
# default config duplicated for wan_table
|
# default config duplicated for wan_table
|
||||||
{ extraArgs = [ netnsCidr6 "dev" "veth-wan-a" "proto" "kernel" "metric" "256" "pref" "medium" "table" wan_table ]; }
|
{ extraArgs = [ netCidrs.netns6 "dev" "veth-wan-a" "proto" "kernel" "metric" "256" "pref" "medium" "table" wan_table ]; }
|
||||||
# default all traffic to wan in wan_table
|
# default all traffic to wan in wan_table
|
||||||
{ extraArgs = [ "default" "via" wanNetnsAddr6 "table" wan_table ]; }
|
{ extraArgs = [ "default" "via" wanNetnsAddr6 "table" wan_table ]; }
|
||||||
];
|
];
|
||||||
|
@ -552,18 +548,18 @@ in {
|
||||||
networkNamespace = "wan";
|
networkNamespace = "wan";
|
||||||
ipv4.addresses = [ {
|
ipv4.addresses = [ {
|
||||||
address = wanNetnsAddr4;
|
address = wanNetnsAddr4;
|
||||||
inherit (netnsParsedCidr4) prefixLength;
|
inherit (netParsedCidrs.netns4) prefixLength;
|
||||||
} ];
|
} ];
|
||||||
ipv6.addresses = [ {
|
ipv6.addresses = [ {
|
||||||
address = wanNetnsAddr6;
|
address = wanNetnsAddr6;
|
||||||
inherit (netnsParsedCidr6) prefixLength;
|
inherit (netParsedCidrs.netns6) prefixLength;
|
||||||
} ];
|
} ];
|
||||||
# allow wan->default namespace communication
|
# allow wan->default namespace communication
|
||||||
ipv4.routes = [
|
ipv4.routes = [
|
||||||
{ extraArgs = [ netCidr4 "via" mainNetnsAddr4 ]; }
|
{ extraArgs = [ netCidrs.lan4 "via" netAddresses.netns4 ]; }
|
||||||
];
|
];
|
||||||
ipv6.routes = [
|
ipv6.routes = [
|
||||||
{ extraArgs = [ netCidr6 "via" mainNetnsAddr6 ]; }
|
{ extraArgs = [ netCidrs.lan6 "via" netAddresses.netns6 ]; }
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
router.networkNamespaces.wan = {
|
router.networkNamespaces.wan = {
|
||||||
|
@ -600,10 +596,10 @@ in {
|
||||||
protocols = if rule.tcp && rule.udp then notnft.dsl.set [ tcp udp ] else if rule.tcp then tcp else udp;
|
protocols = if rule.tcp && rule.udp then notnft.dsl.set [ tcp udp ] else if rule.tcp then tcp else udp;
|
||||||
rule4 = rule.target4; rule6 = rule.target6;
|
rule4 = rule.target4; rule6 = rule.target6;
|
||||||
in with notnft.dsl; with payload;
|
in with notnft.dsl; with payload;
|
||||||
lib.optionals (rule4 != null && rule4.address == gatewayAddr4) [
|
lib.optionals (rule4 != null) [
|
||||||
[ (is.eq meta.iifname "wan") (is.eq meta.oifname "veth-wan-b") (is.eq ip.protocol protocols)
|
[ (is.eq meta.iifname "wan") (is.eq meta.oifname "veth-wan-b") (is.eq ip.protocol protocols)
|
||||||
(is.eq th.dport (if rule4.port != null then rule4.port else rule.port)) (is.eq ip.daddr rule4.address) masquerade ]
|
(is.eq th.dport (if rule4.port != null then rule4.port else rule.port)) (is.eq ip.daddr rule4.address) masquerade ]
|
||||||
] ++ lib.optionals (rule6 != null && rule6.address == gatewayAddr6) [
|
] ++ lib.optionals (rule6 != null) [
|
||||||
[ (is.eq meta.iifname "wan") (is.eq meta.oifname "veth-wan-b") (is.eq ip6.nexthdr protocols)
|
[ (is.eq meta.iifname "wan") (is.eq meta.oifname "veth-wan-b") (is.eq ip6.nexthdr protocols)
|
||||||
(is.eq th.dport (if rule6.port != null then rule6.port else rule.port)) (is.eq ip6.daddr rule6.address) masquerade ]
|
(is.eq th.dport (if rule6.port != null then rule6.port else rule.port)) (is.eq ip6.daddr rule6.address) masquerade ]
|
||||||
])
|
])
|
||||||
|
@ -637,7 +633,7 @@ in {
|
||||||
# use main netns's address instead of 127.0.0.1
|
# use main netns's address instead of 127.0.0.1
|
||||||
# this ensures all network namespaces can access it
|
# this ensures all network namespaces can access it
|
||||||
networking.resolvconf.extraConfig = ''
|
networking.resolvconf.extraConfig = ''
|
||||||
name_servers="${mainNetnsAddr4} ${mainNetnsAddr6}"
|
name_servers="${netAddresses.netns4} ${netAddresses.netns6}"
|
||||||
'';
|
'';
|
||||||
users.users.${config.common.mainUsername}.extraGroups = [ config.services.unbound.group ];
|
users.users.${config.common.mainUsername}.extraGroups = [ config.services.unbound.group ];
|
||||||
services.unbound = {
|
services.unbound = {
|
||||||
|
@ -645,15 +641,15 @@ in {
|
||||||
package = pkgs.unbound-with-systemd.override {
|
package = pkgs.unbound-with-systemd.override {
|
||||||
stdenv = pkgs.ccacheStdenv;
|
stdenv = pkgs.ccacheStdenv;
|
||||||
withPythonModule = true;
|
withPythonModule = true;
|
||||||
python = unbound-python;
|
python = pkgs.python3;
|
||||||
};
|
};
|
||||||
localControlSocketPath = "/run/unbound/unbound.ctl";
|
localControlSocketPath = "/run/unbound/unbound.ctl";
|
||||||
# we override resolvconf above manually
|
# we override resolvconf above manually
|
||||||
resolveLocalQueries = false;
|
resolveLocalQueries = false;
|
||||||
settings = {
|
settings = {
|
||||||
server = {
|
server = {
|
||||||
interface = [ mainNetnsAddr4 mainNetnsAddr6 gatewayAddr4 gatewayAddr6 ];
|
interface = [ netAddresses.netns4 netAddresses.netns6 netAddresses.lan4 netAddresses.lan6 ];
|
||||||
access-control = [ "${netnsCidr4} allow" "${netnsCidr6} allow" "${netCidr4} allow" "${netCidr6} allow" ];
|
access-control = [ "${netCidrs.netns4} allow" "${netCidrs.netns6} allow" "${netCidrs.lan4} allow" "${netCidrs.lan6} allow" ];
|
||||||
aggressive-nsec = true;
|
aggressive-nsec = true;
|
||||||
do-ip6 = true;
|
do-ip6 = true;
|
||||||
module-config = ''"validator python iterator"'';
|
module-config = ''"validator python iterator"'';
|
||||||
|
@ -682,7 +678,10 @@ in {
|
||||||
networking.hosts."${serverAddress4}" = hosted-domains;
|
networking.hosts."${serverAddress4}" = hosted-domains;
|
||||||
networking.hosts."${serverAddress6}" = hosted-domains;
|
networking.hosts."${serverAddress6}" = hosted-domains;
|
||||||
systemd.services.unbound = lib.mkIf config.services.unbound.enable {
|
systemd.services.unbound = lib.mkIf config.services.unbound.enable {
|
||||||
environment.PYTHONPATH = "${unbound-python}/${unbound-python.sitePackages}";
|
environment.PYTHONPATH = let
|
||||||
|
unbound-python = pkgs.python3.withPackages (ps: with ps; [ pydbus dnspython requests pytricia nftables ]);
|
||||||
|
in
|
||||||
|
"${unbound-python}/${unbound-python.sitePackages}";
|
||||||
environment.MDNS_ACCEPT_NAMES = "^.*\\.local\\.$";
|
environment.MDNS_ACCEPT_NAMES = "^.*\\.local\\.$";
|
||||||
# load vpn_domains.json and vpn_ips.json, as well as unvpn_domains.json and unvpn_ips.json
|
# load vpn_domains.json and vpn_ips.json, as well as unvpn_domains.json and unvpn_ips.json
|
||||||
# resolve domains and append it to ips and add it to the nftables sets
|
# resolve domains and append it to ips and add it to the nftables sets
|
||||||
|
@ -738,7 +737,7 @@ in {
|
||||||
|
|
||||||
services.printing = {
|
services.printing = {
|
||||||
enable = true;
|
enable = true;
|
||||||
allowFrom = [ "localhost" netCidr4 netCidr6 ];
|
allowFrom = [ "localhost" netCidrs.lan4 netCidrs.lan6 ];
|
||||||
browsing = true;
|
browsing = true;
|
||||||
clientConf = ''
|
clientConf = ''
|
||||||
ServerName router.local
|
ServerName router.local
|
||||||
|
@ -761,6 +760,11 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
services.iperf3 = {
|
||||||
|
enable = true;
|
||||||
|
bind = netAddresses.lan4;
|
||||||
|
};
|
||||||
|
|
||||||
# it takes a stupidly long time when done via qemu
|
# it takes a stupidly long time when done via qemu
|
||||||
# (also it's supposed to be disabled by default but it was enabled for me, why?)
|
# (also it's supposed to be disabled by default but it was enabled for me, why?)
|
||||||
documentation.man.generateCaches = false;
|
documentation.man.generateCaches = false;
|
||||||
|
|
Loading…
Reference in a new issue