# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).


# The loopback network interface
auto lo
iface lo inet loopback


# -> LAN
auto br0
iface br0 inet static
        address 192.168.0.1/24

	# Use the br0 for loading the iptables rules.
	# This ensures that the firewall rules are added
	# before any of the physical interfaces are brought
	# up and the rules are removed after all the physical
	# interfaces are brought down.
	# Man page of ifup(8) claims that the "ifdown -a" brings
	# the interfaces down in the order in which they are
	# currently listed in the state file(/run/network/ifstate),
	# but this seems to be a bug:
	# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1033651
	#
	# Worthwhile notes about iptables rules:
	#
	#  * dhclient in DHCPv4 mode uses raw sockets(fallback UDP
	#    socket for sending unicast packets is also opened) and
	#    thus no firewall rule is needed
	#
	#  * important ICMP messages like "frag needed" or
	#    "TTL exceeded" are accepted thanks to conntrack
	#    "RELATED" state match
	#
	#  * certain ICMP messages sent by the router including
	#    "Echo Reply" or "Destination Unreachable" are rate
	#    limited by adjusting the kernel parameters in
	#    /etc/sysctl.conf
	#
	#  * recent(used in SSH chain) module internals are seen
	#    in the /proc/net/xt_recent/SSH file
	#
	#  * while igmpproxy is using raw sockets on the downstream
	#    interface, then in regard to upstream interface the
	#    igmpproxy simply acts as a normal multicast client(calls
	#    setsockopt() with IP_ADD_MEMBERSHIP) and thus there is a
	#    need to accept IGMP membership query messages sent by ISP.
	#    This also means that the IPTV UDP datagrams are sent
	#    towards the router application layer and dropped in the
	#    filter table INPUT chain.
	#
	#  * IGMP messages can not be tracked by the conntrack module.
	#    At least without an helper module. IGMP messages are sent
	#    to IPv4 multicast address and thus the conntrack module
	#    expects a reply sourced from a multicast address in order
	#    to move from UNREPLIED state to ESTABLISHED state. However,
	#    the multicast address is never used as a src IP.
	#
	#  * igmpproxy subscribes to 224.0.0.2(IGMP "Leave group" messages)
	#    on a downstream interface and packets sent to this address
	#    are subject to INPUT chain rules. That's the reason for
	#    "-A INPUT -d 224.0.0.2/32 -i br0 -p igmp -j ACCEPT" rule. Details
	#    are in https://marc.info/?l=netfilter&m=168393431101974&w=2
	#
	pre-up iptables-restore /usr/local/etc/IPv4_fw_rules

	# Consider stray TCP packets with ACK flag set as
	# INVALID. By default, such packets would create
	# a NEW connection.
	# "nf_conntrack_tcp_loose" is configured here instead
	# of /etc/sysctl.conf because the nf_conntrack module
	# is not yet loaded at the time the systemd-sysctl
	# service is run.
	pre-up sysctl -w net.netfilter.nf_conntrack_tcp_loose=0

	# Set the MAC address manually. This ensures that the MAC address
	# of br0 will not change when bridge ports are added or removed.
	# This will avoid problems like hostapd adding the WNIC to bridge,
	# causing the bridge MAC address change and thus breaking the
	# dnsmasq if br0 flaps as the dnsmasq is bound to IPv6 link-local
	# address derived from the old MAC address of the br0 bridge.
	post-up ip link set dev $IFACE address 02:a7:29:a6:ec:61

	post-down iptables-restore /usr/local/etc/IPv4_default_fw_rules

	# "bridge_ports" requires "bridge-utils" package.
        bridge_ports lan0 lan1 lan2 lan3

iface br0 inet6 manual
	# Worthwhile notes about ip6tables rules:
	#
	#  * dhclient in DHCPv6 mode is able to use ordinary UDP sockets
	#    thanks to link-local addresses and does not need to use
	#    raw sockets. This means that a firewall rule for DHCPv6
	#    traffic is needed.
	#
	#  * ICMP6 "echo request" messages are rate limited by the
	#    limit module. Newer kernel versions have the net.ipv6.icmp.ratemask
	#    which would allow to rate limit the replies to "echo request"
	#    messages by adjusting the net.ipv6.icmp.ratelimit.
	#    ICMP6 "destination unreachable" messages are rate limited
	#    according to net.ipv6.icmp.ratelimit.
	#
	#  * important ICMP6 messages like "packet too big" or
	#    "time exceeded" or "destination unreachable" are
	#    accepted thanks to conntrack "RELATED" state match
	#
	#  * RA messages sent by radvd to ff02::1 multicast addr
	#    via LAN-facing interface are looped back by the IP
	#    layer for local delivery. This is a default behavior
	#    and can be controlled by IPV6_MULTICAST_LOOP(man 7 ipv6).
	#    Those messages are dropped.
	#
	pre-up ip6tables-restore /usr/local/etc/IPv6_fw_rules
	post-down ip6tables-restore /usr/local/etc/IPv6_default_fw_rules


# -> Telia fiber
auto wan0
iface wan0 inet dhcp
# Telia uses DHCPv6 prefix delegation to assign
# a /56 IPv6 prefix. Default route is installed
# thanks to NDP Router Advertisement messages
# and it points to VRRPv3 link-local address.
iface wan0 inet6 auto

	# Stateless DHCPv6. dhclient will be started
	# with "-P"(enable IPv6 prefix delegation) and
	# without "-N"(normal address query for IPv6),
	# i.e IPv6 address is not requested from DHCPv6
	# server.
	dhcp 1
	request_prefix 1

        # Enabling packet forwarding for IPv6(net.ipv6.conf.all.forwarding=1)
        # in /etc/sysctl.conf sets the "net.ipv6.conf.<int>.forwarding" values
	# to 1 which means that Router Solicitation messages are no longer sent
        # and Router Advertisements messages are no longer accepted on those
        # interfaces. "net.ipv6.conf.<int>.forwarding" value has nothing
        # to do with controlling the per-interface forwarding like it does
        # in case of IPv4. The "accept_ra 2"(net.ipv6.conf.wan0.accept_ra=2)
        # means that Router Solicitations are sent and Router Advertisements
        # are accepted despite the fact that "net.ipv6.conf.<int>.forwarding" is 1.
        # Documentation: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
	accept_ra 2

# Mgnt network for Huawei MA5671A SFP ONT.
# SSH server is reachable at 192.168.1.10.
# User: root
# Password: admin123
#
# Keeping the manually configured IPv4 addr
# on the same interface where the dhclient
# is running works thanks to "get-static-ipv4-addrs"
# and "restore-static-ipv4-addrs" dhclient-script
# enter and exit hooks. An alternative approach
# would be to use a macvlan interface and for
# example keep the static address there while
# dhclient runs on the physical interface.
iface wan0 inet static
	address 192.168.1.200/24


# -> Telia IPTV
auto wan0.4
# IPv6 for wan0.4 is disabled in /etc/sysctl.conf with net.ipv6.conf.wan0/4.disable_ipv6=1
iface wan0.4 inet dhcp


# -> Telia mobile broadband
auto wwan0
# wwan0 is a Telia-branded Huawei E3372s-153(hardware version CL1E3372SM Ver.A)
# LTE modem with 22.x firmware working in Hilink mode having its own DHCP server
# providing addresses from 192.168.8.0/24 network, web interface, performing NAT,
# etc. For the OS it appears as an Ethernet device.
# SIM is from Telia. Huawei E3372s-153 in Hilink mode does not support IPv6, nor
# is IPv6 supported by Telia for the mobile broadband service.
iface wwan0 inet static
	address 192.168.8.200/24
	post-up ip route add default via 192.168.8.1 metric 100
