CentOS下怎样干掉IPv6

什么是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/.conf”这种文件),文件的内容是:

1
2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

配置完毕如果不重启机器的话,可以直接执行命令:

1
sysctl -p /etc/sysctl.d/ipv6.conf;

强制让其生效。然后再用命令

1
ip a s;

看,会发现原来的很多inet6的地址不存在了,配置生效了!

但需要注意的是:这种方式并没有真正把ipv6模块从内核里清除掉,不信用命令

1
lsmod | grep -i ipv6;

看,还是会有很多在用ipv6模块的。在这些模块里,又有好些并不是完全依赖ipv6模块不可的,只有极少数的是必须要ipv6模块的,所以,我们可以用后面的方法把ipv6模块以后系统还能正常工作。

modprobe劫持

此法又称“釜底抽薪”,CentOS7.x下不支持,CentOS6.x下测试可用。具体原理是截获系统自动加载ipv6模块的动作,直接返回true,并且将ipv6模块加入黑名单(blacklist)。这样系统就没法通过

1
modprobe ipv6;


1
insmod ipv6;

来加载ipv6模块了。具体方法如下:

1
2
3
echo -e "install ipv6 /bin/true\nblacklist ipv6" >\
/etc/modprobe.d/ipv6.conf;
reboot; # 这种办法必须要重启机器来完全生效

机器重启过后再通过

1
lsmod | grep -i ipv6;

来看是看不到ipv6模块的,表示ipv6模块已经完全被从内核里除掉。

GRUB参数

注意:此法仅适用于CentOS7.x!
此法的原理是在GRUB里直接将参数”ipv6.disable=1”传递给内核,这样启动时内核会根据这个参数不再加载ipv6模块。
具体方法是:

1
2
3
4
5
6
7
8
9
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了