Dlouho jsem si lámal hlavu, jak nastavit OpenBSD firewall místo firewallu na VDLS modemu a rozběhnout IPv6. Nakonec se to podařilo.

Problém programátorů VDSL modemů je v tom, že vůbec neumožňují na IPv6 spojení dovnitř naší sítě. Například modem Comtrend VR-3026e v2 přidělí IPv6 prefix na svoje LAN rozhraní, ale spojení zvenku dovnitř nejde. U modemu ZTE ZXHN-H267A to funguje. Firewally uvnitř těchto modemů jsou mizerné, občas nejde nastavit něco, co člověk potřebuje. Dále je problém s aktualizacemi modemů. Výrobci na to kašlou. Proto jsem se rozhodl, že firewall bude na malém PC s dvěma síťovkami a operační systém bude OpenBSD, známý svou bezpečností.

Dalším problémem, který jsem musel vyřešit, je ten, že už IPv6 mám od jiného poskytovatele. Budu muset nastavit překlad IPv6 prefixů.

První věc, kterou jsem musel udělat je nastavit modem do režimu bridge. To se dělá pomocí webového rozhraní k modemu. Používám oblíbený modem ZTE ZXHN-H267A. OpenBSD router je ve verzi 7.5.

Dále musím udělat:

  1. Nakonfigurovat WAN rozhraní přes PPPoE

  2. Nakonfigurovat IPv6 DHCP delegaci prefixu (IPv6 PD) na LAN rozhraní

  3. Nastavit Router Advertisement Daemon (RAD) aby propagoval prefixy počítačům v interní síti LAN

Zapojení vypadá takto

IMG 20240417 233627

Zelený kabel je spojka modem router, šedivý kabel je LAN síť.

Konfigurace na rtr8

/etc/hostname.re0 — LAN síť
inet autoconf
/etc/hostname.re1 — směrem k VDSL modemu
up mtu 1500
/etc/hostname.pppoe0 — pppoe k poskytovateli Vodafone
inet 0.0.0.0 255.255.255.255 NONE mtu 1492 pppoedev re1 authproto pap authname 'vdsl' authkey 'vdsl' up (1)
dest 0.0.0.1
inet6 eui64
!/sbin/route add -mpath default -ifp pppoe0 0.0.0.1
!/sbin/route add -inet6 default -ifp pppoe0 fe80::%pppoe0
inet6 autoconf
1 Jako authname a authkey můžeme použít i O2 a O2 pokud se připojujeme k poskytovateli O2 a nebo funguje i cetin a cetin, což by mělo být universální.

OpenBSD poskytuje IPv6 konektivitu přes SLAAC v základním systému, ale nemá v základu DHCPv6 klienta, který by rozuměl delagaci prefixů. V balících je dhcpcd klient od ISC, který to zvládne.

Instalace dhcpcd klienta
# pkg_add dhcpcd
# rcctl enable dhcpcd
# rcctl start dhcpcd
Konfigurace dhcpcd klienta /etc/dhcpcd.conf (IPv6 PD)
# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.

# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel

# Inform the DHCP server of our hostname for DDNS.
#hostname

# Use the hardware address of the interface for the Client ID.
#clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
# Some non-RFC compliant DHCP servers do not reply with this set.
# In this case, comment out duid and enable clientid above.
duid

# Persist interface configuration when dhcpcd exits.
persistent

# vendorclassid is set to blank to avoid sending the default of
# dhcpcd-<version>:<os>:<machine>:<platform>
vendorclassid

# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search
option classless_static_routes
# Respect the network MTU. This is applied to DHCP routes.
option interface_mtu

# Request a hostname from the network
option host_name

# Most distributions have NTP support.
#option ntp_servers

# Rapid commit support.
# Safe to enable by default because it requires the equivalent option set
# on the server to actually work.
option rapid_commit

# A ServerID is required by RFC2131.
require dhcp_server_identifier

# Generate SLAAC address using the Hardware Address of the interface
#slaac hwaddr
# OR generate Stable Private IPv6 Addresses based from the DUID
slaac private

## Pro IPv6
waitip 6
ipv6only
noipv6rs

allowinterfaces pppoe0 re0

interface pppoe0
ipv6rs
iaid 1
ia_pd 2 re0/0/64
Konfigurace Router Advertisement daemona /etc/rad.conf
interface re0 (1)
1 DNS propagaci mi zatím dělá RAD na routeru dizzy, proto je to tady tak jednoduché.

Start dhcpcd klienta je v logu zobrazen takto

