Sida 1 av 1

Hjälp med 6to4 (IPv6) script i Bash

Postat: 30 maj 2010, 20:28
av Emil.s
Håller på att meka lite med ett script för att få igång 6to4 på ett smidigt sätt på en dator med dynamisk IP.
Bakgrund: http://ubuntu-se.org/phpBB3/viewtopic.p ... 96&start=0

Just nu ser det ut så här:

Kod: Markera allt

#! /bin/bash                                                                                                                                   
#                                                                                                                                              
# 6to4  Script to configure a 6to4 "tunnel" device                                                                                             
#                                                                                                                                              
#               Written by Emil Sandnabba <emil@sandnabba.se>                                                                                  
#               Orginal by Daniel Lawson <daniel@meta.net.nz>                                                                                  
                                                                                                                                               
# Interface för tunneln:                                                                                                                       
TUNIF=tun6to4                                                                                                                                  
                                                                                                                                               
# Externt interface (publik IP):                                                                                                               
EXTIF=hso0                                                                                                                                     
                                                                                                                                               
# Interface för interna nätverket:                                                                                                             
INTIF=eth0                                                                                                                                     
                                                                                                                                               
                                                                                                                                               
start_6to4_tunnel() {                                                                                                                          
# GET EXTIF IP Address                                                                                                                         
  PPPIP=`ip -4 addr list $EXTIF | grep inet | awk '{ print $2'}`                                                                               
# From IanKumlien:                                                                                                                             
# If you get a /netmask-bits suffix, then change the PPPIP line to:                                                                            
PPPIP=`ip -4 addr list $EXTIF | grep inet | awk '{ print $2 }' | cut -d/ -f1`                                                                  
  echo $PPPIP                                                                                                                                  
# Set up the tunnel                                                                                                                            
  ip tunnel add ${TUNIF} mode sit remote any local $PPPIP ttl 255                                                                              
  ip link set dev ${TUNIF} mtu 1472 up                                                                                                         
                                                                                                                                               
# Add IPv6 6to4 address to tuneldevice:                                                                                                        
  if [ -n ${TUNIF} ]; then                                                                                                                     
    ip -6 addr add $(printf "2002:%02x%02x:%02x%02x::1/64" $(echo ${PPPIP} | tr '.' ' ')) dev ${TUNIF}                                         
  fi                                                                                                                                           
echo Tunnel startad!                                                                                                                           
}                                                                                                                                              
                                                                                                                                               
start_routes() {                                                                                                                               
    ip -6 route add 2000::/3 via ::192.88.99.1 dev ${TUNIF} metric 1                                                                           
    echo Route tillagd!                                                                                                                        
}                                                                                                                                              
                                                                                                                                               
start_local_network() {                                                                                                                        
# Sätt en IPv6 adress på det interna interfacet:                                                                                               
  if [ -n $INTIF ]; then                                                                                                                       
# IPv6 forward?                                                                                                                                
    sysctl -w net.ipv6.conf.all.forwarding=1                                                                                                   
    echo IPv6 forward påslaget!                                                                                                                
    ip -6 addr add $(printf "2002:%02x%02x:%02x%02x:1::1/64" $(echo ${PPPIP} | tr '.' ' ')) dev ${INTIF}                                       
  fi                                                                                                                                           
  echo Lokala nätet igång!                                                                                                                     
}                                                                                                                                              
                                                                                                                                               
stop_local_network() {                                                                                                                         
  if [ -n ${INTIF} ]; then                                                                                                                     
# GET the *old* internal ip                                                                                                                    
    OLDIP=`ip -6 addr list dev ${INTIF} | grep inet6 | cut -d ":" -f 3 | cut -d '/' -f 1`                                                      
                                                                                                                                               
# Remove the 6to4 IP assigned to ${INTIF}                                                                                                      
    ip -6 addr del $(printf "2002:%02x%02x:%02x%02x:1::1/64" $(echo ${OLDIP} | tr '.' ' ')) dev ${INTIF}                                       
  fi                                                                                                                                           
}                                                                                                                                              
                                                                                                                                               
stop_routes() {                                                                                                                                
   ip -6 route del 2000::/3 via ::192.88.99.1 dev ${TUNIF} metric 1                                                                            
}                                                                                                                                              
                                                                                                                                               
