Created
December 24, 2013 14:12
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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