Konfiguracja PPPoE Dual Stack (IPv4 + IPv6) w routerach Mikrotik
Procedura testowana na RouterOS w wersji 6.42. Obejmuje obsługę połączeń IP dual stack (IPv4 i IPv6) na routerze CPE (klienckim) przy założeniu, że istnieje wcześniejsza poprawna konfiguracja połączenia PPPoE IPv4.
- Włączamy pakiet IPv6 (System/Packages, zaznaczamy IPv6 i wciskamy Enable), a następnie restartujemy router.
- Jeśli nie mamy jeszcze w tej chwili skonfigurowanego routera (ustawiamy od początku), to po włączeniu IPv6 dobrze jest wykonać reset do ustawień fabrycznych i restart. Mikrotik doda wtedy standardową konfigurację firewalla IPv6, która jest wystarczająca dla większości zastosowań. Można to oczywiście zrobić później ręcznie.
- Konfigurujemy standardowe połączenie PPPoE IPv4 (jeśli jeszcze nie mamy)
- W tym momencie zakładamy, że mamy poprawnie skonfigurowane połączenie PPPoE IPv4 na interfejsie o nazwie pppoe-out1 w oparciu o profil PPPoE o nazwie default, a połączenia sieci LAN oparte są na interfejsie o nazwie bridge. Poniżej przedstawiamy dwie metody konfiguracji:
- w oparciu o interfejs graficzny programu Winbox
- w oparciu o CLI (np. ssh)
Konfiguracja w programie Winbox
1.Dodajemy konfigurację klienta DHCPv6 dla puli PD (Prefix Delegation). Wchodzimy w IPv6/DHCP Client/+. W oknie New DHCPv6 Client, w zakładce DHCP:
- wybieramy z listy Interface: pppoe-out1
- zaznaczamy checkbox Request: prefix, odznaczamy address
- w Pool Name wpisujemy: pula-IP6-PD
- zatwierdzamy OK
- Dodajemy adres IPv6 do interfejsu LAN o nazwie bridge z puli Prefix Delegetion o nazwie pula-IPv6-PD. Wchodzimy w IPv6/Addresses/+. W oknie New IPv6 Address:
- w polu Address: wpisujemy ::/64
- w polu From Pool: wybieramy lub wpisujemy pula-IP6-PD
- z listy Interface wybieramy: bridge
- zatwierdzamy OK
- Konfigurujemy ND (Neighbor Discovery) na interfejsie LAN o nazwie bridge. Wchodzimy w IPv6/ND:
- wyłączamy domyślne ND na wszystkich interfejsach. Zaznaczamy wpis z interface all i wyłączamy go (Disable) czerwonym znakiem X.
- dodajemy (niebieski znak +) nową regułę ND
- w oknie New ND:
- z listy Interface wybieramy: bridge
- w polu Reachable Time: wpisujemy 300
- zaznaczamy checkbox: Advertise DNS
- zatwierdzamy OK
- W momencie pisania instrukcji w systemie RouterOS Mikrotika był błąd polegający na tym, że po restarcie routera klient DHCPv6 zatrzymywał się w stanie “rebinding…”, co nie pozwalało na prawidłowe ponowne otrzymanie puli PD. Jedną z metod obejścia tego problemu jest wstawienie skryptu wymuszającego nowy DHCP request po podniesieniu interfejsu PPPoE. Najwygodniej jest podpiąć taki skrypt do profilu PPPoE default (lub innego, którego używamy). W tym celu wchodzimy w PPP/Profiles (zakładka). Wybieramy profil default i w zakładce Scripts/On Up: wpisujemy skrypt:
:delay 5s
/ipv6 dhcp-client release [ find interface="pppoe-out1" ]
Następnie zatwierdzamy OK.
- Dodajemy konfigurację firewalla IPv6 (jeśli jeszcze nie mamy) według opisu poniżej w akapicie Firewall IPv6.
Konfiguracja przez CLI
/ppp profile
set *0 on-up=":delay 5s\r\n/ipv6 dhcp-client release [ find interface=\"pppoe-out1\" ]"
/ipv6 address
add address=::1 from-pool=pula-IP6-PD interface=bridge
/ipv6 dhcp-client
add add-default-route=yes interface=pppoe-out1 pool-name=pula-IP6-PD request=prefix
/ipv6 nd
set [ find default=yes ] disabled=yes
add advertise-dns=yes hop-limit=64 interface=bridge reachable-time=5m
Firewall IPv6
Po włączeniu pakietu IPv6 reset do domyślnej konfiguracji tworzy dodatkowo ustawienia firewalla IPv6. Jest to konfiguracja wystarczająca w większości zastosować. Jeśli przed włączeniem obsługi IPv6 mamy już działającą konfigurację, to możemy wprowadzić ustawienia firewalla IPv6 ręcznie, bez potrzeby resetu. Poniżej dwa przykłady takich ustawień; pierwszy, to domyślnie tworzony przez Mikrotik po resecie, oraz drugi zawierający niezbędne minimum.
Reguły firewalla IPv6 tworzone przez RouterOS po resecie do ustawień fabrycznych
Uwaga! Są one tworzone przy założeniu dodania oznaczeń odpowiednich interfejsów jako LAN i WAN. Nie należy ich kopiować bez zrozumienia działania. Poniższa konfiguracja jest pokazana poglądowo w celu porównania z własnym zestawem reguł.
/ipv6 firewall address-list
add address=::/128 comment="defconf: unspecified address" list=bad_ipv6
add address=::1/128 comment="defconf: lo" list=bad_ipv6
add address=fec0::/10 comment="defconf: site-local" list=bad_ipv6
add address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped" list=bad_ipv6
add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6
add address=100::/64 comment="defconf: discard only " list=bad_ipv6
add address=2001:db8::/32 comment="defconf: documentation" list=bad_ipv6
add address=2001:10::/28 comment="defconf: ORCHID" list=bad_ipv6
add address=3ffe::/16 comment="defconf: 6bone" list=bad_ipv6
add address=::224.0.0.0/100 comment="defconf: other" list=bad_ipv6
add address=::127.0.0.0/104 comment="defconf: other" list=bad_ipv6
add address=::/104 comment="defconf: other" list=bad_ipv6
add address=::255.0.0.0/104 comment="defconf: other" list=bad_ipv6
/ipv6 firewall filter
add action=accept chain=input comment=\
"defconf: accept established,related,untracked" connection-state=\
established,related,untracked
add action=drop chain=input comment="defconf: drop invalid" connection-state=\
invalid
add action=accept chain=input comment="defconf: accept ICMPv6" protocol=icmpv6
add action=accept chain=input comment="defconf: accept UDP traceroute" port=\
33434-33534 protocol=udp
add action=accept chain=input comment=\
"defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=\
udp src-address=fe80::/16
add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 \
protocol=udp
add action=accept chain=input comment="defconf: accept ipsec AH" protocol=\
ipsec-ah
add action=accept chain=input comment="defconf: accept ipsec ESP" protocol=\
ipsec-esp
add action=accept chain=input comment=\
"defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
add action=drop chain=input comment=\
"defconf: drop everything else not coming from LAN" in-interface-list=!LAN
add action=accept chain=forward comment=\
"defconf: accept established,related,untracked" connection-state=\
established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" connection-state=\
invalid
add action=drop chain=forward comment="defconf: drop packets with bad src ipv6" \
src-address-list=bad_ipv6
add action=drop chain=forward comment="defconf: drop packets with bad dst ipv6" \
dst-address-list=bad_ipv6
add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" \
hop-limit=equal:1 protocol=icmpv6
add action=accept chain=forward comment="defconf: accept ICMPv6" protocol=\
icmpv6
add action=accept chain=forward comment="defconf: accept HIP" protocol=139
add action=accept chain=forward comment="defconf: accept IKE" dst-port=500,4500 \
protocol=udp
add action=accept chain=forward comment="defconf: accept ipsec AH" protocol=\
ipsec-ah
add action=accept chain=forward comment="defconf: accept ipsec ESP" protocol=\
ipsec-esp
add action=accept chain=forward comment=\
"defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
add action=drop chain=forward comment=\
"defconf: drop everything else not coming from LAN" in-interface-list=!LAN
Minimalny zestaw reguł firewalla IPv6
Prawidłowy przy założeniu, że łączymy się na zewnątrz przez PPPoE przy użyciu interfejsu pppoe-out1.
/ipv6 firewall filter
add action=accept chain=forward connection-state=established,related,untracked
add action=accept chain=input comment="DHCPv6 server reply" dst-port=546 protocol=udp src-address=fe80::/10
add action=drop chain=forward connection-state=invalid,new in-interface=pppoe-out1
add action=drop chain=input connection-state=invalid,new in-interface=pppoe-out1