stop_6to4_tunnel() {                                                                                                                           
  ip -6 route flush dev ${TUNIF}                                                                                                               
  ip link set dev ${TUNIF} down                                                                                                                
        ip tunnel del ${TUNIF}                                                                                                                 
        echo                                                                                                                                   
}                                                                                                                                              
                                                                                                                                               
restart_6to4_ad () {                                                                                                                           
  [ "yes" == "${RADVD}" ] &&                                                                                                                   
    killall -1 radvd                                                                                                                           
}                                                                                                                                              
                                                                                                                                               
                                                                                                                                               
                                                                                                                                               
case "$1" in                                                                                                                                   
  start)                                                                                                                                       
        echo -n "Setting up 6to4 IPv6 tunnel ($TUNIF): "                                                                                       
                                                                                                                                               
  start_6to4_tunnel                                                                                                                            
  start_routes                                                                                                                                 
  start_local_network                                                                                                                          
#  restart_6to4_ad                                                                                                                             
                                                                                                                                               
  ;;                                                                                                                                           
  stop)                                                                                                                                        
        echo -n "Shutting down 6to4 IPv6 tunnel ($TUNIF): "                                                                                    
                                                                                                                                               
  stop_routes                                                                                                                                  
#  stop_local_network                                                                                                                          
  stop_6to4_tunnel                                                                                                                             
# restart_6to4_ad                                                                                                                              
                                                                                                                                               
        ;;                                                                                                                                     
  restart|force-reload)                                                                                                                        
        echo -n "Resetting 6to4 IPv6 tunnel ($TUNIF): "                                                                                        
                                                                                                                                               
  stop_local_network                                                                                                                           
  stop_routes                                                                                                                                  
  stop_6to4_tunnel                                                                                                                             
  start_6to4_tunnel                                                                                                                            
  start_routes                                                                                                                                 
  start_local_network                                                                                                                          
  restart_6to4_ad                                                                                                                              
                                                                                                                                               
  ;;                                                                                                                                           
  *)                                                                                                                                           
        echo "Usage: $0 {start|stop|restart|force-reload}" >&2                                                                                 
        exit 1                                                                                                                                 
        ;;                                                                                                                                     
esac                                                                                                                                           
                                                                                                                                               
exit 0
Just nu finns 2 problem som lär lösas.
Det första är att följande körs:

Kod: Markera allt

  if [ -n $INTIF ]; then                                                                                                                       
*häftig funktion*                               
  fi 
Trots att $INTIF inte finns.

Det andra gäller "stop" funktionen på det lokala nätverket:

Kod: Markera allt

stop_local_network() {                                                                                                                         
  if [ -n ${INTIF} ]; then                                                                                                                     
# GET the *old* internal ip                                                                                                                    
    OLDIP=`ip -6 addr list dev ${INTIF} | grep inet6 | cut -d ":" -f 3 | cut -d '/' -f 1`                                                      
                                                                                                                                               
# Remove the 6to4 IP assigned to ${INTIF}                                                                                                      
    ip -6 addr del $(printf "2002:%02x%02x:%02x%02x:1::1/64" $(echo ${OLDIP} | tr '.' ' ')) dev ${INTIF}                                       
  fi                                                                                                                                           
} 
Här är det fel i ursprungsscriptet (tror jag?).
Misstänker att "OLDIP" ska bli antingen 5aef:72fa eller "5aef72fa"?
ip -6 addr list dev eth0 | grep intet6 ger:

Kod: Markera allt

root@MobileCommand: ~ #> ip -6 addr list dev eth0 | grep inet6                                                                                 
    inet6 2002:5aef:72fa:1::1/64 scope global tentative
Och hur funkar "$(printf "2002:%02x%02x:%02x%02x:1::1/64"" egentligen? Kör man det rakt ut i terminalen så får man ju bara "2002:0000:0000:1::1/64".
"%02x", är det nån sorts översättare från decimalt till hex?

Hur som helst så borde stop funktionen resultera i något liknande:
ip -6 addr del 2002:xxxx:xxxx:1::1 dev eth0

Någon "bash-master" här? :)

Re: Hjälp med 6to4 (IPv6) script i Bash

Postat: 30 maj 2010, 22:34
av Konservburk
Emil.s skrev:Just nu finns 2 problem som lär lösas.
Det första är att följande körs:

Kod: Markera allt

  if [ -n $INTIF ]; then                                                                                                                       
*häftig funktion*                               
  fi 
