aboutsummaryrefslogtreecommitdiffstats
path: root/sysconfig/network-scripts/ifup-ipv6
blob: cd5d00623a369f3a35af22c334d3a840b4eb5cb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#!/bin/sh
#
# ifup-ipv6
#
#
# Taken from:
# (P) & (C) 2000-2001 by Peter Bieringer <pb@bieringer.de>
#
# RHL integration assistance by Pekka Savola <pekkas@netcore.fi>
#
# Version 2001-07-16
#
# Uses following information from "/etc/sysconfig/network":
#  NETWORKING_IPV6=yes|no: controls IPv6 initialization (global setting)
#
# Uses following information from "/etc/sysconfig/network-scripts/ifcfg-$1":
#  IPV6INIT=yes|no: controls IPv6 configuration for this interface
#  IPV6ADDR=<ipv6address>/<prefixlength>: specify primary static IPv6 address here
#  IPV6ADDR_SECONDARIES="<list of ipv6 addresses>" [optional]
#  IPV6_ROUTER=yes|no: controls IPv6 autoconfiguration (no: multi-homed interface without routing)
#  IPV6_AUTOCONF=yes|no: controls IPv6 autoconfiguration
#   defaults:
#    IPV6FORWARDING=yes: IPV6_AUTOCONF=no, IPV6_ROUTER=yes
#    IPV6FORWARDING=no: IPV6_AUTOCONF=yes
#  IPV6_MTU=<MTU for IPv6>: controls IPv6 MTU for this link [optional]
#
# Optional for 6to4 tunneling:
#  IPV6TO4INIT=yes|no: controls 6to4 tunneling setup
#  IPV6TO4_RELAY=<ipv4address|ipv6to4address>: IPv4/IPv6to4 address of the remote 6to4 relay
#  IPV6TO4_IPV4ADDR=<ipv6address>: overwrite local IPv4 address [optional]
#  IPV6TO4_ROUTING="eth0-:f101::0/64 eth1-:f102::0/64": information to setup local subnetting
#  IPV6TO4_CONTROL_RADVD=yes|no: controls radvd triggering [optional]
#  IPV6TO4_RADVD_PIDFILE=file: PID file of radvd for sending signals, default is "/var/run/radvd/radvd.pid" [optional]
#
#  Requirements for 6to4 if using radvd:
#   radvd-0.6.2p3 or newer supporting option "Base6to4Interface"
#


# Get global network configuration
. /etc/sysconfig/network 

# Source IPv4 helper functions
cd /etc/sysconfig/network-scripts
. network-functions 

CONFIG=$1
[ -f "$CONFIG" ] || CONFIG=ifcfg-$CONFIG
source_config  

# Test whether IPv6 configuration is enabled for this interface, else stop
[ "$IPV6INIT" = "yes" ] || exit 0

# Test whether IPv6 should be configured, else stop
[ "${NETWORKING_IPV6}" = "yes" ] || exit 0

if [ ! -f /etc/sysconfig/network-scripts/network-functions-ipv6 ]; then
	exit 1
fi

# Source IPv6 helper functions
. /etc/sysconfig/network-scripts/network-functions-ipv6

# IPv6 test, module loaded, exit if system is not IPv6-ready
test_ipv6 || exit 1

		
# Setup IPv6 address on specified interface
if ! [ -z "$IPV6ADDR" ]; then
	ifup_ipv6_real $DEVICE $IPV6ADDR
fi

# Get current global IPv6 forwarding
ipv6_global_forwarding_current="`sysctl -n net.ipv6.conf.all.forwarding`"

# Set some proc switches depending on defines
if [ "$IPV6FORWARDING" = "yes" ]; then
	# Global forwarding should be enabled

	# Check, if global IPv6 forwarding was already set by global script
	if [ $ipv6_global_forwarding_current -ne 1 ]; then
		echo $"Global IPv6 forwarding is enabled in configuration, but not currently enabled in kernel"
#		echo $"Please restart network with '/sbin/service network restart'"
	fi

	ipv6_local_forwarding=1
	ipv6_local_auto=0
	if [ "$IPV6_ROUTER" = "no" ]; then
		ipv6_local_forwarding=0
	fi
	if [ "$IPV6_AUTOCONF" = "yes" ]; then
		ipv6_local_auto=1
	fi
else
	# Global forwarding should be disabled

	# Check, if global IPv6 forwarding was already set by global script
	if [ $ipv6_global_forwarding_current -ne 0 ]; then
		echo $"Global IPv6 forwarding is disabled in configuration, but not currently disabled in kernel"
#		echo $"Please restart network with '/sbin/service network restart'"
	fi

	ipv6_local_forwarding=0
	ipv6_local_auto=1
	if [ "$IPV6_AUTOCONF" = "no" ]; then
		ipv6_local_auto=0
	fi
fi
sysctl -w net.ipv6.conf.$DEVICE.forwarding=$ipv6_local_forwarding >/dev/null
sysctl -w net.ipv6.conf.$DEVICE.accept_ra=$ipv6_local_auto >/dev/null
sysctl -w net.ipv6.conf.$DEVICE.accept_redirects=$ipv6_local_auto >/dev/null

