从零开始的VPS生活 Vol1-3:初见CentOS7——网络优化

抽出好IP

IP是开奖开出来的,第一篇我就写过。开奖就是建机器,测试IP,不好就删了再建。

在这里再强调一点,一定要找一个百度、Google、ChinaZ站长工具、IPIP.net等各IP库都识别为你想要的那个国家的地址,否则后患无穷。

我就因为之前的日本IP被Google识别为印尼IP,导致Play服务和搜索都被影响,最终废掉了那台机器(追加:第二个IP也被Google识别错误成阿联酋了,不过登录账户并固定国家为日本之后还是可以顺利使用的,可以通过Report IP problems来向Google反馈,不过响应会非常慢根本没有用)…所以一定要提前试好,一劳永逸。

Vultr的日本机房位置很好,东京的NTT机房,但是因为亚洲国家都缺IP所以也引进了很多外国段的IP,识别错误也很常见,需要更加注意。

内核模块和拥塞算法

更改拥塞控制算法可以让高延迟,高丢包的外网连接的更顺一点,所以改一下有益无害。

比如锐速之流是不太符合公平用网的规则的,就不推荐了。Linux内置的拥塞控制算法都不会影响网络大环境,请放心使用。

首先看一下有什么拥塞控制算法可以用:

sysctl net.ipv4.tcp_available_congestion_control

一般是cubic和rino,他们是默认的。

更新: 现在最为流行的拥塞控制算法变成了Google贡献的bbr算法,时代的进步真快~

bbr算法从Linux Kernel 4.9开始内置,但是CentOS7内置的内核是3.x的,所以需要把内核换掉。

极其强调:换内核可能存在一定的潜在风险,而且可能引起依赖冲突,更换需谨慎

自己编译内核的麻烦比较多,也很慢,所幸ELRepo提供了预先编译好的内核源,下面就以此来介绍一下如何更换内核为4.16(这个版本号是当前的mainline version)

根据官网的介绍,先引入ELRepo源的GPG Key:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

然后安装ELRepo源:

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

然后就可以开始安装内核包了:

#先更新一下
yum update -y
#这里可能会卸载掉很多依赖kernel-headers的包,比如gcc-c++,一定要记录下来,一会装回来
#如果是干净安装的系统的话,这时候就没有那么多依赖会被影响,所以建议换内核要趁早
yum remove kernel-headers kernel-tools kernel-tools-libs
#安装新内核,这里一口气装上所有内核组件
yum --disableexcludes=main --disablerepo=\* --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel kernel-ml-headers kernel-ml-tools kernel-ml-tools-libs kernel-ml-tools-libs-devel perf python-perf

因为@update源中的kernel还会继续更新,而且一旦自动更新的话会更新grub为更新的内核,所以需要禁用掉yum更新内核的功能,修改/etc/yum.conf,在[main]下面添加:

exclude=kernel*

这样以后就无法再直接使用yum进行内核的更新了,如果需要操作的话,要加上–disableexcludes=main,也就是使用上面安装的命令进行更新。

然后让我们查看一下现在有什么内核:

grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2

比如我现在就有这些:

CentOS Linux (4.16.12-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (4.16.11-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-862.3.2.el7.x86_64) 7 (Core)
CentOS Linux 7 Rescue 0997f6d10bb7477a9a48341847d72497 (3.10.0-693.2.2.el7.x86_64)
CentOS Linux (0-rescue-96aa007d97204c57aebfaf6879824e56) 7 (Core)

把引导设置为刚安装的最新内核:

grub2-set-default 'CentOS Linux (4.16.12-1.el7.elrepo.x86_64) 7 (Core)'

现在可以重启了,之后用uname -a或者装逼神器neofetch看一下内核版本,如果是刚才选中那个,那你就成功了~

现在我们回到优化网络的话题上来,首先加载bbr拥塞控制算法的kernel mod:

/sbin/modprobe bbr
# 一些新版本的内核可能换了一个名称,如果不行的话试一下下面这种写法
/sbin/modprobe tcp_bbr

修改/etc/sysctl.conf,添加以下配置

net.ipv4.tcp_congestion_control=bbr
net.core.default_qdisc=fq

执行sysctl -p可以让配置生效,可以考虑重启一下机器。

参考配置

以下修改/etc/sysconfig/network-scripts/ifcfg-eth0,systemctl restart network生效。

注意,修改这个设置主要适用于使用snapshot功能换机器/新增IPv6支持等情况,正常情况下服务商会配置好这个文件的。正常情况下,仅根据需求增加IPv6 Forwarding的配置即可。

# 设备名
DEVICE=eth0
# 使用DHCP获取IPv4地址,默认如此
BOOTPROTO=dhcp
# 开机时启动,一定不要关掉
ONBOOT=yes
# 以太网类型
TYPE=Ethernet
# 不由Network Manager控制,因为服务器在远程,这个设置一定不要修改,否则容易出现问题
NM_CONTROLLED=no
# 不使用ZEROCONF协议,默认如此
NOZEROCONF=yes
# 防火墙的zone,默认pulic,用于对外
ZONE=public
# 默认DNS,选Google的就行了
DNS1=8.8.8.8

# 启用IPv6
IPV6INIT=yes
# 启用IPv6自动配置
IPV6_AUTOCONF=yes
# 启用IPv6转发,这个跟下面的配置文件相关,这里不开,下面的IPv6转发就不要开,反之亦然
IPV6FORWARDING=yes
# IPv6 DNS,这里用的是Google的
DNS2=2001:4860:4860::8888

以下需要修改/etc/sysctl.conf,sysctl -p生效。

这里仅仅启用需要的功能,不考虑网络参数的优化,如果有那些需求,可以去拓展阅读一些运维方面的文章。

# 修改最大文件数量,有爬虫需求的一定把这个值改大
fs.file-max=65535
# 开启IPv4转发
net.ipv4.ip_forward=1
# IPv4拥塞控制算法使用bbr
net.ipv4.tcp_congestion_control=bbr
# 队列方式使用fq,匹配上面的bbr算法
net.core.default_qdisc=fq
# 开启IPv6 RA包转发,可能在自建6in4 Tunnel的情况下用到
net.ipv6.conf.all.accept_ra = 2
# 开启IPv6转发,要跟上面的网络配置相匹配
net.ipv6.conf.all.forwarding = 1