什么是IPv6
Internet Protocol version 6 (簡稱IPv6) 是 Internet Protocol(互聯網協議) (IP)的最新一個版本,IPv6主要是為了解決IPv4地址枯竭的問題而開發的,目的是為了替換當前所用的IPv4。
雖然IPv6天生是為了替代IPv4的(生而自豪),而且最近幾年IPv4地址也已然分配完,但是由于NAT這種技術的存在,使得IPv6還沒有真正意義上的"取代"IPv4。尤其是在“我大宋”,除了教育網有IPv6的環境以外,其他基本都不支持IPv6。不過國外貌似發展的還可以,好些運營商都已經開始支持IPv6了。
IPv6的毛病
毛病?IPv6其實沒毛病,而且作為要替換IPv4的下一代協議,優點還很多。:)只是因為我們身處天朝上國,網絡根本就不支持IPv6,所以即使Linux系統缺省就支持IPv6,作為崇尚潔癖的系統管理員、運維工程師們,自然是嬸嬸可以忍,叔叔不可忍!(是可忍,孰不可忍)。
好啦,以上純屬扯蛋,說正經的,剛開始的時候,如果在不支持IPv6的環境里啟用IPv6協議的話,是會導致很多性能問題的,但最近些年,各種操作系統也做了不少調整,到目前其實真沒發現IPv6會對性能造成多大影響。一個長期以來大家都認可的理由就是:IPv6會優于IPv4,也就是說,一個數據包在發送時首先會先嘗試IPv6的網關,然后再是IPv4的。其實就算這種情況是真的,我們也是可以通過/etc/gai.conf文件來調整的。
幾種姿勢
下面介紹幾種在Linux系統里干掉IPv6的方法。
sysctl大法
幾乎所有的Linux系統......好吧好吧,我就說我確認的吧,Debian系和RedHat系......算啦,最最最確認的就是CentOS(當然rhel也一樣)下,可以在/etc/sysctl.d/目錄下新建文件叫ipv6.conf(Linux系統在啟動時會自動讀取/etc/sysctl.conf以及/etc/sysctl.d/目錄下的文件,并用sysctl -p來執行的,這里以.conf為擴展名是為了兼容CentOS7.x的系統,CentOS7.x認的是是“/etc/sysctl.d/<name>.conf”這種文件),文件的內容是:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
配置完畢如果不重啟機器的話,可以直接執行命令:
sysctl -p /etc/sysctl.d/ipv6.conf;
強制讓其生效。然后再用命令
ip a s;
看,會發現原來的很多inet6的地址不存在了,配置生效了!
但需要注意的是:這種方式并沒有真正把ipv6模塊從內核里清除掉,不信用命令
lsmod | grep -i ipv6;
看,還是會有很多在用ipv6模塊的。在這些模塊里,又有好些并不是完全依賴ipv6模塊不可的,只有極少數的是必須要ipv6模塊的,所以,我們可以用后面的方法把ipv6模塊以后系統還能正常工作。
modprobe劫持
此法又稱“釜底抽薪”,CentOS7.x下不支持,CentOS6.x下測試可用。具體原理是截獲系統自動加載ipv6模塊的動作,直接返回true,并且將ipv6模塊加入黑名單(blacklist)。這樣系統就沒法通過
modprobe ipv6;
或
insmod ipv6;
來加載ipv6模塊了。具體方法如下:
echo -e "install ipv6 /bin/true\nblacklist ipv6" >\
/etc/modprobe.d/ipv6.conf;
reboot; # 這種辦法必須要重啟機器來完全生效
機器重啟過后再通過
lsmod | grep -i ipv6;
來看是看不到ipv6模塊的,表示ipv6模塊已經完全被從內核里除掉。
GRUB參數
注意:此法僅適用于CentOS7.x!
此法的原理是在GRUB里直接將參數"ipv6.disable=1"傳遞給內核,這樣啟動時內核會根據這個參數不再加載ipv6模塊。
具體方法是:
if grep -q "ipv6.disable=1" /etc/default/grub
then
echo "\"ipv6.disable=1\" found in /etc/default/grub"
else
sed -i.ori 's/^GRUB_CMDLINE_LINUX="/&ipv6.disable=1 /' /etc/default/grub
/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
fi
# 此法自然也需要重啟機器,于是:
reboot
個人推薦的解決方案
- CentOS7.x下慎用GRUB法,因為一旦用GRUB法,以后萬一有某個模塊需要ipv6,那非重新修改GRUB文件并重啟機器不能成功的
- CentOS6.x下的話,建議用sysctl法和modprobe法結合,如果碰到有一定要依賴于ipv6的模塊要加載,直接修改/etc/modprobe.d/ipv6.conf,注釋掉相關語句以后,再重新就能modprobe ipv6了