#!/bin/bash # # Internet connection sharing # # wwan0 with /64 learned via SLAAC to eth0 # # tools: # #ndppd # npd6 # radvd # # some variables #ndpd_conf="/etc/ndppd.conf" radvd_conf="/etc/radvd.conf" dhcpd6_conf="/etc/dhcpd6.conf" npd6_conf="/etc/npd6.conf" iface_ext="wwan0" iface_int="eth0" # definiton of DNS-Resolvers rdnss1="2001:4860:4860::8888" # public dns from google rdnss2="2001:4860:4860::8844" # public dns from google # forwarding/routing conflicts with SLAAC/RA therefore we start in none-router-mode ####/sbin/sysctl net.ipv6.conf.all.forwarding=0 # connecting wwan /usr/local/bin/mmcli -m 0 --simple-connect="allowed-modes=3g,apn=XXXXXXX,ip-type=ipv6" --verbose --timeout=500 /usr/bin/sleep 1 /usr/sbin/ip link set ${iface_ext} up /usr/bin/sleep 2 /usr/bin/ping6 -c 2 2600:: /usr/bin/sleep 1 # status /usr/sbin/ip -6 addr show /usr/bin/echo "-----------------------------------------------------------------------------------" /usr/sbin/ip -6 route show /usr/bin/echo "-----------------------------------------------------------------------------------" # read IP-adresses ip1_ext=`/usr/sbin/ip -6 addr show ${iface_ext} |\ /usr/bin/grep "scope global dynamic" |\ /usr/bin/cut -f6 -d " " |\ /usr/bin/cut -f1-8 -d ":"|\ /usr/bin/cut -f1 -d "/" |\ /usr/bin/grep "^[2|3]"` ip2_ext=`/usr/sbin/ip -6 addr show ${iface_ext} |\ /usr/bin/grep "scope global temporary dynamic"|\ /usr/bin/cut -f6 -d " "|\ /usr/bin/cut -f1-8 -d ":"|\ /usr/bin/cut -f1 -d "/"|\ /usr/bin/grep "^[2|3]"` prefix=`/usr/sbin/ip -6 addr show ${iface_ext} |\ /usr/bin/grep "scope global dynamic" |\ /usr/bin/cut -f6 -d " " |\ /usr/bin/cut -f1-4 -d ":" |\ /usr/bin/grep "^[2|3]"` # read defaultroute # example output : default via fe80::8029:b2bd:ce33:6f1f dev wwan0 proto ra metric 1024 expires 65534sec defaultroute=`/usr/sbin/ip -6 route show |\ /usr/bin/grep default |\ /usr/bin/cut -d " " -f 3` /usr/bin/echo "IP-address 1 "${ip1_ext} /usr/bin/echo "IP-address 2 "${ip2_ext} /usr/bin/echo "prefix "${prefix} /usr/bin/echo "default route "${defaultroute} /usr/sbin/ip -6 addr delete ${ip1_ext}/64 dev ${iface_ext} /usr/sbin/ip -6 addr delete ${ip2_ext}/64 dev ${iface_ext} /usr/sbin/ip -6 route delete ${prefix}::/64 dev ${iface_ext} # make external net small, set the internal network /usr/sbin/ip -6 addr add ${ip1_ext}/128 dev ${iface_ext} /usr/sbin/ip -6 addr add ${ip1_ext}/64 dev ${iface_int} # replace ra-set-route by manually set route /usr/sbin/ip -6 route delete default via ${defaultroute} dev ${iface_ext} /usr/sbin/ip -6 route add default via ${defaultroute} dev ${iface_ext} /sbin/sysctl net.ipv6.conf.all.forwarding=1 /sbin/sysctl net.ipv6.conf.${iface_ext}.proxy_ndp=1 #### create /etc/radvd.conf /usr/bin/echo "interface eth0" > ${radvd_conf} /usr/bin/echo "{" >> ${radvd_conf} /usr/bin/echo " AdvSendAdvert on;" >> ${radvd_conf} /usr/bin/echo "" >> ${radvd_conf} /usr/bin/echo " MaxRtrAdvInterval 30 ;" >> ${radvd_conf} /usr/bin/echo "" >> ${radvd_conf} /usr/bin/echo " AdvOtherConfigFlag on; # dhcpd6" >> ${radvd_conf} /usr/bin/echo "" >> ${radvd_conf} /usr/bin/echo " # life time zero means we don't actually advertise a" >> ${radvd_conf} /usr/bin/echo " # router but only our ULA address. Remove if you want this">> ${radvd_conf} /usr/bin/echo " # host to be advertised as router." >> ${radvd_conf} /usr/bin/echo " ##AdvDefaultLifetime 0;" >> ${radvd_conf} /usr/bin/echo "" >> ${radvd_conf} /usr/bin/echo " RDNSS "${rdnss1}" "${rdnss2} >> ${radvd_conf} /usr/bin/echo " {" >> ${radvd_conf} /usr/bin/echo " AdvRDNSSLifetime 600 ; " >> ${radvd_conf} /usr/bin/echo " FlushRDNSS on;" >> ${radvd_conf} /usr/bin/echo " };" >> ${radvd_conf} /usr/bin/echo "" >> ${radvd_conf} /usr/bin/echo " prefix "${prefix}"::/64" >> ${radvd_conf} /usr/bin/echo " {" >> ${radvd_conf} /usr/bin/echo " AdvOnLink on;" >> ${radvd_conf} /usr/bin/echo " AdvAutonomous on;" >> ${radvd_conf} /usr/bin/echo " AdvRouterAddr on;" >> ${radvd_conf} /usr/bin/echo " };" >> ${radvd_conf} /usr/bin/echo "};" >> ${radvd_conf} /usr/bin/echo "" >> ${radvd_conf} # create /etc/dhcpd6.conf /usr/bin/echo "authoritative;" >${dhcpd6_conf} /usr/bin/echo "" >>${dhcpd6_conf} /usr/bin/echo "option dhcp6.name-servers "${rdnss1}", "${rdnss2}" ;" >>${dhcpd6_conf} /usr/bin/echo "option dhcp6.domain-search \"de\";" >>${dhcpd6_conf} /usr/bin/echo "" >>${dhcpd6_conf} /usr/bin/echo "subnet6 "${prefix}"::/64 {" >>${dhcpd6_conf} /usr/bin/echo " range6 "${prefix}"::/64 temporary ;" >>${dhcpd6_conf} /usr/bin/echo "}" >>${dhcpd6_conf} /usr/bin/echo "" >>${dhcpd6_conf} #### create /etc/npd6.conf /usr/bin/echo "// npd6 config file" >${npd6_conf} /usr/bin/echo "" >>${npd6_conf} /usr/bin/echo "// The prefix portion that we will match on" >>${npd6_conf} /usr/bin/echo "//prefix=2a01:0123:4567:89aa:" >>${npd6_conf} /usr/bin/echo "prefix="${prefix}":" >>${npd6_conf} /usr/bin/echo "" >>${npd6_conf} /usr/bin/echo "" >>${npd6_conf} /usr/bin/echo "// Which interface are we monitoring and using?" >>${npd6_conf} /usr/bin/echo "interface = "${iface_ext} >>${npd6_conf} /usr/bin/echo "" >>${npd6_conf} /usr/bin/echo "listtype = none" >>${npd6_conf} /usr/bin/echo "listlogging = off" >>${npd6_conf} /usr/bin/echo "collectTargets = 100" >>${npd6_conf} /usr/bin/echo "linkOption = false" >>${npd6_conf} /usr/bin/echo "ignoreLocal = true" >>${npd6_conf} /usr/bin/echo "routerNA = true" >>${npd6_conf} /usr/bin/echo "maxHops = 255" >>${npd6_conf} /usr/bin/echo "" >>${npd6_conf} ################################ /usr/bin/echo "starting npd6" # /etc/init.d/npd6 start # does not work for me /usr/local/bin/npd6 ################################ /usr/bin/echo "starting radvd via systemd" /bin/systemctl start radvd.service ################################ /usr/bin/echo "starting dhcpd6 via systemd" /bin/systemctl start dhcpd6.service ################################