summaryrefslogtreecommitdiff
path: root/hosts/vidhar/network/pppoe/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'hosts/vidhar/network/pppoe/default.nix')
-rw-r--r--hosts/vidhar/network/pppoe/default.nix184
1 files changed, 184 insertions, 0 deletions
diff --git a/hosts/vidhar/network/pppoe/default.nix b/hosts/vidhar/network/pppoe/default.nix
new file mode 100644
index 00000000..309e1734
--- /dev/null
+++ b/hosts/vidhar/network/pppoe/default.nix
@@ -0,0 +1,184 @@
1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 inherit (config.networking) pppInterface;
7in {
8 options = {
9 networking.pppInterface = mkOption {
10 type = types.str;
11 default = "ppp";
12 };
13 };
14
15 config = {
16 networking.vlans = {
17 pppoe = {
18 id = 7;
19 interface = "eno2";
20 };
21 };
22
23 services.pppd = {
24 enable = true;
25 package = pkgs.ppp.overrideAttrs (oldAttrs: {
26 patches = [
27 ./no-double-timeout.patch
28 ] ++ (oldAttrs.patches or []);
29 });
30 peers = {
31 o2.config = ''
32 user DSL0004874856014@s93.bbi-o2.de
33 '';
34 };
35 };
36 systemd.services."pppd-o2" = {
37 stopIfChanged = true;
38
39 restartTriggers = with config; [
40 environment.etc."ppp/pap-secrets".source
41 environment.etc."ppp/options".source
42 environment.etc."ppp/ip-pre-up".source
43 environment.etc."ppp/ip-up".source
44 environment.etc."ppp/ip-down".source
45 ];
46
47 serviceConfig = {
48 LoadCredential = [
49 "password:${config.sops.secrets."o2-password".path}"
50 ];
51
52 RestartSec = lib.mkForce "50ms";
53 RestartMaxDelaySec = "5s";
54 RestartSteps = 4;
55 StartLimitBurst = 10;
56
57 ProtectHome = lib.mkForce "tmpfs";
58 };
59
60 bindsTo = [ "sys-subsystem-net-devices-pppoe.device" ];
61 after = [ "sys-subsystem-net-devices-pppoe.device" ];
62 };
63 systemd.services."reset-failed-pppd-o2" = {
64 serviceConfig = {
65 Type = "oneshot";
66 ExecStart = "${lib.getExe' config.systemd.package "systemctl"} reset-failed pppd-o2.service";
67 };
68 };
69 systemd.timers."reset-failed-pppd-o2" = {
70 wantedBy = ["pppd-o2.service"];
71 after = ["pppd-o2.service"];
72 bindsTo = ["pppd-o2.service"];
73 timerConfig = {
74 OnActiveSec = "30s";
75 RemainAfterElapse = false;
76 };
77 };
78 sops.secrets."o2-password" = {
79 format = "binary";
80 sopsFile = ./o2-password;
81 };
82
83 environment.etc = {
84 "ppp/options".text = ''
85 nodefaultroute
86 ifname ${pppInterface}
87 lcp-echo-adaptive
88 lcp-echo-failure 10
89 lcp-echo-interval 1
90 maxfail 0
91 mtu 1492
92 mru 1492
93 plugin pppoe.so
94 pppoe-padi-timeout 1
95 pppoe-padi-attempts 10
96 nic-pppoe
97 debug
98 +ipv6
99 '';
100 "ppp/pap-secrets" = {
101 mode = "0400";
102 text = ''
103 DSL0004874856014@s93.bbi-o2.de * @/run/credentials/pppd-o2.service/password *
104 '';
105 };
106 "ppp/ip-pre-up".source = pkgs.resholve.writeScript "ip-pre-up" {
107 interpreter = pkgs.runtimeShell;
108 inputs = [ pkgs.iproute2 pkgs.ethtool ];
109 execer = [
110 "cannot:${lib.getExe' pkgs.iproute2 "ip"}"
111 "cannot:${lib.getExe' pkgs.iproute2 "tc"}"
112 ];
113 } ''
114 ethtool -K pppoe tso off gso off gro off
115
116 ip link del "ifb4$1" || true
117 ip link add name "ifb4$1" type ifb
118 ip link set "ifb4$1" up
119
120 tc qdisc del dev "ifb4$1" root || true
121 tc qdisc del dev "$1" ingress || true
122 tc qdisc del dev "$1" root || true
123
124 tc qdisc add dev "$1" handle ffff: ingress
125 tc filter add dev "$1" parent ffff: basic action ctinfo dscp 0x0000003f 0x00000040 action mirred egress redirect dev "ifb4$1"
126 tc qdisc replace dev "ifb4$1" root cake memlimit 128Mb pppoe-ptm nat diffserv4 ingress rtt 15ms bandwidth 140mbit
127 tc qdisc replace dev "$1" root cake memlimit 128Mb pppoe-ptm nat diffserv4 wash rtt 15ms bandwidth 32.5mbit
128 '';
129 "ppp/ip-up".source = pkgs.resholve.writeScript "ip-up" {
130 interpreter = pkgs.runtimeShell;
131 inputs = [ pkgs.iproute2 ];
132 execer = [ "cannot:${lib.getExe' pkgs.iproute2 "ip"}" ];
133 } ''
134 ip addr add "$4" peer "$5"/32 dev "$1"
135 ip route add default dev "$1" metric 512
136 '';
137 "ppp/ip-down".source = pkgs.resholve.writeScript "ip-down" {
138 interpreter = pkgs.runtimeShell;
139 inputs = [ pkgs.iproute2 ];
140 execer = [ "cannot:${lib.getExe' pkgs.iproute2 "ip"}" ];
141 } ''
142 ip link del "ifb4$1"
143 '';
144 };
145
146 systemd.package = pkgs.systemd.overrideAttrs (oldAttrs: {
147 patches = (oldAttrs.patches or []) ++ [
148 (pkgs.fetchpatch {
149 url = "https://github.com/sysedwinistrator/systemd/commit/b9691a43551739ddacdb8d53a4312964c3ddfa08.patch";
150 hash = "sha256-TLfOTFodLzCVywnF4Xp4BR2Pja0Qq4ItE/yaKkzI414=";
151 })
152 ];
153 });
154
155 systemd.network.networks = {
156 "40-${pppInterface}" = {
157 matchConfig.Name = pppInterface;
158 dns = [ "::1" "127.0.0.1" ];
159 domains = [ "~." ];
160 networkConfig = {
161 DHCP = true;
162 DNSSEC = true;
163 };
164 dhcpV6Config = {
165 PrefixDelegationHint = "::/64";
166 WithoutRA = "solicit";
167 };
168 };
169 };
170
171 boot.kernelModules = [ "ifb" ];
172 boot.kernel.sysctl = {
173 "net.ipv6.conf.all.forwarding" = true;
174 "net.ipv6.conf.default.forwarding" = true;
175 "net.ipv4.conf.all.forwarding" = true;
176 "net.ipv4.conf.default.forwarding" = true;
177
178 "net.ipv4.tcp_ecn" = 1;
179
180 "net.core.rmem_max" = 4194304;
181 "net.core.wmem_max" = 4194304;
182 };
183 };
184}