data/method/ipv6/config_ipv6.sh

448 lines
16 KiB
Bash
Executable File

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
key_value_editer()
{
local file=$1
local key=$2
local value=$3
[ ! -f "$file" ] && return
if ! grep -i "^${key}[[:space:]]*=" "$file" &>/dev/null; then
echo "$key=$value" >> "$file"
else
value=${value//\//\\/}
sed -i "s/^${key}[[:space:]]*=.*/$key=$value/" "$file"
fi
}
enable_sysctl_conf(){
files="/etc/sysctl.conf /etc/sysctl.conf.first"
for file in $files
do
key_value_editer "$file" net.ipv6.conf.all.disable_ipv6 0
key_value_editer "$file" net.ipv6.conf.default.disable_ipv6 0
key_value_editer "$file" net.ipv6.conf.lo.disable_ipv6 0
done
sysctl -p
}
get_redhat_centos_ver()
{
if [ -f /etc/centos-release ]; then
echo `sed 's/^.*release \([0-9]\).*$/\1/' /etc/centos-release`
elif [ -f /etc/redhat-release ]; then
echo `sed 's/^.*release \([0-9]\).*$/\1/' /etc/redhat-release`
fi
}
get_ubuntu_ver()
{
version=`cat /etc/issue|head -1|awk '{print $2}'|awk -F '.' '{print $1}'`
echo $version
return
}
grub_ipv6_enabled()
{
# check if need to del grub ipv6 disable
if grep -q "ipv6.disable=1" /proc/cmdline; then
# local ipv6_disable='ipv6.disable=1'
# del_params_grub $ipv6_disable
case ${ostype} in
coreos)
sed -i -e "s/set linux_append=\"\$linux_append ipv6.disable=1\"//" /usr/share/oem/grub.cfg
;;
esac
g_need_reboot=1
fi
}
check_os_type()
{
# ostype: tlinux|opensuse|suse|centos|redhat|ubuntu|debian|coreos
while [ true ];do
if [ -f /etc/tlinux-release ];then
echo tlinux
return
fi
if [ -f /etc/SuSE-release ];then
grep -i "opensuse" /etc/SuSE-release >/dev/null 2>/dev/null && echo "opensuse" || echo "suse"
return
fi
if [ -f /etc/SUSE-brand ];then
grep -i "opensuse" /etc/SUSE-brand &>/dev/null && echo "opensuse" || echo "suse"
return
fi
if [ -f /etc/centos-release ];then
echo centos
return
fi
#centos5 and redhat5
if [ -f /etc/redhat-release ];then
grep "Red Hat" /etc/redhat-release >/dev/null
if [ $? -eq 0 ];then
echo redhat
return
fi
grep CentOS /etc/redhat-release >/dev/null
if [ $? -eq 0 ];then
echo centos
return
fi
fi
break
done
for os in ubuntu debian coreos;do grep ^ID=${os}$ /etc/os-release >/dev/null 2>/dev/null && echo ${os} && return; done
grep -i =ubuntu /etc/lsb-release >/dev/null 2>/dev/null && echo ubuntu && return
[ -f /etc/freebsd-update.conf ] && echo FreeBSD
}
is_network_static()
{
#if network is static, config ipv6 by manual
case ${ostype} in
centos)
if grep -q "IPADDR=" /etc/sysconfig/network-scripts/ifcfg-"$ifcfg";then
return 1
fi
;;
tlinux)
if grep -q "IPADDR=" /etc/sysconfig/network-scripts/ifcfg-"$ifcfg";then
return 1
fi
;;
ubuntu)
local osver=$(get_ubuntu_ver)
case $osver in
"18"|"20")
if grep -r -q "addresses:" /etc/netplan/ ;then
return 1
fi
;;
"16")
if grep -r -q "inet static" /etc/network/interfaces.d/ ;then
return 1
fi
;;
"14")
if grep -r -q "inet static" /etc/network/interfaces.d/ ;then
return 1
fi
;;
esac
;;
debian)
if grep -q "inet static" /etc/network/interfaces ;then
return 1
fi
;;
opensuse)
if grep -q "static" /etc/sysconfig/network/ifcfg-"$ifcfg" ;then
return 1
fi
;;
coreos)
if grep -q "Address=" /etc/systemd/network/"$ifcfg"-*.network ;then
return 1
fi
;;
FreeBSD)
echo "Please do ipv6 config by manual, refer to the documentation"
exit
;;
esac
return 0
}
config_ssh_ipv6()
{
#config ssh ipv6
if grep -q "AddressFamily any" /etc/ssh/sshd_config; then
sed -i -e 's/#AddressFamily any/AddressFamily any/' /etc/ssh/sshd_config
else
sed -i '/^AddressFamily/d' $file
echo "AddressFamily any" >> /etc/ssh/sshd_config
fi
}
config_ipv6()
{
echo "config ipv6 ip/route and ssh_v6"
is_network_static
local res=$(echo $?)
if [ "$res" == "1" ];then
echo "ipv6 has been enabled, please config ipv6 address by manual, because the vpc0 is static network"
exit
fi
netip=fe80::feee:ffff:feff:ffff
case ${ostype} in
centos)
if [ "$(get_redhat_centos_ver)" == "8" ];then
dhclient -6
! grep -q "IPV6INIT=yes" /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" && echo "IPV6INIT=yes" >> /etc/sysconfig/network-scripts/ifcfg-"$ifcfg"
! grep -q "IPV6_AUTOCONF=yes" /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" && echo "IPV6_AUTOCONF=yes" >> /etc/sysconfig/network-scripts/ifcfg-"$ifcfg"
! grep -q "IPV6_DEFROUTE=yes" /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" && echo "IPV6_DEFROUTE=yes" >> /etc/sysconfig/network-scripts/ifcfg-"$ifcfg"
! grep -q "IPV6_FAILURE_FATAL=no" /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" && echo "IPV6_FAILURE_FATAL=no" >> /etc/sysconfig/network-scripts/ifcfg-"$ifcfg"
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
cat >> /etc/NetworkManager/dispatcher.d/99-eth0-ipv6-add-default-route << EOF
# !/bin/bash
if [[ "\${1}" -eq "eth0" ]] && [[ "\${2}" -eq "up" ]]; then
ip -6 route add default dev "\${1}" via fe80::feee:ffff:feff:ffff
fi
exit 0
EOF
chmod +x /etc/NetworkManager/dispatcher.d/99-eth0-ipv6-add-default-route
else
if [ "$(get_redhat_centos_ver)" == "7" ];then
systemctl stop NetworkManager
systemctl disable NetworkManager
fi
#config DHCPV6C
dhclient -6
! grep -q "DHCPV6C=yes" /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" && echo "DHCPV6C=yes" >> /etc/sysconfig/network-scripts/ifcfg-"$ifcfg"
#netip=$(ip -6 address show | grep inet6 | awk '{print $2}' | cut -d'/' -f1 | sed -n '2,2p' | awk -F":" '{print $1":"$2":"$3":"$4}')
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
ipv6_route_file="/etc/sysconfig/network-scripts/route6-$ifcfg"
if [ ! -f "$ipv6_route_file" ];
then
touch "$ipv6_route_file"
fi
grep -q "default dev $ifcfg" "$ipv6_route_file"
if [ $? -eq 0 ];then
# delete origin
sed -i "/default dev $ifcfg/d" "$ipv6_route_file"
fi
# add new
echo "default dev $ifcfg via $netip" >> "$ipv6_route_file"
fi
config_ssh_ipv6
service sshd reload
;;
debian)
dhclient -6
! grep -q "iface $ifcfg inet6 dhcp" /etc/network/interfaces && echo "iface $ifcfg inet6 dhcp" >> /etc/network/interfaces
#netip=$(ip -6 address show | grep inet6 | awk '{print $2}' | cut -d'/' -f1 | sed -n '2,2p' | awk -F":" '{print $1":"$2":"$3":"$4}')
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
grep -q "up ip -6 route add default dev $ifcfg" /etc/network/interfaces
if [ $? -eq 0 ];then
# delete origin
sed -i "/default dev $ifcfg/d" /etc/network/interfaces
fi
echo "up ip -6 route add default dev $ifcfg via $netip" >> /etc/network/interfaces
config_ssh_ipv6
service ssh reload
;;
opensuse)
local sure=""
while [ "$sure" != "N" ] && [ "$sure" != "n" ] && [ "$sure" != "Y" ] && [ "$sure" != "y" ]
do
read -p "We will restart network, are you sure?(Y/N) :" sure
if [ "$sure" == "N" ] || [ "$sure" == "n" ];then
exit
fi
done
local ifcfg_file="/etc/sysconfig/network/ifcfg-$ifcfg"
systemctl restart network # default use wickedd-dhcp6 service
#netip=$(ip -6 address show | grep inet6 | awk '{print $2}' | cut -d'/' -f1 | sed -n '2,2p' | awk -F":" '{print $1":"$2":"$3":"$4}')
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
grep -q "ip -6 route add default dev $ifcfg" /etc/rc.d/after.local
if [ $? -eq 0 ];then
# delete origin
sed -i "/default dev $ifcfg/d" /etc/rc.d/after.local
fi
echo "ip -6 route add default dev $ifcfg via $netip" >> /etc/rc.d/after.local
! grep -q "default $netip - $ifcfg" /etc/sysconfig/network/routes && echo "default $netip - $ifcfg" >> /etc/sysconfig/network/routes # avoid restart network to lose ipv6 address
;;
suse)
echo "ipv6 has been enabled, please do ipv6 config by manual, refer to the documentation "
;;
ubuntu)
dhclient -6
#netip=$(ip -6 address show | grep inet6 | awk '{print $2}' | cut -d'/' -f1 | sed -n '2,2p' | awk -F":" '{print $1":"$2":"$3":"$4}')
local osver=$(get_ubuntu_ver)
case $osver in
"18"|"20")
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
# ! grep -q "dhcp6:[[:space:]]*yes" /etc/netplan/50-cloud-init.yaml && echo "dhcp6: yes" >> /etc/netplan/50-cloud-init.yaml
sed -i "/$ifcfg:/a\ dhcp6: yes" /etc/netplan/50-cloud-init.yaml
# refer to https://netplan.io/faq/#use-pre-up-post-up-etc-hook-scripts
echo '#!/bin/bash' > /etc/networkd-dispatcher/routable.d/50-ifup-hooks
echo "ip -6 route add default dev $ifcfg via $netip" >> /etc/networkd-dispatcher/routable.d/50-ifup-hooks
echo "exit 0" >> /etc/networkd-dispatcher/routable.d/50-ifup-hooks
chmod +x /etc/networkd-dispatcher/routable.d/50-ifup-hooks
;;
"16")
! grep -q "iface $ifcfg inet6 dhcp" /etc/network/interfaces && echo "iface $ifcfg inet6 dhcp" >> /etc/network/interfaces
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
grep -q "up ip -6 route add default dev $ifcfg" /etc/network/interfaces
if [ $? -eq 0 ];then
# delete origin
sed -i "/default dev $ifcfg/d" /etc/network/interfaces
fi
echo "up ip -6 route add default dev $ifcfg via $netip" >> /etc/network/interfaces
;;
"14")
! grep -q "iface $ifcfg inet6 dhcp" /etc/network/interfaces && echo "iface $ifcfg inet6 dhcp" >> /etc/network/interfaces
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
grep -q "up ip -6 route add default dev $ifcfg" /etc/network/interfaces
if [ $? -eq 0 ];then
# delete origin
sed -i "/default dev $ifcfg/d" /etc/network/interfaces
fi
echo "up ip -6 route add default dev $ifcfg via $netip" >> /etc/network/interfaces
;;
esac
config_ssh_ipv6
service ssh reload
;;
tlinux)
dhclient -6
# netip=$(ip -6 address show | grep inet6 | awk '{print $2}' | cut -d'/' -f1 | sed -n '2,2p' | awk -F":" '{print $1":"$2":"$3":"$4}')
local version=$(head -1 /etc/issue | awk '{print $4}' 2>/dev/null)
case ${version} in
"1.2")
key_value_editer /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" IPV6INIT "'yes'"
key_value_editer /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" PERSISTENT_DHCLIENT "'yes'"
key_value_editer /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" DHCPV6C "'yes'"
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
ipv6_route_file="/etc/sysconfig/network-scripts/route6-$ifcfg"
if [ ! -f "$ipv6_route_file" ];
then
touch $ipv6_route_file
fi
grep -q "default dev $ifcfg" "$ipv6_route_file"
if [ $? -eq 0 ];then
# delete origin
sed -i "/default dev $ifcfg/d" "$ipv6_route_file"
fi
echo "default dev $ifcfg via $netip" >> "$ipv6_route_file"
sed -i 's/ListenAddress/# ListenAddress/' /etc/ssh/sshd_config
;;
"2.2")
key_value_editer /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" DHCPV6C yes
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
ipv6_route_file="/etc/sysconfig/network-scripts/route6-$ifcfg"
if [ ! -f "$ipv6_route_file" ];
then
touch $ipv6_route_file
fi
grep -q "default dev $ifcfg" "$ipv6_route_file"
if [ $? -eq 0 ];then
# delete origin
sed -i "/default dev $ifcfg/d" "$ipv6_route_file"
fi
echo "default dev $ifcfg via $netip" >> "$ipv6_route_file"
;;
"2.4")
key_value_editer /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" DHCPV6C yes
;;
*)
key_value_editer /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" IPV6INIT "'yes'"
key_value_editer /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" PERSISTENT_DHCLIENT "'yes'"
key_value_editer /etc/sysconfig/network-scripts/ifcfg-"$ifcfg" DHCPV6C "'yes'"
ip -6 route delete default dev "$ifcfg"
ip -6 route add default dev "$ifcfg" via "$netip"
ipv6_route_file="/etc/sysconfig/network-scripts/route6-$ifcfg"
if [ ! -f "$ipv6_route_file" ];
then
touch $ipv6_route_file
fi
grep -q "default dev $ifcfg" "$ipv6_route_file"
if [ $? -eq 0 ];then
# delete origin
sed -i "/default dev $ifcfg/d" "$ipv6_route_file"
fi
echo "default dev $ifcfg via $netip" >> "$ipv6_route_file"
sed -i 's/ListenAddress/# ListenAddress/' /etc/ssh/sshd_config
;;
esac
config_ssh_ipv6
service sshd reload
;;
coreos)
grub_ipv6_enabled
enable_sysctl_conf
! grep -q "ip -6 route add default dev $ifcfg" /etc/rc.d/rc.local && echo "ip -6 route add default dev $ifcfg via $netip" >> /etc/rc.d/rc.local
g_need_reboot=1
;;
FreeBSD)
echo "Please do ipv6 config by manual, refer to the documentation"
;;
esac
}
# ostype: tlinux|opensuse|suse|centos|redhat|ubuntu|debian|freebsd|coreos
if [ "$#" == "0" ];then
echo "please execute like: ./config_ipv6.sh eth0"
exit
fi
echo "Note: Please make sure your ipv6 address has been assigned at web console, Otherwise this process will fail"
echo " if you have not assign a ipv6 address, please refer to https://cloud.tencent.com/document/product/1142/38130"
ifcfg=$1
sure=""
while [ "$sure" != "N" ] && [ "$sure" != "n" ] && [ "$sure" != "Y" ] && [ "$sure" != "y" ]
do
read -p "We will config network on $ifcfg and it cloud not be revoke, are you sure?(Y/N) :" sure
if [ "$sure" == "N" ] || [ "$sure" == "n" ];then
exit
fi
done
ostype=$(check_os_type)
g_need_reboot=0
[ "$ostype" == "FreeBSD" ] || [ "$ostype" == "suse" ] && echo "For FreeBSD/SUSE, please do ipv6 config by manual, refer to the documentation" && exit
config_ipv6
[ $g_need_reboot -eq 1 ] && echo "need to reboot"
echo "config ipv6 finished"