cat /var/log/daemon
Apr 17 00:54:32 rtr8 rad[51049]: startup
Apr 17 00:54:33 rtr8 dhcpcd[15485]: dhcpcd-10.0.6 starting
Apr 17 00:54:33 rtr8 dhcpcd[68102]: DUID 00:01:00:01:2d:b1:b1:36:e0:d5:5e:a2:b7:c8
Apr 17 00:54:33 rtr8 dhcpcd[68102]: re0: IAID 5e:a2:b7:c8
Apr 17 00:54:33 rtr8 dhcpcd[68102]: pppoe0: IAID 00:00:00:01
Apr 17 00:54:33 rtr8 dhcpcd[68102]: pppoe0: IA type 25 IAID 00:00:00:02
Apr 17 00:54:33 rtr8 dhcpcd[68102]: pppoe0: rebinding prior DHCPv6 lease
Apr 17 00:54:34 rtr8 dhcpcd[68102]: pppoe0: soliciting an IPv6 router
Apr 17 00:54:36 rtr8 dhcpcd[68102]: pppoe0: REPLY6 received from fe80::427c:7dff:fe93:1231
Apr 17 00:54:36 rtr8 dhcpcd[68102]: pppoe0: 2a00:11b7:301a:4100::/56: no valid lifetime
Apr 17 00:54:36 rtr8 dhcpcd[68102]: pppoe0: renew in 1800, rebind in 2880, expire in 0 seconds
Apr 17 00:54:36 rtr8 dhcpcd[68102]: pppoe0: DHCPv6 lease expired
Apr 17 00:54:37 rtr8 resolvd[47907]: rebuilding: file trunc/write
Apr 17 00:54:38 rtr8 dhcpcd[68102]: pppoe0: ADV 2a00:11b7:301a:4100::/56 from fe80::427c:7dff:fe93:1231
Apr 17 00:54:38 rtr8 dhcpcd[68102]: pppoe0: REPLY6 received from fe80::427c:7dff:fe93:1231
Apr 17 00:54:38 rtr8 dhcpcd[68102]: pppoe0: renew in 1800, rebind in 2880, expire in 86400 seconds
Apr 17 00:54:38 rtr8 dhcpcd[68102]: lo0: adding reject route to 2a00:11b7:301a:4100::/56 via ::1
Apr 17 00:54:38 rtr8 dhcpcd[68102]: pppoe0: delegated prefix 2a00:11b7:301a:4100::/56
Apr 17 00:54:38 rtr8 dhcpcd[68102]: re0: adding address 2a00:11b7:301a:4100::1/64
Apr 17 00:54:38 rtr8 dhcpcd[68102]: re0: adding route to 2a00:11b7:301a:4100::/64
Apr 17 00:54:38 rtr8 dhcpcd[68102]: pppoe0: Router Advertisement from fe80::427c:7dff:fe93:1231
Apr 17 00:54:38 rtr8 dhcpcd[68102]: pppoe0: adding default route via fe80::427c:7dff:fe93:1231
/etc/pf.conf  — nastavení firewallu
#	$OpenBSD: pf.conf,v 1.55 2017/12/03 20:40:04 sthen Exp $
#
# See pf.conf(5) and /etc/examples/pf.conf
if0="re0" 	    ## dizzy
if1="pppoe0" 	## vdsl

edera_prefix="2a0e:5340:4:1::/64"
vdsl_prefix="2a00:11b7:301a:4100::/64"
#gw1="2a00:11b7:301a:4100:0:0:0:1"


set skip on lo
match out on $if1 inet nat-to ($if1:0)

block return	# block stateless traffic
pass		    # establish keep-state

match out on $if1 inet6 from $edera_prefix to any nat-to $vdsl_prefix bitmask (1)

pass in quick on $if0 proto tcp from any to ($if0) port ssh flags S/SA keep state
#pass in quick on $if1 inet6 proto tcp from any to ($if1) port ssh flags S/SA keep state reply-to $gw1

pass in on $if0 inet6 proto icmp6
pass in on $if1 inet6 proto icmp6


# By default, do not permit remote connections to X11
block return in on ! lo0 proto tcp to port 6000:6010