# Set IPv6 MTU, if given
if [ ! -z "$IPV6_MTU" ]; then
	ipv6_set_mtu $DEVICE $IPV6_MTU
fi

# Setup additional IPv6 addresses from list
if [ ! -z "$IPV6ADDR_SECONDARIES" ]; then
	for ipv6addr in $IPV6ADDR_SECONDARIES; do
		ifup_ipv6_real $DEVICE $ipv6addr
	done
fi

# Setup additional static IPv6 routes on specified interface
if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
	grep -w "^$DEVICE" /etc/sysconfig/static-routes-ipv6 | while read device args; do
		ifup_ipv6_route $args $DEVICE
	done
fi

# Setup of 6to4, if configured
if [ "$IPV6TO4INIT" = "yes" ]; then
	valid6to4config="yes"
	if [ ! -z "$IPV6TO4_IPV4ADDR" ]; then
		# Take special configured from config file (precedence 1)
		ipv4addr="$IPV6TO4_IPV4ADDR"
        else
		# Get IPv4 address from interface first (has precedence 2)
		ipv4addr="`LC_ALL=C ifconfig $DEVICE |grep "inet addr:" | tr : " " | awk '{ print $3 }'`"
		if [ -z "$ipv4addr" ]; then
			# Take configured from config file (precedence 3)
			ipv4addr="$IPADDR"
		fi
        fi
	if [ ! -z "$ipv4addr" ]; then
		if ! testipv4_globalusable $ipv4addr; then
			echo $"Given IPv4 address $ipv4addr is not a globally usable one, 6to4 configuration is not valid!"
	                valid6to4config="no"
        	fi
		if [ -z "$IPV6TO4_RELAY" ]; then
			echo $"IPv6to4 configuration needs an IPv6to4 relay address, 6to4 configuration is not valid!"
			valid6to4config="no"
		fi
		if [ "$valid6to4config" = "yes" ]; then
			if testipv4_globalusable $IPV6TO4_RELAY 2>/dev/null; then
				true
			elif testipv6_valid $IPV6TO4_RELAY; then
				relay6to4type="ipv6"
				if echo $IPV6TO4_RELAY | grep -q "^2002:"; then
					# IPv6 address is a 6to4 (further tests not be implemented at the moment)
					true
				else
					echo $"Given IPv6 address of relay is not a 6to4 one, 6to4 configuration is not valid!"
					valid6to4config="no"
				fi
			else
				echo $"Given address of relay is not a globally usable one, 6to4 configuration is not valid!"
				valid6to4config="no"
			fi
		fi
	else
        	echo $"IPv6to4 configuration needs an IPv4 address on related interface or extra specified, 6to4 configuration is not valid!"
		valid6to4config="no"
	fi
        if [ "$valid6to4config" = "yes" ]; then
		ifup_ipv6to4 $DEVICE $ipv4addr

		# Add static routes
		if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
			grep -w "^sit0" /etc/sysconfig/static-routes-ipv6 | while read device network dummy; do
				if [ "$relay6to4type" = "ipv6" ]; then
					# Foreign 6to4 relay gateway as IPv6to4 
					ifup_ipv6_route $network $IPV6TO4_RELAY sit0
				else
					# Foreign 6to4 relay gateway as compatible IPv4 
					ifup_ipv6_route $network ::$IPV6TO4_RELAY sit0
				fi
			done
		fi

	        if [ "$IPV6TO4_CONTROL_RADVD" = "yes" ]; then
			# RADVD is in use, so forwarding of IPv6 packets should be enabled, display warning
			if [ $ipv6_global_forwarding_current -ne 1 ]; then
				echo $"Using 6to4 and RADVD IPv6 forwarding usually should be enabled, but it isn't!"
			fi

			if [ -z "$IPV6TO4_RADVD_PIDFILE" ]; then
				IPV6TO4_RADVD_PIDFILE="/var/run/radvd/radvd.pid"
			fi

			# Send SIGHUP to radvd for prefix recalculation
			if [ -f "$IPV6TO4_RADVD_PIDFILE" ]; then
				pid="`cat $IPV6TO4_RADVD_PIDFILE`"
				if [ ! -z "$pid" ]; then
					echo $"Trigger RADVD for IPv6to4 prefix recalculation"	
					kill -HUP $pid
				else
					false
				fi
			fi
		        if [ ! -z "$IPV6TO4_ROUTING" ]; then
				ipv6to4prefix="`create6to4prefix $ipv4addr`"
				if [ ! -z "$ipv6to4prefix" ]; then
					# Add route to local networks
					for devsuf in $IPV6TO4_ROUTING; do
						dev="`echo $devsuf | awk -F- '{ print $1 }'`"
						suf="`echo $devsuf | awk -F- '{ print $2 }'`"
						ifup_ipv6_route ${ipv6to4prefix}$suf :: $dev
					done
				else
					echo $"Error occured while calculating the IPv6to4 prefix"
				fi
			else
				echo $"RADVD control enabled, but config is not complete!"
			fi
		fi
        fi
fi