Trots att $INTIF inte finns.
Om du kollar i man test så ser du att flaggan -n vill ha en sträng som argument. Men när $INTIF inte finns så expanderar den till ingenting, vilket inte är samma sak som en tom sträng. Använd "$INTIF" med fnuttar istället så kommer du runt det problemet.
Emil.s skrev:Det andra gäller "stop" funktionen på det lokala nätverket:

Kod: Markera allt

stop_local_network() {                                                                                                                         
  if [ -n ${INTIF} ]; then                                                                                                                     
# GET the *old* internal ip                                                                                                                    
    OLDIP=`ip -6 addr list dev ${INTIF} | grep inet6 | cut -d ":" -f 3 | cut -d '/' -f 1`                                                      
                                                                                                                                               
# Remove the 6to4 IP assigned to ${INTIF}                                                                                                      
    ip -6 addr del $(printf "2002:%02x%02x:%02x%02x:1::1/64" $(echo ${OLDIP} | tr '.' ' ')) dev ${INTIF}                                       
  fi                                                                                                                                           
} 
Här är det fel i ursprungsscriptet (tror jag?).
Misstänker att "OLDIP" ska bli antingen 5aef:72fa eller "5aef72fa"?
ip -6 addr list dev eth0 | grep intet6 ger:

Kod: Markera allt

root@MobileCommand: ~ #> ip -6 addr list dev eth0 | grep inet6                                                                                 
    inet6 2002:5aef:72fa:1::1/64 scope global tentative
Ska bli? Jag tycker det ser ut som att du plockar ut den tredje kolonseparerade kolumnen, vilket med din utdata blir 72fa och inget annat. Med tanke på hur koden runt printf ser ut så misstänker jag att någon räknat med att $OLDIP ska vara fyra punktseparerade tal (precis som en ipv4-adress).
Emil.s skrev:Och hur funkar "$(printf "2002:%02x%02x:%02x%02x:1::1/64"" egentligen? Kör man det rakt ut i terminalen så får man ju bara "2002:0000:0000:1::1/64".
"%02x", är det nån sorts översättare från decimalt till hex?
Det skulle man kunna säga. Du får en formaterad utskrift med printf. Första argumentet är själva utskriftsformatet och avgör hur många ytterligare argument du behöver. I ditt fall har du %02x som betyder att du behöver ett tal som argument och att det talet kommer att skrivas ut hexadecimalt med nollor i början så att det minst blir två hexadecimala siffror. Ett utelämnat argument räknas som talet noll, vilket innebär att printf %02x ger dig utskriften 00. Jämför med printf %02x 13 som ger dig utskriften 0d. Eftersom du har fyra stycken %02x så behöver du fyra tal som argument.

http://en.wikipedia.org/wiki/printf

Re: Hjälp med 6to4 (IPv6) script i Bash

Postat: 30 maj 2010, 23:28
av Emil.s
Hm, ok. Då har nog skaparen av scriptet blandat ihop lite saker. Men man får tacka för förklaringen. Nu förstår man iallafall lite mer av vad som händer.

Problemet är som sagt att jag vill ha bort IPv6 adressen på det valda interfacet. Hellst ska bara adresser som börjar med "2002:" tas bort.

Nu har jag löst det med ett "fulhack", och lagt

Kod: Markera allt

# GET EXTIF IP Address
  PPPIP=`ip -4 addr list $EXTIF | grep inet | awk '{ print $2'}`
Utanför funktionerna, och sen tar jag bort adressen med:

Kod: Markera allt

ip -6 addr del $(printf "2002:%02x%02x:%02x%02x:1::1/64" $(echo ${PPPIP} | tr '.' ' ')) dev ${INTIF}                    
Problemet är att om den externa IPv4 adressen ändras så tas inte adressen bort. Och det är ju just för uppkopplingar med dynamisk IPv4 som scriptet är skrivet...

Borde gå fint att lösa med "ip -6 addr list dev eth0 | grep inet6", och sen sed/cut/awk eller nåt. Fixar till helgen om ingen hinner före. :)

Re: Hjälp med 6to4 (IPv6) script i Bash

Postat: 31 maj 2010, 15:11
av Emil.s
Har via ursprungstråden hittat kommandot "ip (-6) address flush", som löste problemet. :)

Man lär se till att lära sig "ip" kommandot ordentligt... Allt finns ju där. :)