# Port build user does not need network
block return out log proto {tcp udp} user _pbuild
1 Překlad zdrojové adresy z prefixu 2a0e:5340:4:1::/64 na 2a00:11b7:301a:4100::/64. Podobné pravidlo match out on $ext_if1 inet6 from $vdsl_prefix to any nat-to $edera_prefix bitmask je na druhém routeru. Je to kvůli tomu, že poskytovatelé obvykle blokují prefixy, které nepřidělili. V případě výpadku jednoho z routerů bude vnitřní síť fungovat. Kdo má jenom jedno připojení k Internetu, toto pravidlo nepotřebuje.
Funguje to
rtr8# ifconfig
lo0: flags=2008049<UP,LOOPBACK,RUNNING,MULTICAST,LRO> mtu 32768
	index 4 priority 0 llprio 3
	groups: lo
	inet6 ::1 prefixlen 128
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
	inet 127.0.0.1 netmask 0xff000000
re0: flags=808843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,AUTOCONF4> mtu 1500
	lladdr e0:d5:5e:a2:b7:c8
	index 1 priority 0 llprio 3
	groups: egress
	media: Ethernet autoselect (1000baseT full-duplex,rxpause,txpause)
	status: active
	inet 192.168.120.189 netmask 0xffffff00 broadcast 192.168.120.255
	inet6 fe80::e2d5:5eff:fea2:b7c8%re0 prefixlen 64 scopeid 0x1
	inet6 2a00:11b7:301a:4100::1 prefixlen 64 pltime 3292 vltime 86092
re1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	lladdr e0:d5:5e:a2:b7:ca
	index 2 priority 0 llprio 3
	media: Ethernet autoselect (1000baseT full-duplex,rxpause,txpause)
	status: active
enc0: flags=0<>
	index 3 priority 0 llprio 3
	groups: enc
	status: active
pppoe0: flags=48851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST,AUTOCONF6TEMP> mtu 1492
	index 5 priority 0 llprio 3
	dev: re1 state: session
	sid: 0x1 PADI retries: 1 PADR retries: 0 time: 20:35:28
	sppp: phase network authproto pap authname "vdsl"
	dns: 31.30.90.11 31.30.90.12
	groups: pppoe egress
	status: active
	inet6 fe80::e2d5:5eff:fea2:b7c8%pppoe0 -->  prefixlen 64 scopeid 0x5
	inet 100.64.124.74 --> 10.26.202.187 netmask 0xffffffff
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33136
	index 6 priority 0 llprio 3
	groups: pflog
rtr8#
Na vnitřní síti to funguje také
jirka@jirka-Precision-T3610:~/vyuka_sspvc$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether f8:b1:56:d3:a6:48 brd ff:ff:ff:ff:ff:ff
    inet 192.168.120.216/24 brd 192.168.120.255 scope global dynamic noprefixroute enp0s25
       valid_lft 3567sec preferred_lft 3567sec
    inet6 2a0e:5340:4:1:5098:16d9:21d1:3bad/64 scope global temporary dynamic
       valid_lft 5155sec preferred_lft 2455sec
    inet6 2a0e:5340:4:1:13d4:4fc4:f816:5a2/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 5155sec preferred_lft 2455sec
    inet6 2a00:11b7:301a:4100:5098:16d9:21d1:3bad/64 scope global temporary dynamic
       valid_lft 5324sec preferred_lft 2624sec
    inet6 2a00:11b7:301a:4100:be23:a460:c0e4:3442/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 5324sec preferred_lft 2624sec
    inet6 fe80::acf4:e207:24d4:f502/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
jirka@jirka-Precision-T3610:~/vyuka_sspvc$
Traceroute z rtr8a.jr.lixis.cz na sspvc.lixis.cz (delší cesta)
rtr8# traceroute6 -I sspvc.lixis.cz
traceroute6 to sspvc.lixis.cz (2a0e:5340:4:400::4), 64 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  2a00:11b0:f000:ac00::1 (2a00:11b0:f000:ac00::1)  9.882 ms  9.551 ms  9.963 ms
 4  2a00:11b0:2:106::2 (2a00:11b0:2:106::2)  9.975 ms  9.944 ms  9.763 ms
 5  2a00:11b0:2:106::1 (2a00:11b0:2:106::1)  9.711 ms  9.711 ms  9.713 ms
 6  ae10-0.prg10.core-backbone.com (2a01:4a0:1338:13a::1)  10.219 ms  10.487 ms  9.952 ms
 7  2a01:4a0:1338:79::2 (2a01:4a0:1338:79::2)  10.012 ms  9.704 ms  9.738 ms
 8  2a01:28:c:42::2 (2a01:28:c:42::2)  10.478 ms  10.212 ms  10.239 ms
 9  2a03:f280:1::12 (2a03:f280:1::12)  12.733 ms  12.741 ms  12.485 ms
