Skip to content

Instantly share code, notes, and snippets.

@vDorst
Created December 24, 2013 14:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vDorst/8113954 to your computer and use it in GitHub Desktop.
Save vDorst/8113954 to your computer and use it in GitHub Desktop.
dhclient ipv6 script for OnsBrabantNet, /etc/dhcp/dhclient-enter-hooks.d/option-6rd
#!/bin/bash
#
# Bases on
# 1) dhclient-6rd by Nathan Lutchansky for Ubuntu 10.04
# 2) Alexandre Beloin http://beloin.net/doc/6rd.txt
# Any possessor of a copy of this program may treat it as if it
# were in the public domain. I waive all rights.
#
# Tested on Debian testing as for 2011-11-19, will not work on stable due to lack of ipv6rd kernel option
#
# Last modified 2011-11-19
#
#
# ************************* Installation Instructions *************************
#
# 1) Place this script in /etc/dhcp3/dhclient-exit-hooks.d/option-6rd to assign IPv6 adresses
# 2) Script asumes eth0.88 - ISP link, eth0.10 - LAN link, eth0.22 - DMZ link, 6rdif - 6rd LAN.
# 3) Do not forget to turn on ipv6 forwarding
# 4) ftp://ftp.bieringer.de/pub/linux/IPv6/ipv6calc/ipv6calc-0.92.0.tar.gz or newer should be in /usr/local/bin
#
# 5) You must edit /etc/dhcp3/dhclient.conf to add the option-6rd definition:
#
# option option-6rd code 212 = { integer 8, integer 8, ip6-address, ip-address };
#
# *****************************************************************************
#
PATH=/sbin:/usr/local/bin:$PATH
log_6rd() {
##$new_ip_address, and the interface name is passed in $interface
WANIF=$interface
LANIF="eth0.10"
DMZIF="eth0.22"
WANIP4=$new_ip_address
SIXIF="6rdif"
if [ -z "$new_option_6rd" ]; then
logger -p daemon.info -t option-6rd "no 6RD parameters available"
return
fi
srd_vals=(${new_option_6rd})
srd_masklen=${srd_vals[0]}
srd_prefixlen=${srd_vals[1]}
srd_prefix="`echo ${srd_vals[2]} | sed -E s/\(:0\)+$/::/`"
srd_braddr=${srd_vals[3]}
ipsep=(${new_ip_address//\./ })
#logger -p daemon.info -t option-6rd "6RD parameters: 6rd-prefix ${srd_prefix}/${srd_prefixlen} br ${srd_braddr} option-6rd ${new_option_6rd}"
if (( $srd_masklen==0 )); then
logger -p daemon.info -t option-6rd "6RD parameters: 6rd-prefix ${srd_prefix}/${srd_prefixlen} br ${srd_braddr}"
return
elif (( $srd_masklen <= 8 )); then
masked=$((${ipsep[0]} & ~((1 << (8 - $srd_masklen)) - 1)))
srd_relayprefix=${masked}.0.0.0
elif (( $srd_masklen <= 16 )); then
masked=$((${ipsep[1]} & ~((1 << (16 - $srd_masklen)) - 1)))
srd_relayprefix=${ipsep[0]}.${masked}.0.0
elif (( $srd_masklen <= 24 )); then
masked=$((${ipsep[2]} & ~((1 << (24 - $srd_masklen)) - 1)))
srd_relayprefix=${ipsep[0]}.${ipsep[1]}.${masked}.0
elif (( $srd_masklen <= 32 )); then
masked=$((${ipsep[3]} & ~((1 << (32 - $srd_masklen)) - 1)))
srd_relayprefix=${ipsep[0]}.${ipsep[1]}.${ipsep[2]}.${masked}
elif (( $srd_masklen <= 40 )); then
masked=$((${ipsep[3]} & ~((1 << (32 - $srd_masklen)) - 1)))
srd_relayprefix=${ipsep[0]}.${ipsep[1]}.${ipsep[2]}.${masked}
else
logger -p daemon.info -t option-6rd "invalid IPv4MaskLen $srd_masklen"
return
fi
## logger -p daemon.info -t option-6rd "6RD parameters: reason ${reason} 6rd-prefix ${srd_prefix}/${srd_prefixlen} 6rd-relay_prefix ${srd_relayprefix}/${srd_masklen} br ${srd_braddr}"
delagated_prefix=`ipv6calc -q --action 6rd_local_prefix --6rd_prefix ${srd_prefix}/${srd_prefixlen} --6rd_relay_prefix ${srd_relayprefix}/${srd_masklen} $WANIP4`
ifname_ip6addr="$(echo "$delagated_prefix" | awk '{split($0,a,"/"); print a[1]}')1/$(echo "$delagated_prefix" | awk '{split($0,a,"/"); print a[2]}')"
#2a01:670:6a90:2400
#123456789012345678
lan_ip6net="$(echo "$delagated_prefix" | sed s/./1/18 | awk '{split($0,a,"/"); print a[1]}')/64" # Need to change if using subnet (if Delagated prefix < 64)
lan_ip6addr="$(echo "$lan_ip6net" | awk '{split($0,a,"/"); print a[1]}')1/64" # Need to change if using subnet (if Delagated prefix < 64)
dmz_ip6net="$(echo "$delagated_prefix" | sed s/./D/18 | awk '{split($0,a,"/"); print a[1]}')/64" # Need to change if using subnet (if Delagated prefix < 64)
dmz_ip6addr="$(echo "$dmz_ip6net" | awk '{split($0,a,"/"); print a[1]}')1/64" # Need to change if using subnet (if Delagated prefix < 64)
ip tunnel add ${SIXIF} mode sit local $WANIP4
ip tunnel 6rd dev ${SIXIF} 6rd-prefix ${srd_prefix}/${srd_prefixlen} 6rd-relay_prefix ${srd_relayprefix}/${srd_masklen}
ip link set dev ${SIXIF} up
ip -6 addr add "$ifname_ip6addr" dev ${SIXIF}
ip -6 route add default via ::${srd_braddr} dev ${SIXIF} metric 1
ip -6 addr add $lan_ip6addr dev $LANIF
# DMZ is disable.
# ip -6 addr add $dmz_ip6addr dev $DMZIF
}
case $reason in
BOUND|RENEW|REBIND|REBOOT)
log_6rd
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment