Cześć

Połączenia PPPOE realizowane przez demona pppd bywają dosyć niestabilne, czasem gubi się połączenie, jest potem automatycznie wznawiane, zmienia się IP, itp.

Dlatego standardowe metody ustawiania interfejsu 6to4 w /etc/network/interfaces w Debianie czy /etc/conf.d/net w Gentoo się niezbyt sprawdzają, bo po prostu nie można restartować usług sieciowych przy każdym padzie pppd.

Na szczęście demon pppd potrafi uruchamiać skrypty przy nawiązaniu i zerwaniu połączenia, skrypty do wykonania umieszcza się w folderach /etc/ppp/ip{up|down}.d/ i tam można umieścić skrypty do ustawiania tunelu 6to4.

A więc do dzieła:

Tworzymy odpowiednie skrypty (wykonać z uprawnieniami roota), wystarczy wkleić do terminala:

cat << 6TO4UP > /etc/ppp/ip-up.d/70-6to4-up.sh
#!/bin/sh

INTERFACE="\$1"
INT6="6to4\$1"

ip route get 192.88.99.1 | grep "\$INTERFACE" 2>&1>/dev/null || exit 0

IPADDR=\$(ip route get 192.88.99.1 | awk 'NR==1 {print \$NF}');
IP6ADDR=\$(ipv4="\$IPADDR"; printf "2002:%02x%02x:%02x%02x::1" \`echo \$ipv4 | tr "." " "\`)

ip tunnel add \$INT6 mode sit ttl 128 remote any local \$IPADDR
ip link set dev \$INT6 up 
ip -6 addr add "\$IP6ADDR"/16 dev \$INT6
ip -6 route add default via ::192.88.99.1 dev \$INT6 metric 1
6TO4UP

Skrypt do automatycznego tworzenia tunelu 6to4 gotowy.

cat << 6TO4DOWN > /etc/ppp/ip-down.d/70-6to4-down.sh
#!/bin/sh

INTERFACE="\$1"
INT6="6to4\$1"

ip -6 route flush dev \$INT6
ip link set dev \$INT6 down
ip tunnel del \$INT6
6TO4DOWN

Skrypt do zamykania połączenia 6to4 razem z demonem pppd gotowy.

Do tego uprawnienia:

chmod 700 /etc/ppp/ip-up.d/70-6to4-up.sh
chmod 700 /etc/ppp/ip-down.d/70-6to4-down.sh    

Teraz mały test:

wyłączamy pppoe:

poff <provider>
ip -6 route show | grep 6to4

i ponownie włączamy:

pon <provider>
ip -6 route show | grep 6to4
::/96 dev 6to4ppp0  proto kernel  metric 256 
2002::/16 dev 6to4ppp0  proto kernel  metric 256 
default via ::192.88.99.1 dev 6to4ppp0  metric 1 

Jak widać, interfejs 6to4ppp0 gotowy, routing ipv6 gotowy.

W przypadku używania vwdial proszę restart połączenia realizować przez ten program.

Sprawdzamy czy działa:

ping6 -c3 ipv6.google.com
PING ipv6.google.com(fra02s27-in-x02.1e100.net) 56 data bytes
64 bytes from fra02s27-in-x02.1e100.net: icmp_seq=1 ttl=59 time=33.9 ms
64 bytes from fra02s27-in-x02.1e100.net: icmp_seq=2 ttl=59 time=34.6 ms
64 bytes from fra02s27-in-x02.1e100.net: icmp_seq=3 ttl=59 time=34.0 ms

--- ipv6.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 33.944/34.205/34.637/0.374 ms

Jeszcze tylko trzeba ustawić firewalla dla Ipv6, w skrypcie do ustawienia ip6tables (można też wkleić do /etc/rc.local - przed exit):

ip6tables -F
ip6tables -X
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate INVALID,NEW -j DROP

Mam nadzieję, że komuś się przyda. ;)

Pozdro


Sznurki:

https://tldp.org/HOWTO/html_single/Linux+IPv6-HOWTO/ [1]

https://tldp.org/HOWTO/html_single/Linux+IPv6-HOWTO/#configuring-ipv6to4-tunnels [2]


Przypisy:

  1. https://tldp.org/HOWTO/html_single/Linux+IPv6-HOWTO/
  2. https://tldp.org/HOWTO/html_single/Linux+IPv6-HOWTO/#configuring-ipv6to4-tunnels