10  2a0e:5340:1::16 (2a0e:5340:1::16)  12.725 ms  12.967 ms  12.747 ms
11  * * *
12  sspvc.lixis.cz (2a0e:5340:4:400::4)  13.366 ms  13.458 ms  13.455 ms
rtr8#
Traceroute z dizzy.chorche.net na sspvc.lixis.cz (kratší cesta)
dizzy# traceroute6 -I sspvc.lixis.cz
traceroute6 to sspvc.lixis.cz (2a0e:5340:4:400::4), 64 hops max, 60 byte packets
 1  2a0e:5340:1:8000::1 (2a0e:5340:1:8000::1)  0.981 ms  0.866 ms  0.791 ms
 2  * * *
 3  2a0e:5340:1::16 (2a0e:5340:1::16)  3.496 ms  1.785 ms  1.755 ms
 4  * * *
 5  sspvc.lixis.cz (2a0e:5340:4:400::4)  2.166 ms  2.112 ms  1.934 ms
dizzy#
Traceroute z vnitřní sítě
jirka@jirka-Precision-T3610:~/vyuka_sspvc$ traceroute ipv6.google.com
traceroute to ipv6.google.com (2a00:1450:4014:80e::200e), 30 hops max, 80 byte packets
 1  2a00:11b7:301a:4100::2 (2a00:11b7:301a:4100::2)  0.328 ms  0.268 ms  0.453 ms
 2  2a0e:5340:1:8000::59 (2a0e:5340:1:8000::59)  2.773 ms  2.737 ms  2.705 ms
 3  zone0.man.i2.cz (2a0e:5340:1::1)  3.444 ms  3.597 ms  3.564 ms
 4  2a03:f280:1::11 (2a03:f280:1::11)  11.258 ms  11.200 ms  11.164 ms
 5  2a01:28:c:42::1 (2a01:28:c:42::1)  6.966 ms  6.931 ms  7.082 ms
 6  ae12-401.prg10.core-backbone.com (2a01:4a0:1338:79::1)  7.048 ms  6.597 ms  6.542 ms
 7  ae3-2054.vie10.core-backbone.com (2a01:4a0:0:2054::10)  10.900 ms  9.390 ms  9.337 ms
 8  ae4-2028.muc20.core-backbone.com (2a01:4a0:0:2028::7)  15.127 ms  14.880 ms  14.846 ms
 9  2001:4860:1:1::2784 (2001:4860:1:1::2784)  16.380 ms  16.275 ms 2001:4860:1:1::1a70 (2001:4860:1:1::1a70)  15.030 ms
10  2001:4860:0:1::83e3 (2001:4860:0:1::83e3)  17.856 ms 2001:4860:0:1::83bd (2001:4860:0:1::83bd)  16.813 ms 2001:4860:0:1::83e3 (2001:4860:0:1::83e3)  17.819 ms
11  2001:4860:0:1::8348 (2001:4860:0:1::8348)  17.153 ms 2001:4860:0:1::83be (2001:4860:0:1::83be)  17.927 ms 2001:4860:0:1::838c (2001:4860:0:1::838c)  26.350 ms
12  2001:4860::c:4001:5638 (2001:4860::c:4001:5638)  17.250 ms 2001:4860::c:4003:4958 (2001:4860::c:4003:4958)  17.747 ms  17.786 ms
13  * * 2001:4860::c:4003:364f (2001:4860::c:4003:364f)  18.077 ms
14  2001:4860::9:4003:6d45 (2001:4860::9:4003:6d45)  16.980 ms 2001:4860::9:4003:6d46 (2001:4860::9:4003:6d46)  18.932 ms 2001:4860::9:4003:6d45 (2001:4860::9:4003:6d45)  17.728 ms
15  2001:4860:0:1::60c9 (2001:4860:0:1::60c9)  17.694 ms 2001:4860:0:1::7e6b (2001:4860:0:1::7e6b)  18.164 ms 2001:4860:0:1::7eed (2001:4860:0:1::7eed)  16.825 ms
16  prg03s12-in-x0e.1e100.net (2a00:1450:4014:80e::200e)  16.525 ms 2001:4860:0:1::60cb (2001:4860:0:1::60cb)  17.044 ms prg03s12-in-x0e.1e100.net (2a00:1450:4014:80e::200e)  17.001 ms
jirka@jirka-Precision-T3610:~/vyuka_sspvc$

Ping funguje a spojení na TCP i UDP také. Zkusím ještě vypnout jeden z routerů (dizzy a rtr8) a uvidím, jak to bude fungovat. K tomu však musím udělat na rtr8 redundandní dhcpd server pro IPv4, což se mi dnes nepovede.

Zdroje