network revision 1.8
11.1Slukem#!/bin/sh 21.1Slukem# 31.8Sthorpej# $NetBSD: network,v 1.8 2000/04/28 00:13:39 thorpej Exp $ 41.1Slukem# 51.1Slukem 61.1Slukem# PROVIDE: network 71.5Stsarna# REQUIRE: root mountcritlocal tty sysctl 81.1Slukem 91.1Slukem. /etc/rc.subr 101.1Slukem. /etc/rc.conf 111.1Slukem 121.1Slukemname="network" 131.1Slukemstart_cmd="network_start" 141.6Slukemstop_cmd=":" 151.1Slukem 161.1Slukemnetwork_start() 171.1Slukem{ 181.1Slukem # set hostname, turn on network 191.1Slukem # 201.1Slukem echo "Starting network." 211.1Slukem 221.1Slukem # If $hostname is set, use it for my Internet name, 231.1Slukem # otherwise use /etc/myname 241.1Slukem # 251.1Slukem if [ -z "$hostname" -a -f /etc/myname ]; then 261.1Slukem hostname=`cat /etc/myname` 271.1Slukem fi 281.1Slukem if [ -n "$hostname" ]; then 291.1Slukem echo "Hostname: $hostname" 301.1Slukem hostname $hostname 311.1Slukem else 321.8Sthorpej # Don't warn about it if we're going to run 331.8Sthorpej # DHCP later, as we will probably get the 341.8Sthorpej # hostname at that time. 351.8Sthorpej # 361.8Sthorpej if ! checkyesno dhclient 371.8Sthorpej warn "\$hostname not set." 381.8Sthorpej fi 391.1Slukem fi 401.1Slukem 411.1Slukem # Check $domainname first, then /etc/defaultdomain, 421.1Slukem # for NIS/YP domain name 431.1Slukem # 441.1Slukem if [ -z "$domainname" -a -f /etc/defaultdomain ]; then 451.1Slukem domainname=`cat /etc/defaultdomain` 461.1Slukem fi 471.1Slukem if [ -n "$domainname" ]; then 481.1Slukem echo "NIS domainname: $domainname" 491.1Slukem domainname $domainname 501.1Slukem fi 511.1Slukem 521.1Slukem # Flush all routes just to make sure it is clean 531.1Slukem if checkyesno flushroutes; then 541.1Slukem route -n flush 551.1Slukem fi 561.1Slukem 571.1Slukem # Set the address for the first loopback interface, so that the 581.1Slukem # auto-route from a newly configured interface's address to lo0 591.1Slukem # works correctly. 601.1Slukem # 611.1Slukem # NOTE: obscure networking problems may occur if lo0 isn't configured... 621.1Slukem # 631.1Slukem ifconfig lo0 inet 127.0.0.1 641.1Slukem 651.1Slukem # Configure all of the network interfaces listed in $net_interfaces; 661.1Slukem # if $auto_ifconfig is YES, grab all interfaces from ifconfig. 671.1Slukem # In the following, "xxN" stands in for interface names, like "le0". 681.1Slukem # For any interfaces that has an $ifconfig_xxN variable associated, 691.1Slukem # we do "ifconfig xxN $ifconfig_xxN". 701.1Slukem # If there is no such variable, we take the contents of the file 711.1Slukem # /etc/ifconfig.xxN, and run "ifconfig xxN" repeatedly, using each 721.1Slukem # line of the file as the arguments for a seperate "ifconfig" 731.1Slukem # invocation. 741.1Slukem # 751.1Slukem # In order to configure an interface reasonably, you at the very least 761.1Slukem # need to specify "[addr_family] [hostname]" (e.g "inet my.domain.org"), 771.1Slukem # and probably a netmask (as in "netmask 0xffffffe0"). You will 781.1Slukem # frequently need to specify a media type, as in "media UTP", for 791.1Slukem # interface cards with multiple media connections that do not 801.1Slukem # autoconfigure. See the ifconfig manual page for details. 811.1Slukem # 821.1Slukem # Note that /etc/ifconfig.xxN takes multiple lines. The following 831.1Slukem # configuration is possible: 841.1Slukem # inet 10.1.1.1 netmask 0xffffff00 851.1Slukem # inet 10.1.1.2 netmask 0xffffff00 alias 861.1Slukem # inet6 fec0::1 prefixlen 64 alias 871.1Slukem # 881.1Slukem if [ "$net_interfaces" != NO ]; then 891.1Slukem if checkyesno auto_ifconfig; then 901.1Slukem tmp="`ifconfig -l`" 911.1Slukem else 921.1Slukem tmp="$net_interfaces" 931.1Slukem fi 941.1Slukem echo -n 'Configuring network interfaces:' 951.1Slukem for int in $tmp; do 961.1Slukem eval `echo 'args=$ifconfig_'$int` 971.1Slukem if [ -n "$args" ]; then 981.1Slukem echo -n " $int" 991.1Slukem ifconfig $int $args 1001.1Slukem elif [ -f /etc/ifconfig.$int ]; then 1011.1Slukem echo -n " $int" 1021.1Slukem (while read args; do 1031.1Slukem if [ -n "`eval echo '$args'`" ] ; then 1041.1Slukem ifconfig $int $args 1051.1Slukem fi 1061.1Slukem done) < /etc/ifconfig.$int 1071.1Slukem else 1081.1Slukem if ! checkyesno auto_ifconfig; then 1091.1Slukem echo 1101.1Slukem warn \ 1111.1Slukem "/etc/ifconfig.$int missing and ifconfig_$int not set;" 1121.1Slukem warn "interface $int not configured." 1131.1Slukem fi 1141.1Slukem continue 1151.1Slukem fi 1161.1Slukem configured_interfaces="$configured_interfaces $int" 1171.1Slukem done 1181.1Slukem echo "." 1191.1Slukem fi 1201.1Slukem 1211.1Slukem # Check $defaultroute, then /etc/mygate, for the name of my gateway 1221.1Slukem # host. That name must be in /etc/hosts. 1231.1Slukem # 1241.1Slukem if [ -z "$defaultroute" -a -f /etc/mygate ]; then 1251.1Slukem defaultroute=`cat /etc/mygate` 1261.1Slukem fi 1271.1Slukem if [ -n "$defaultroute" ]; then 1281.1Slukem route add default $defaultroute 1291.1Slukem fi 1301.1Slukem 1311.1Slukem # Check if each configured interface xxN has an $ifaliases_xxN variable 1321.1Slukem # associated, then configure additional IP addresses for that interface. 1331.1Slukem # The variable contains a list of "address netmask" pairs, with 1341.1Slukem # "netmask" set to "-" if the interface default netmask is to be used. 1351.1Slukem # 1361.1Slukem # Note that $ifaliases_xxN works only with certain configurations and 1371.1Slukem # considered not recommended. Use /etc/ifconfig.xxN if possible. 1381.1Slukem # 1391.1Slukem # 1401.1Slukem if [ -n "$configured_interfaces" ]; then 1411.1Slukem echo "Adding interface aliases:" 1421.1Slukem done_aliases_message=yes 1431.1Slukem fi 1441.1Slukem for int in $configured_interfaces; do 1451.1Slukem eval `echo 'args=$ifaliases_'$int` 1461.1Slukem if [ -n "$args" ]; then 1471.1Slukem set -- $args 1481.1Slukem while [ $# -ge 2 ]; do 1491.1Slukem addr=$1 ; net=$2 ; shift 2 1501.1Slukem if [ "$net" = "-" ]; then 1511.1Slukem ifconfig $int inet alias $addr 1521.1Slukem else 1531.1Slukem ifconfig $int inet alias $addr \ 1541.1Slukem netmask $net 1551.1Slukem fi 1561.1Slukem # Use loopback, not the wire 1571.1Slukem route add $addr 127.0.0.1 1581.1Slukem done 1591.1Slukem fi 1601.1Slukem done 1611.1Slukem 1621.1Slukem # /etc/ifaliases, if it exists, contains the names of additional IP 1631.1Slukem # addresses for each interface. It is formatted as a series of lines 1641.1Slukem # that contain 1651.1Slukem # address interface netmask 1661.1Slukem # 1671.1Slukem # Note that /etc/ifaliases works only with certain cases only and its 1681.1Slukem # use is not recommended. Use /etc/ifconfig.xxN instead. 1691.1Slukem # 1701.1Slukem # 1711.1Slukem if [ -f /etc/ifaliases ]; then 1721.1Slukem ( 1731.1Slukem if [ "$done_aliases_message" != yes ]; then 1741.1Slukem echo "Adding interface aliases:" 1751.1Slukem fi 1761.1Slukem while read addr int net; do 1771.1Slukem if [ -z "$net" ]; then 1781.1Slukem ifconfig $int inet alias $addr 1791.1Slukem else 1801.1Slukem ifconfig $int inet alias $addr netmask $net 1811.1Slukem fi 1821.1Slukem # use loopback, not the wire 1831.1Slukem route add $addr 127.0.0.1 1841.1Slukem done 1851.1Slukem ) < /etc/ifaliases 1861.1Slukem fi 1871.1Slukem 1881.1Slukem # IPv6 1891.1Slukem # Note that manual configuration can be done in the above, using 1901.1Slukem # ifconfig. 1911.1Slukem # 1921.1Slukem if ifconfig lo0 inet6 >/dev/null 2>&1; then 1931.1Slukem # We have IPv6 support in kernel. 1941.1Slukem 1951.4Sitojun # disallow link-local unicast dest without outgoing scope 1961.1Slukem # identifiers. 1971.1Slukem # 1981.1Slukem route add -inet6 fe80:: -prefixlen 10 ::1 -reject 1991.4Sitojun 2001.4Sitojun # disallow site-local unicast dest without outgoing scope 2011.4Sitojun # identifiers. 2021.4Sitojun # If you configure site-locals without scope id (it is 2031.4Sitojun # permissible config for routers that are not on scope 2041.4Sitojun # boundary), you may want to comment the following one out. 2051.4Sitojun # 2061.4Sitojun route add -inet6 fec0:: -prefixlen 10 ::1 -reject 2071.1Slukem 2081.1Slukem # disallow "internal" addresses to appear on the wire. 2091.1Slukem # 2101.1Slukem route add -inet6 ::ffff:0.0.0.0 -prefixlen 96 ::1 -reject 2111.4Sitojun 2121.4Sitojun # disallow packets to malicious IPv4 compatible prefix 2131.4Sitojun # 2141.4Sitojun route add -inet6 ::224.0.0.0 -prefixlen 100 ::1 -reject 2151.4Sitojun route add -inet6 ::127.0.0.0 -prefixlen 104 ::1 -reject 2161.4Sitojun route add -inet6 ::0.0.0.0 -prefixlen 104 ::1 -reject 2171.4Sitojun route add -inet6 ::255.0.0.0 -prefixlen 104 ::1 -reject 2181.3Sitojun 2191.3Sitojun # disallow packets to malicious 6to4 prefix 2201.3Sitojun # 2211.3Sitojun route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject 2221.3Sitojun route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject 2231.4Sitojun route add -inet6 2002:0000:: -prefixlen 24 ::1 -reject 2241.4Sitojun route add -inet6 2002:ff00:: -prefixlen 24 ::1 -reject 2251.4Sitojun 2261.4Sitojun # Completely disallow packets to IPv4 compatible prefix. 2271.4Sitojun # This may conflict with RFC1933 under following circumstances: 2281.4Sitojun # (1) An IPv6-only KAME node tries to originate packets to IPv4 2291.4Sitojun # comatible destination. The KAME node has no IPv4 2301.4Sitojun # compatible support. Under RFC1933, it should transmit 2311.4Sitojun # native IPv6 packets toward IPv4 compatible destination, 2321.4Sitojun # hoping it would reach a router that forwards the packet 2331.4Sitojun # toward auto-tunnel interface. 2341.4Sitojun # (2) An IPv6-only node originates a packet to IPv4 compatible 2351.4Sitojun # destination. A KAME node is acting as an IPv6 router, and 2361.4Sitojun # asked to forward it. 2371.4Sitojun # Due to rare use of IPv4 compatible address, and security 2381.4Sitojun # issues with it, we disable it by default. 2391.4Sitojun # 2401.4Sitojun route add -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject 2411.1Slukem 2421.1Slukem sysctl -w net.inet6.ip6.forwarding=0 >/dev/null 2431.1Slukem sysctl -w net.inet6.ip6.accept_rtadv=0 >/dev/null 2441.1Slukem 2451.1Slukem # backward compatibility 2461.1Slukem # 2471.1Slukem if [ -z "$ip6mode" -a -n "$ip6forwarding" ]; then 2481.1Slukem warn 'Please migrate to newer rc.conf' \ 2491.1Slukem '(use ip6mode, not ip6forwarding)' 2501.1Slukem if checkyesno ip6forwarding; then 2511.1Slukem ip6mode=router 2521.1Slukem else 2531.1Slukem if checkyesno rtsol; then 2541.1Slukem ip6mode=autohost 2551.1Slukem else 2561.1Slukem ip6mode=host 2571.1Slukem fi 2581.1Slukem fi 2591.1Slukem fi 2601.1Slukem 2611.1Slukem case $ip6mode in 2621.1Slukem router) 2631.1Slukem echo 'IPv6 mode: router' 2641.1Slukem sysctl -w net.inet6.ip6.forwarding=1 >/dev/null 2651.1Slukem ;; 2661.1Slukem 2671.1Slukem autohost) 2681.1Slukem echo 'IPv6 mode: autoconfigured host' 2691.1Slukem sysctl -w net.inet6.ip6.accept_rtadv=1 >/dev/null 2701.1Slukem if [ -n "$ip6defaultif" ]; then 2711.1Slukem ndp -I $ip6defaultif 2721.1Slukem fi 2731.1Slukem ;; 2741.1Slukem 2751.1Slukem host) 2761.1Slukem echo 'IPv6 mode: host' 2771.1Slukem if [ -n "$ip6defaultif" ]; then 2781.1Slukem ndp -I $ip6defaultif 2791.1Slukem fi 2801.1Slukem ;; 2811.1Slukem 2821.1Slukem *) echo 'WARNING: invalid value in ip6mode' 2831.1Slukem ;; 2841.1Slukem 2851.1Slukem esac 2861.1Slukem 2871.1Slukem if checkyesno rtsol; then 2881.1Slukem if [ "$ip6mode" = "autohost" ]; then 2891.1Slukem echo 'Sending router solicitation...' 2901.1Slukem rtsol $rtsol_flags 2911.1Slukem else 2921.1Slukem echo 2931.1Slukem warn \ 2941.1Slukem "ip6mode must be set to 'autohost' to use rtsol." 2951.1Slukem fi 2961.1Slukem fi 2971.1Slukem 2981.1Slukem # wait till DAD is completed. always invoke it in case if are 2991.1Slukem # configured manually by ifconfig 3001.1Slukem # 3011.1Slukem dadcount=`sysctl -n net.inet6.ip6.dad_count 2>/dev/null` 3021.1Slukem sleep $dadcount 3031.1Slukem sleep 1 3041.1Slukem fi 3051.1Slukem 3061.1Slukem # XXX this must die 3071.1Slukem if [ -s /etc/netstart.local ]; then 3081.1Slukem sh /etc/netstart.local start 3091.1Slukem fi 3101.1Slukem} 3111.1Slukem 3121.1Slukemnetwork_stop() 3131.1Slukem{ 3141.1Slukem echo "Stopping network." 3151.1Slukem 3161.1Slukem # XXX this must die 3171.1Slukem if [ -s /etc/netstart.local ]; then 3181.1Slukem sh /etc/netstart.local stop 3191.1Slukem fi 3201.1Slukem 3211.1Slukem echo "Deleting aliases." 3221.1Slukem if [ -f /etc/ifaliases ]; then 3231.1Slukem ( 3241.1Slukem while read addr int net; do 3251.1Slukem ifconfig $int inet delete $addr 3261.1Slukem done 3271.1Slukem ) < /etc/ifaliases 3281.1Slukem fi 3291.1Slukem 3301.1Slukem for int in $configured_interfaces; do 3311.1Slukem eval `echo 'args=$ifaliases_'$int` 3321.1Slukem if [ -n "$args" ]; then 3331.1Slukem set -- $args 3341.1Slukem while [ $# -ge 2 ]; do 3351.1Slukem addr=$1 ; net=$2 ; shift 2 3361.1Slukem ifconfig $int inet delete $addr 3371.1Slukem done 3381.1Slukem fi 3391.1Slukem done 3401.1Slukem 3411.1Slukem # down interfaces 3421.1Slukem # 3431.1Slukem echo -n 'Downing network interfaces:' 3441.1Slukem if [ "$net_interfaces" != NO ]; then 3451.1Slukem if checkyesno auto_ifconfig; then 3461.1Slukem tmp="`ifconfig -l`" 3471.1Slukem else 3481.1Slukem tmp="$net_interfaces" 3491.1Slukem fi 3501.1Slukem for int in $tmp; do 3511.1Slukem eval `echo 'args=$ifconfig_'$int` 3521.2Sveego if [ -n "$args" ] || [ -f /etc/ifconfig.$int ]; then 3531.1Slukem echo -n " $int" 3541.1Slukem ifconfig $int down 3551.1Slukem fi 3561.1Slukem done 3571.1Slukem echo "." 3581.1Slukem fi 3591.1Slukem 3601.1Slukem # flush routes 3611.1Slukem # 3621.1Slukem route -n flush 3631.1Slukem 3641.1Slukem} 3651.1Slukem 3661.1Slukemrun_rc_command "$1" 367