example config for ppoe router
hard cases make bad law
This commit is contained in:
parent
c37332910a
commit
fe1b33f307
2 changed files with 231 additions and 0 deletions
16
nat.nft
Normal file
16
nat.nft
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/usr/bin/nft -f
|
||||||
|
|
||||||
|
flush ruleset
|
||||||
|
|
||||||
|
table ip nat {
|
||||||
|
chain prerouting {
|
||||||
|
type nat hook prerouting priority 0; policy accept;
|
||||||
|
}
|
||||||
|
|
||||||
|
# for all packets to WAN, after routing, replace source address with primary IP of WAN interface
|
||||||
|
chain postrouting {
|
||||||
|
type nat hook postrouting priority 100; policy accept;
|
||||||
|
oifname "ppp0" masquerade
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
215
rotuer.nix
Normal file
215
rotuer.nix
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
# This is not part of Liminix per se. This is my "scratchpad"
|
||||||
|
# configuration for the device I'm testing with.
|
||||||
|
#
|
||||||
|
# Parts of it do do things that Liminix eventually needs to do, but
|
||||||
|
# don't look in here for solutions - just for identifying the
|
||||||
|
# problems.
|
||||||
|
|
||||||
|
|
||||||
|
{ config, pkgs, lib, ... } :
|
||||||
|
let
|
||||||
|
secrets = import ./rotuer-secrets.nix;
|
||||||
|
inherit (pkgs.liminix.networking)
|
||||||
|
address
|
||||||
|
bridge
|
||||||
|
dnsmasq
|
||||||
|
hostapd
|
||||||
|
interface
|
||||||
|
pppoe
|
||||||
|
route;
|
||||||
|
inherit (pkgs.liminix.services) oneshot longrun bundle target;
|
||||||
|
inherit (pkgs)
|
||||||
|
waitup
|
||||||
|
serviceFns
|
||||||
|
iptables;
|
||||||
|
in rec {
|
||||||
|
services.loopback =
|
||||||
|
let iface = interface { type = "loopback"; device = "lo";};
|
||||||
|
in bundle {
|
||||||
|
name = "loopback";
|
||||||
|
contents = [
|
||||||
|
(address iface { family = "inet4"; address ="127.0.0.1"; prefixLength = 8;})
|
||||||
|
(address iface { family = "inet6"; address ="::1"; prefixLength = 128;})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
tftp = {
|
||||||
|
enable = true;
|
||||||
|
serverip = "10.0.0.1";
|
||||||
|
ipaddr = "10.0.0.8";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
./modules/wlan.nix
|
||||||
|
./modules/phram.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
kernel = {
|
||||||
|
config = {
|
||||||
|
PPP = "y";
|
||||||
|
PPP_BSDCOMP = "y";
|
||||||
|
PPP_DEFLATE = "y";
|
||||||
|
PPP_ASYNC = "y";
|
||||||
|
PPP_SYNC_TTY = "y";
|
||||||
|
BRIDGE = "y";
|
||||||
|
|
||||||
|
NETFILTER_XT_MATCH_CONNTRACK = "y";
|
||||||
|
|
||||||
|
IP6_NF_IPTABLES= "y";
|
||||||
|
IP_NF_IPTABLES= "y";
|
||||||
|
IP_NF_NAT = "y";
|
||||||
|
IP_NF_TARGET_MASQUERADE = "y";
|
||||||
|
NETFILTER = "y";
|
||||||
|
NETFILTER_ADVANCED = "y";
|
||||||
|
NETFILTER_XTABLES = "y";
|
||||||
|
|
||||||
|
NFT_COMPAT = "y";
|
||||||
|
NFT_CT = "y";
|
||||||
|
NFT_LOG = "y";
|
||||||
|
NFT_MASQ = "y";
|
||||||
|
NFT_NAT = "y";
|
||||||
|
NFT_REJECT = "y";
|
||||||
|
NFT_REJECT_INET = "y";
|
||||||
|
|
||||||
|
NF_CONNTRACK = "y";
|
||||||
|
NF_NAT = "y";
|
||||||
|
NF_NAT_MASQUERADE = "y";
|
||||||
|
NF_TABLES= "y";
|
||||||
|
NF_TABLES_INET = "y";
|
||||||
|
NF_TABLES_IPV4 = "y";
|
||||||
|
NF_TABLES_IPV6 = "y";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.lan =
|
||||||
|
let iface = interface {
|
||||||
|
type = "bridge";
|
||||||
|
device = "lan";
|
||||||
|
};
|
||||||
|
in address iface {
|
||||||
|
family = "inet4"; address ="10.8.0.1"; prefixLength = 16;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.wireless = interface {
|
||||||
|
type = "hardware";
|
||||||
|
device = "wlan0";
|
||||||
|
dependencies = [ config.services.wlan_module ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.wired = interface {
|
||||||
|
type = "hardware";
|
||||||
|
device = "eth0";
|
||||||
|
primary = services.lan;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.hostap = hostapd (services.wireless) {
|
||||||
|
params = {
|
||||||
|
ssid = "liminix";
|
||||||
|
country_code = "GB";
|
||||||
|
hw_mode="g";
|
||||||
|
channel = "2";
|
||||||
|
wmm_enabled = 1;
|
||||||
|
ieee80211n = 1;
|
||||||
|
inherit (secrets) wpa_passphrase;
|
||||||
|
auth_algs = 1; # 1=wpa2, 2=wep, 3=both
|
||||||
|
wpa = 2; # 1=wpa, 2=wpa2, 3=both
|
||||||
|
wpa_key_mgmt = "WPA-PSK";
|
||||||
|
wpa_pairwise = "TKIP CCMP"; # auth for wpa (may not need this?)
|
||||||
|
rsn_pairwise = "CCMP"; # auth for wpa2
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.bridgewlan =
|
||||||
|
let waitup-wlan = longrun {
|
||||||
|
name = "waitup-wlan0";
|
||||||
|
run = "${waitup}/bin/waitup wlan0 10";
|
||||||
|
notification-fd = 10;
|
||||||
|
dependencies = [ services.wireless services.hostap ];
|
||||||
|
};
|
||||||
|
in oneshot {
|
||||||
|
name = "add-wlan-to-bridge";
|
||||||
|
up = "ip link set dev ${services.wireless.device} master ${services.lan.device}";
|
||||||
|
down = "ip link set dev ${services.wireless.device} nomaster";
|
||||||
|
dependencies = [ waitup-wlan ];
|
||||||
|
};
|
||||||
|
|
||||||
|
users.dnsmasq = {
|
||||||
|
uid = 51; gid= 51; gecos = "DNS/DHCP service user";
|
||||||
|
dir = "/run/dnsmasq";
|
||||||
|
shell = "/bin/false";
|
||||||
|
};
|
||||||
|
groups.dnsmasq = {
|
||||||
|
gid = 51; usernames = ["dnsmasq"];
|
||||||
|
};
|
||||||
|
groups.system.usernames = ["dnsmasq"];
|
||||||
|
|
||||||
|
services.dns =
|
||||||
|
dnsmasq {
|
||||||
|
resolvconf = services.resolvconf;
|
||||||
|
interface = services.lan;
|
||||||
|
ranges = ["10.8.0.10,10.8.0.240"];
|
||||||
|
domain = "fake.liminix.org";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.wan =
|
||||||
|
let iface = interface { type = "hardware"; device = "eth1"; };
|
||||||
|
in pppoe iface {
|
||||||
|
ppp-options = [
|
||||||
|
"debug" "+ipv6" "noauth"
|
||||||
|
"name" secrets.l2tp.name
|
||||||
|
"password" secrets.l2tp.password
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.resolvconf = oneshot rec {
|
||||||
|
dependencies = [ services.wan ];
|
||||||
|
name = "resolvconf";
|
||||||
|
up = ''
|
||||||
|
. ${serviceFns}
|
||||||
|
( cd `mkoutputs ${name}`; umask 0027
|
||||||
|
echo "nameserver $(output ${services.wan} ns1)" > resolv.conf
|
||||||
|
echo "nameserver $(output ${services.wan} ns2)" >> resolv.conf
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
down = ''
|
||||||
|
rm -rf /run/service-state/${name}/
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.defaultroute4 = route {
|
||||||
|
name = "defaultroute";
|
||||||
|
via = "$(output ${services.wan} address)";
|
||||||
|
target = "default";
|
||||||
|
dependencies = [ services.wan ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.packet_forwarding =
|
||||||
|
let filename = "/proc/sys/net/ipv4/conf/all/forwarding";
|
||||||
|
in oneshot {
|
||||||
|
name = "let-the-ip-flow";
|
||||||
|
up = ''
|
||||||
|
${pkgs.nftables}/bin/nft -f ${./nat.nft}
|
||||||
|
echo 1 > ${filename}
|
||||||
|
'';
|
||||||
|
down = "echo 0 > ${filename}";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.default = target {
|
||||||
|
name = "default";
|
||||||
|
contents = with services; [
|
||||||
|
loopback
|
||||||
|
wired
|
||||||
|
wireless
|
||||||
|
lan
|
||||||
|
hostap
|
||||||
|
defaultroute4
|
||||||
|
packet_forwarding
|
||||||
|
dns
|
||||||
|
bridgewlan
|
||||||
|
resolvconf
|
||||||
|
];
|
||||||
|
};
|
||||||
|
defaultProfile.packages = with pkgs; [ nftables strace tcpdump ] ;
|
||||||
|
}
|
Loading…
Reference in a new issue