kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp

Linux中使用Dnsmasq部署DNS服务

是所有域名解析到同一地址

1
address=/#/192.168.2.1
1
2
3
address=/com/192.168.2.1
address=/net/192.168.2.1
address=/cn/192.168.2.1

libvirtd 服务会占用 53端口,需要限停用:

虚拟网卡virbr0


https://ywnz.com/linuxyffq/2267.html

Dnsmasq提供了DNS缓存、DHCP服务与Tftp服务功能。本文将用它在Linux中部署DNS服务,作为域名解析服务器(DNS),Dnsmasq可以通过缓存DNS请求来提高对访问过的网址的连接速度。作为DHCP服务器,Dnsmasq可以为局域网电脑提供内网ip地址和路由。DNS和DHCP两个功能可以同时或分别单独实现。Dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个PXE服务器。

Dnsmasq工作原理

当接受到一个DNS请求时,Dnsmasq首先会查找/etc/hosts这个文件,然后查找/etc/resolv.conf中定义的外部DNS。所以说Dnsmasq是一个很不错的外部DNS中继。

配置Dnsmasq为DNS缓存服务器,同时在/etc/hosts文件中加入本地内网解析,这样一来每当内网机器查询时就会优先查询hosts文件,这就等于将/etc/hosts共享给全内网机器使用,从而解决内网机器互相识别的问题。相比逐台机器编辑hosts文件或者添加Bind DNS记录,仅编辑一个hosts文件,这简直太容易了。

安装Dnsmasq

1
2
$ apt-get install dnsmasq
$ yum install dnsmasq

配置Dnsmasq

Dnsmasq处理DNS设置与BIND等其他DNS服务有所不同。所有的配置都在一个文件中完成/etc/dnsmasq.conf。默认情况下dnsmasq.conf中只开启了最后include项,可以在/etc/dnsmasq.d中自己写任意名字的配置文件。

配置文件说明

Dnsmasq配置文件是/etc/dnsmasq.conf,下面对Dnsmasq中和DNS相关的配置项进行说明。

port=53

用指定的端口代替默认的DNS 53端口,如果设置为0,则完全禁止DNS功能,只使用dhcp服务

以下两个参数告诉Dnsmasq过滤一些查询:

domain-needed 从不转发格式错误的域名

bogus-priv 从不转发不在路由地址中的域名

resolv-file

配置Dnsmasq额外的向流的DNS服务器,如果不开启就使用linux主机默认的/etc/resolv.conf里的nameserver,通过下面的选项指定其他文件。

1
resolv-file=/etc/dnsmasq.d/upstream_dns.conf

strict-order

默认情况下Dnsmasq会发送查询到它的任何上游DNS服务器上,如果取消注释,则Dnsmasq则会严格按照/etc/resolv.conf中的DNS Server顺序进行查询。

上游服务器

以下两个参数控制是否通过/etc/resolv.conf确定上游服务器,是否检测/etc/resolv.conf的变化,则取消注释。

no-resolv 如果你不想Dnsmasq读取/etc/resolv.conf文件或者其他文件,获得它的servers

no-poll 如果你不允许Dnsmasq通过轮询/etc/resolv.conf或者其他文件来获取配置的改变,则取消注释。

增加一个name server,一般用于内网域名

1
server=/localnet/192.168.0.1

设置一个反向解析,所有192.168.3.0/24的地址都到10.1.2.3去解析

1
server=/3.168.192.in-addr.arpa/10.1.2.3

增加一个本地域名,会在/etc/hosts中进行查询

1
local=/localnet/

增加一个域名,强制解析到你指定的地址上

1
address=/double-click.net/127.0.0.1

同上,还支持ipv6

1
address=/www.thekelleys.org.uk/fe80::20d:60ff:fe36:f83

增加查询yahoo google和它们的子域名到vpn、search查找

1
ipset=/yahoo.com/google.com/vpn,search

你还可以控制Dnsmasq和Server之间的查询从哪个网卡出去

1
server=10.1.2.3@eth1

指定源地址携带10.1.2.3地址和192.168.1.1的55端口进行通讯

1
server=10.1.2.3@192.168.1.1#55

改变Dnsmasq默认的uid和gid

1
2
user=
group=

如果你想Dnsmasq监听某个端口为dhcp、dns提供服务

1
interface=

你还可以指定哪个端口你不想监听

1
except-interface=

设置想监听的地址,如果你本机要使用写上127.0.0.1。

1
listen-address=

如果你想在某个端口只提供dns服务,则可以进行配置禁止dhcp服务

1
no-dhcp-interface=

On systems which support it, dnsmasq binds the wildcard address, even when it is listening on only some interfaces. It then discards requests that it shouldn’t reply to. This has the advantage of working even when interfaces come and go and change address. If you want dnsmasq to really bind only the interfaces it is listening on, uncomment this option. About the only time you may need this is when running another nameserver on the same machine.

1
bind-interfaces

如果你不想使用/etc/hosts,则取消下面的注释

1
no-hosts

如果你项读取其他类似/etc/hosts文件,则进行配置

1
addn-hosts=/etc/banner_add_hosts

自动的给hosts中的name增加一个域名

1
expand-hosts

给dhcp服务赋予一个域名

1
domain=thekelleys.org.uk

给dhcp的一个子域赋予一个不同的域名

1
domain=wireless.thekelleys.org.uk,192.168.2.0/24

同上,不过子域是一个范围

1
domain=reserved.thekelleys.org.uk,192.68.3.100,192.168.3.200

dhcp分发ip的范围,以及每个ip的租约时间

1
dhcp-range=192.168.0.50,192.168.0.150,12h

同上,不过给出了掩码

1
dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h

自动加载conf-dir目录下的配置文件

1
conf-dir=/etc/dnsmasq.d

设置dns缓存大小,默认为150条

1
cache-size=150

配置实例

配置上游服务器地址

resolv-file配置Dnsmasq额外的上游的DNS服务器,如果不开启就使用Linux主机默认的/etc/resolv.conf里的nameserver。

1.通过下面的选项指定其他文件来管理上游的DNS服务器

1
2
$ vi /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf

2.在指定文件中增加转发DNS的地址

1
2
3
$ vi /etc/resolv.dnsmasq.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

本地启用Dnsmasq解析

1
2
$ vi /etc/resolv.conf
nameserver 127.0.0.1

添加解析记录

1.使用系统默认hosts

编辑hosts文件,简单列举一下格式

1
2
3
4
5
$ vi /etc/hosts

127.0.0.1  localhost
192.168.101.107   web01.mike.com web01
192.168.101.107   web02.mike.com web02

2.使用自定义hosts文件

修改配置,增加自定义hosts文件位置。

1
2
$ vi /etc/dnsmasq.conf
addn-hosts=/etc/dnsmasq.hosts

在/etc/dnsmasq.hosts文件中添加DNS记录

1
2
3
$ vi /etc/dnsmasq.hosts
192.168.101.107   web01.mike.comweb01
192.168.101.107   web02.mike.comweb02

3.使用自定义conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vi /etc/dnsmasq.d/address.conf

# 指定dnsmasq默认查询的上游服务器,此处以Google Public DNS为例。
server=8.8.8.8
server=8.8.4.4

# 把所有.cn的域名全部通过114.114.114.114这台国内DNS服务器来解析
server=/cn/114.114.114.114

# 给*.apple.com和taobao.com使用专用的DNS
server=/taobao.com/223.5.5.5
server=/.apple.com/223.5.5.5

# 把ywnz.com的二级域名(比如前面加www)解析到特定的IP
address=/ywnz.com的二级域名(比如前面加www)/192.168.101.107

在这里ywnz.com相当于*.mike.com泛解析
address=/ywnz.com/192.168.101.107

注:也可以直接添加到/etc/dnsmasq.conf中,不过/etc/dnsmasq.d/*.conf的优先级大于/etc/dnsmasq.conf。

修改iptables配置

1.允许本机的53端口可对外访问

1
2
$ iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
$ iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT

2.转发DNS请求

1
2
$ echo '1' > /proc/sys/net/ipv4/ip_forward
$ echo '1' > /proc/sys/net/ipv6/ip_forward   # IPv6 用户选用

添加流量转发规则,将外部到53的端口的请求映射到Dnsmasq服务器的53端口

1
2
$ iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
$ iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53

如果要限制只允许内网的请求,方法如下

1
$ iptables -t nat -A PREROUTING -i eth1 -p upd --dport 53 -j REDIRECT --to-port 53

3.保存规则并重启

1
2
$ service iptables save
$ service iptables restart

测试Dnsmasq

1.启动Dnsmasq

1
$ service dnsmasq start

2.测试Dnsmasq

将其他机器的DNS换成dnsmasq所在的IP即可,就这么容易。

1
$ dig @192.168.101.104 ywnz.com

一些Dnsmasq技巧

Dnsmasq性能优化

我们都知道Bind不配合数据库的情况下,经常需要重新载入并读取配置文件,这是造成性能低下的原因。根据这点教训,我们可以考虑不读取/etc/hosts文件。而是另外指定一个在共享内存里的文件,比如/dev/shm/dnsrecord.txt ,这样就不费劲了,又由于内存的非持久性,重启就消失,可以定期同步硬盘上的某个内容到内存文件中。

具体实现步骤:

1.配置dnsmasq

1
2
3
4
$ vim /etc/dnsmasq.conf

no-hosts
addn-hosts=/dev/shm/dnsrecord.txt

2.解决同步问题

开机启动

1
$ echo "cat /etc/hosts > /dev/shm/dnsrecord.txt" >>/etc/rc.local

定时同步内容

1
2
3
$ crontab -e

*/10 * * * * cat /etc/hosts > /dev/shm/dnsrecord.txt

Dnsmasq选择最快的上游DNS服务器

经常会有这样的情景,Dnsmasq服务器配了一堆上游服务器,转发本地的dns请求,缺省是Dnsmasq事实上是只挑了一个上游dns服务器来查询并转发结果,这样如果选错服务器的话会导致DNS响应变慢。

1
2
3
4
5
6
$ vi /etc/dnsmasq.conf

all-servers

server=8.8.8.8
server=219.141.136.10

all-servers表示对以下设置的所有server发起查询,选择回应最快的一条作为查询结果返回。

上面我们设置了两个dns server,8.8.8.8(谷歌dns)和219.141.136.10(移动的dns),会同时查询这两个服务器,询问dns地址谁返回快就采用谁的结果。

关闭非业务端口

查看本机监听的端口

1
2
3
4
5
6
7
netstat -ltunp

l: listen
t: tcp
u: udp
n: --numeric 不解析名称
p: --programs
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
netstat -ltunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1523/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1312/cupsd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1978/master
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1062/rpcbind
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      2008/dnsmasq
tcp6       0      0 :::22                   :::*                    LISTEN      1523/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      1312/cupsd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1978/master
tcp6       0      0 :::443                  :::*                    LISTEN      1999/httpd
tcp6       0      0 :::3306                 :::*                    LISTEN      1717/mariadbd
tcp6       0      0 :::111                  :::*                    LISTEN      1062/rpcbind
tcp6       0      0 :::80                   :::*                    LISTEN      1999/httpd
udp        0      0 0.0.0.0:54212           0.0.0.0:*                           1110/avahi-daemon:
udp        0      0 192.168.122.1:53        0.0.0.0:*                           2008/dnsmasq
udp        0      0 0.0.0.0:67              0.0.0.0:*                           2012/dnsmasq
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1062/rpcbind
udp        0      0 127.0.0.1:323           0.0.0.0:*                           1079/chronyd
udp        0      0 0.0.0.0:806             0.0.0.0:*                           1062/rpcbind
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           1110/avahi-daemon:
udp        0      0 0.0.0.0:44291           0.0.0.0:*                           53849/local
udp6       0      0 :::111                  :::*                                1062/rpcbind
udp6       0      0 ::1:323                 :::*                                1079/chronyd
udp6       0      0 :::806                  :::*                                1062/rpcbind

1. avahi-daemon

Avahi允许程序在不需要进行手动网络配置的情况 下,在一个本地网络中发布和获知各种服务和主机。例如,当某用户把他的计算机接入到某个局域网时,如果他的机器运行有Avahi服务,则Avahi程式自 动广播,从而发现网络中可用的打印机、共享文件和可相互聊天的其他用户。这有点象他正在接收局域网中的各种网络广告一样。

Linux下系统实际启动的进程名,是avahi-daemon

除非你有兼容的设备或使用 zeroconf 协议的服务,否则应该关闭它。

1
2
3
service avahi-daemon stop
service avahi-daemon.socket stop
chkconfig avahi-daemon off

2. port 631

目前的Linux发行版本基本上都使用cups作为Linux下管理打印的服务应用。CUPS软件为Unix/Linux用户提供了有效而可靠的方式来管理打印的方法。它生来就支持IPP,并有LPD、SMB和JetDirect接口。CUPS本身可以提供网络打印机功能,使用它可以非常方便的令Linux与Linux之间、Linux与Windows之间实现打印共享。

使用浏览器访问http://127.0.0.1:631/

1
2
3
4
5
service cups stop
service cups.socket stop
service cups.path stop

chkconfig cups off

3. port 25

SMTP 邮件相关

1
2
3
4
lsof -i tcp:25
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
master  1957 root   13u  IPv4  21979      0t0  TCP localhost:smtp (LISTEN)
master  1957 root   14u  IPv6  21980      0t0  TCP localhost:smtp (LISTEN)
1
2
systemctl list-unit-files | grep post
systemctl disable --now postfix.service

port 53 67

dnsmasq

Dnsmasq提供了DNS缓存、DHCP服务与Tftp服务功能。本文将用它在Linux中部署DNS服务,作为域名解析服务器(DNS),Dnsmasq可以通过缓存DNS请求来提高对访问过的网址的连接速度。作为DHCP服务器,Dnsmasq可以为局域网电脑提供内网ip地址和路由。DNS和DHCP两个功能可以同时或分别单独实现。Dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个PXE服务器。

port 323

Chrony是NTP(Network Time Protocol,网络时间协议,服务器时间同步的一种协议)的另一种实现,与ntpd不同,它可以更快且更准确地同步系统时钟,最大程度的减少时间和频率误差。

在CentOS6中,默认是使用ntpd来同步时间的,但ntpd同步时间并不理想,有可能需要数小时来同步时间。而且ntp也已经很老了。所以在Centos7中换成了chrony来实现时间同步。chrony并且兼容ntpd监听在udp123端口上,自己则监听在udp的323端口上。

port 111

NFS文件共享.NFS依靠远程过程调用(RPC)在客户端和服务器端路由请求。在Linux下RPC服务由portmap服务控制.

为了共享和加载NFS文件系统,下面的服务要一起工作:

1
2
3
* nfs - 启动相应RPC服务进程来服务对于NFS文件系统的请求.
* nfslock - 一个可选的服务,用于启动相应的RPC进程,允许NFS客户端在服务器上对文件加锁.
* portmap - Linux的RPC服务,它响应RPC服务的请求和与请求的RPC服务建立连接.

下面的RPC进程在后台一起工作服务于NFS服务:

1
2
3
4
5
6
7
8
9
10
11
12
* rpc.mountd - 这个进程接受来自NFS客户端的加载请求和验证请求的文件系统正在被输出.这个进程由NFS服务自动启动,不需要用户的配置.
* rpc.nfsd - 这个进程是NFS服务器.它和Linux核心一起工作来满足NFS客户端的动态需求,例如提供为每个NFS客户端的每次请求服务器线程.这个进程对应于nfs服务.
* rpc.lockd - 一个可选的进程,它允许NFS客户端在服务器上对文件加锁.这个进程对应于nfslock服务.
* rpc.statd - 这个进程实现了网络状态监控(NSM)RPC协议,通知NFS客户端什么时候一个NFS服务器非正常重启动.这个进程被nfslock服务自动启动,不需要用户的配置.
* rpc.rquotad - 这个进程对于远程用户提供用户配额信息. 这个进程被nfs服务自动启动,不需要用户的配置.

停用命令
service nfslock stop
chkconfig nfslock off

rpcbind服务停止命令
service portmap stop

https://blog.csdn.net/tjjingpan/article/details/81237308

http://www.linuxfly.org/post/72/

https://blog.51cto.com/holy2010/343888

http://www.manongjc.com/detail/23-crrktpmgggcujfu.html

http://www.wjhsh.net/pipci-p-12871993.html

https://www.cnblogs.com/archoncap/p/6179666.html

httpd常见配置

https://www.cnblogs.com/vathe/p/6907742.html

work常用配置

1
2
3
4
5
6
7
8
<IfModule worker.c>
StartServers         4
MaxClients         300     # 最大的请求并发数目
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25     # 每个子进程能同时创建的的线程数目
MaxRequestsPerChild  0     # 每个进程能处理的最大请求数目
</IfModule>

配置文件

1
2
3
/etc/httpd/conf/httpd.conf     主配置文件

/etc/httpd/conf.d/*.conf     辅助配置文件

配置文件语法检查及重新加载配置文件

1
2
3
[root@node1 conf]$ httpd -t
Syntax OK
[root@node1 conf]$ service httpd reload

修改监听的IP和Port

1
2
3
4
5
6
Listen  [IP:] PORT  [PROTOCOL]
IP     本机的IP,本机可能使用多个网卡,每个网卡可能使用多个IP,故而可以指定特定IP,不指定,默认为监听所有IP
PORT    端口号,不可省略
PROTOCOL  特定协议,例如 https

注:Listen指令在同一文件中,如果需要监听多个目标,Listen可以出现多次

服务器根目录

1
2
3
4
5
6
7
8
9
DocumentRoot "/var/www/html"

ServerName www.example.com:80   # 服务器名称

DirectoryIndex index.html  index.html.var # 站点主页面

AddDefaultCharset UTF-8     # 默认字符集

Alias /icons/ "/var/www/icons/"    # 路径别名

持久化配置

1
2
3
4
5
KeepAlive Off | On       # 是否开启长连接

MaxKeepAliveRequests 100  # 保持长连接最大个数

KeepAliveTimeout 15       #  单个连接最长连接时间

动态加载模块

1
2
3
LoadModule <mod_name> <mod_path>
<mod_name> 模块名称
<mod_path> 模块路径,支持使用相对路径,相对于ServerRoot  /etc/httpd

MPM(多路处理模块)配置

查看

1
2
httpd -l      # 查看静态模块
httpd -M      # 查看动态加载的模块

更换

1
2
3
4
5
6
7
8
CentOS 6
/etc/sysconfig/httpd
# HTTPD=/usr/sbin/httpd.worker    # 注释表示使用默认方式prefork工作,否则表示使用worker方式工作

CentOS7
/etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_worker_module modules/mod_mpm_worker.so
# 注释或打开相关代码

prefork常用配置

1
2
3
4
5
6
7
8
<IfModule prefork.c>
StartServers       8       #  起始开启的子进程数
MinSpareServers    5       #  最小空闲子进程数
MaxSpareServers   20       #  最大空闲子进程数
ServerLimit      256       #  最大的进程数
MaxClients       256       #  最大的请求并发数
MaxRequestsPerChild  4000  #  每个子进程最多能处理的请求数
</IfModule>

work常用配置

1
2
3
4
5
6
7
8
<IfModule worker.c>
StartServers         4
MaxClients         300     # 最大的请求并发数目
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25     # 每个子进程能同时创建的的线程数目
MaxRequestsPerChild  0     # 每个进程能处理的最大请求数目
</IfModule>

日志配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ErrorLog logs/error_log     # 错误日志目录

LogLevel warn               # 日志记录等级

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined   # 日志格式定义

%h:客户端IP地址;
%l:Remote User, 通常为一个减号(“-”);
%u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
%t:服务器收到请求时的时间;
%r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
%>s:响应状态码;
%b:响应报文的大小,单位是字节;不包括响应报文的http首部;
%{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
%{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;

站点访问控制可分为两类,基于文件路径控制和基于URL路径控制。

基于文件路径访问控制

1
2
3
4
5
6
7
8
9
10
<Directory "DocuRoot">
...
</Directory "DocuRoot">
<FILE "">
...
</FILE "">

<FileMatch "PATTERN">
...
</FileMatch "PATTERN">

基于URL路径访问控制

1
2
3
4
5
6
7
<Location "">
...
</Location "">

<LocationMatch "">
...
</LocationMatch "">

常见选项

1
2
3
4
5
6
7
8
9
10
11
Option
    Indexes     # 访问的url不存在时,返回父路径的索引列表
    Includes
    FollowSymLinks    # 允许跟踪链接文件所指向的文件
    SymLinksifOwnerMatch  # 仅允许跟踪链接文件属主
    ExecCGI               #  支持CGI脚本
    MultiViews
    All        所有选项,除了 MultiViews
    None    不支持上述选项

AllowOverride   no | yes  是否允许子目录重载特性

黑名单(白名单)

1
2
3
4
5
6
7
Order allow, deny

[ Allow | Deny ] from
    all
    example.org
    10.1.2.3
    10  172.20

基于用户的访问控制

用户认证类型

1
2
  基本认证:Basic,明文发送
  摘要认证:digest

虚拟用户:

仅用于访问某服务或获取某资源的凭证;

账号和密码的存储机制:

1
2
3
4
  文本文件:.htpasswd
  SQL数据库
  dbm:数据库引擎,提供API
  ldap:

配置

1
2
3
4
5
6
7
8
9
10
11
<Directory />
        Options none
        AllowOverride AuthConfig
        AuthType Basic     # 明文发送
        AuthName "admin area"   # 允许访问的用户
        AuthBasicProvider file
        AuthUserFile /etc/httpd/conf/.htpasswd
        Require valid-user     # 文件中所有用户均可访问
        Require group GROUP    # 指定组
        AuthGroupFile GROUP_FILE   # 指定组口令文件
</Directory>

生成认证文件.htpasswd

1
2
3
4
5
6
htpasswd [option] passwdfile username
    选项:
    -c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除原有内容
    -m:以md5的格式编码存储用户的密码信息
    -s:sha1加密用户密码;
    -D:删除指定用户

内核网络參数解释

http://t.zoukankan.com/lcchuguo-p-4171320.html

net.ipv4.tcp_timestamps = 1

说明:

该參数控制RFC 1323 时间戳与窗体缩放选项。默认情况下,启用时间戳与

窗体缩放,可是能够使用标志位进行控制。0位控制窗体缩放,1 位控制时间戳。

值为0(禁用 RFC 1323选项)

值为1(仅启用窗体缩放)

值为2(仅启用时间戳)

值为3(两个选项均启用)

net.ipv4.tcp_timestamps=0

说明:

时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到曾经用过的序列号。时间戳可以让内核接受这样的“异常”的数据包。这里须要将其关掉。

值为0(禁用时间戳)

值为1(启用时间戳)

仅仅有client和服务端都开启时间戳的情况下,才会出现能ping通不能建立tcp三次握手的情况,所以做为提供服务的公司,不可能保证全部的用户都关闭时间戳,这个功能,所以我们必须关闭时间戳,这样才干给所用用户提供正常的服务。

net.ipv4.tcp_window_scaling = 1

net.ipv4.tcp_sack = 1

使用 Selective ACK﹐它能够用来查找特定的遗失的数据报— 因此有助于高速恢复状态。该文件表示是否启用有选择的应答(Selective Acknowledgment),这能够通过有选择地应答乱序接收到的报文来提高性能(这样能够让发送者仅仅发送丢失的报文段)。(对于广域网通信来说这个选项应该启用,可是这会添加对 CPU 的占用。)

net.ipv4.tcp_fack = 1

打开FACK(Forward ACK)拥塞避免和高速重传功能。(注意,当tcp_sack设置为0的时候,这个值即使设置为1也无效)

net.ipv4.tcp_retrans_collapse = 1

net.ipv4.tcp_syn_retries = 5

对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,相应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可改动为2.这个值不过针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

net.ipv4.tcp_synack_retries = 5

tcp_synack_retries显示或设定 Linux 核心在回应 SYN 要求时会尝试多少次又一次发送初始 SYN,ACK 封包后才决定放弃。这是所谓的三段交握 (threeway handshake) 的第二个步骤。即是说系统会尝试多少次去建立由远端启始的 TCP 连线。tcp_synack_retries 的值必须为正整数,并不能超过 255。由于每一次又一次发送封包都会耗费约 30 至 40 秒去等待才决定尝试下一次又一次发送或决定放弃。tcp_synack_retries 的缺省值为 5,即每个连线要在约 180 秒 (3 分钟) 后才确定逾时.

net.ipv4.tcp_max_orphans = 131072

系统所能处理不属于不论什么进程的TCP sockets最大数量。假如超过这个数量,那么不属于不论什么进程的连接会被马上reset,并同一时候显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的减少这个限制,更应该添加这个值(假设添加了内存之后)。每一个孤儿套接字最多可以吃掉你64K不可交换的内存。

net.ipv4.tcp_max_tw_buckets = 5000

表示系统同一时候保持TIME_WAIT套接字的最大数量,假设超过这个数字,TIME_WAIT套接字将立马被清除并打印警告信息。默觉得180000。设为较小数值此项參数能够控制TIME_WAIT套接字的最大数量,避免server被大量的TIME_WAIT套接字拖死。

net.ipv4.tcp_keepalive_time = 7200

net.ipv4.tcp_keepalive_probes = 9

net.ipv4.tcp_keepalive_intvl = 75 用实例进行说明上述三个參数:

假设某个TCP连接在idle 2个小时后,内核才发起probe(探查).假设probe 9次(每次75秒既tcp_keepalive_intvl值)不成功,内核才彻底放弃,觉得该连接已失效。

net.ipv4.tcp_retries1 = 3

放弃回应一个TCP连接请求前﹐须要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐依据RTO的值大约在3秒 - 8分钟之间。(注意:这个值同一时候还决定进入的syn连接)

(另外一种解释:它表示的是TCP传输失败时不检測路由表的最大的重试次数,当超过了这个值,我们就须要检測路由表了)

net.ipv4.tcp_retries2 = 15

在丢弃激活(已建立通讯状况)的TCP连接之前﹐须要进行多少次重试。默认值为15,依据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值依据眼下的网络设置,能够适当地改小,我的网络内改动为了5)

(另外一种解释:表示重试最大次数,仅仅只是这个值一般要比上面的值大。和上面那个不同的是,当重试次数超过这个值,我们就必须放弃重试了)

net.ipv4.tcp_orphan_retries

主要是针对孤立的socket(也就是已经从进程上下文中删除了,但是另一些清理工作没有完毕).对于这样的socket,我们重试的最大的次数就是它

net.ipv4.tcp_fin_timeout = 30

表示假设套接字由本端要求关闭,这个參数决定了它保持在FIN-WAIT-2状态的时间

net.ipv4.tcp_tw_recycle = 1

表示开启TCP连接中TIME-WAITsockets的高速回收,默觉得0,表示关闭

net.ipv4.tcp_stdurg = 0

net.ipv4.tcp_rfc1337 = 0

net.ipv4.tcp_max_syn_backlog = 8192

表示SYN队列的长度,默觉得1024,加大队列长度为8192,能够容纳很多其它等待连接的网络连接数。

(另外一种解释:port最大backlog 内核限制。此參数限制服务端应用程序 能够设置的port最大backlog 值 (相应于port的 syn_backlog 和 backlog 队列长度)。动机是在内存有限的server上限制/避免应用程序配置超大 backlog 值而耗尽内核内存。假设应用程序设置 backlog 大于此值,操作系统将自己主动将之限制到此值。)

net.ipv4.tcp_abort_on_overflow = 0

当 tcp 建立连接的 3 路握手完毕后,将连接置入ESTABLISHED 状态并交付给应用程序的 backlog 队列时,会检查 backlog 队列是否已满。若已满,通常行为是将连接还原至 SYN_ACK状态,以造成 3 路握手最后的 ACK 包意外丢失假象 —— 这样在client等待超时后可重发 ACK —— 以再次尝试进入ESTABLISHED 状态 —— 作为一种修复/重试机制。假设启用tcp_abort_on_overflow 则在检查到 backlog 队列已满时,直接发 RST 包给client终止此连接 —— 此时client程序会收到 104Connection reset by peer 错误。

警告:启用此选项可能导致高峰期用户訪问体验到 104:Connection reset by peer 或白屏错误(视浏览器而定)。在考虑启用此选项前应先设法优化提高服务端应用程序的性能,使之能更快接管、处理连接。

net.ipv4.tcp_syncookies = 1

在 tcp 建立连接的 3 路握手过程中,当服务端收到最初的 SYN 请求时,会检查应用程序的 syn_backlog 队列是否已满。若已满,通常行为是丢弃此 SYN 包。若未满,会再检查应用程序的 backlog 队列是否已满。若已满而且系统依据历史记录推断该应用程序不会较快消耗连接时,则丢弃此 SYN 包。假设启用 tcp_syncookies 则在检查到 syn_backlog 队列已满时,不丢弃该 SYN 包,而改用 syncookie 技术进行 3 路握手。

警告:使用 syncookie 进行握手时,由于该技术挪用了 tcp_options 字段空间,会强制关闭 tcp 高级流控技术而退化成原始 tcp 模式。此模式会导致封包 丢失时 对端 要等待 MSL 时间来发现丢包事件并重试,以及关闭连接时 TIME_WAIT 状态保持 2MSL 时间。该技术应该仅用于保护syn_flood 攻击。假设在正常server环境中server负载较重导致 syn_backlog 和 backlog 队列满时,应优化服务端应用程序的负载能力,加大应用程序 backlog 值。只是,所幸该參数是自己主动值,仅在 syn_backlog 队列满时才会触发 (在队列恢复可用时此行为关闭)。

Ø 服务端应用程序设置portbacklog 值,内核理论上将同意该port最大同一时候接收 2*backlog 个并发连接”请求”(不含已被应用程序接管的连接) ——分别存放在 syn_backlog 和 backlog 队列—— 每一个队列的长度为backlog 值。syn_backlog 队列存储 SYN_ACK 状态的连接,backlog 则存储 ESTABLISHED 状态但尚未被应用程序接管的连接。

Ø syn_backlog 队列实际上是个 hash 表,而且 hash 表大小为 2 的次方。所以实际 syn_backlog 的队列长度要略大于应用程序设置的 backlog 值—— 取相应 2 的次方值。

Ø 当 backlog 值较小,而高峰期并发连接请求超高时,tcp 建立连接的三路握手 网络时延将成为瓶颈 —— 并发连接超高时,syn_backlog 队列将被充满而导致 can’t connect 错误。此时,再提高服务端应用程序的吞吐能力已不起作用,由于连接尚未建立,服务端应用程序并不能接管和处理这些连接—— 而是须要加大backlog 值 (syn_backlog 队列长度) 来缓解此问题。

Ø 启用 syncookie 尽管也能够解决超高并发时的can’t connect 问题,但会导致 TIME_WAIT 状态 fallback 为保持 2MSL 时间,高峰期时会导致client无可复用连接而无法连接server (tcp 连接复用是基于 <src_ip, src_port, dst_ip, dst_port> 四元组值必须不同样,就訪问同一个目标server而言,<src_ip, dst_ip, dst_port> 三元组值不变,所以此时可用的连接数限制为仅src_port 所同意数目,这里处于 TIME_WAIT 状态的同样 src_port 连接不可复用。Linux 系统甚至更严格,仅仅使用了 <src_ip, src_port, dst_ip> 三元组…)。故不建议依赖syncookie。

net.ipv4.tcp_orphan_retries = 0

本端试图关闭TCP连接之前重试多少次。缺省值是7,相当于50秒~16分钟(取决于RTO)。假设你的机器是一个重载的WEBserver,你应该考虑减低这个值,由于这种套接字会消耗非常多重要的资源。參见tcp_max_orphans

net.ipv4.tcp_sack = 1

SACK(SelectiveAcknowledgment,选择性确认)技术,使TCP仅仅又一次发送交互过程中丢失的包,不用发送兴许全部的包,并且提供对应机制使接收方能告诉发送方哪些数据丢失,哪些数据重发了,哪些数据已经提前收到了。如此大大提高了client与server端数据交互的效率。

net.ipv4.tcp_reordering = 3

net.ipv4.tcp_ecn = 2

net.ipv4.tcp_dsack = 1

同意TCP发送”两个全然同样”的SACK。

net.ipv4.tcp_mem = 178368 237824 356736

相同有3个值,意思是:

net.ipv4.tcp_mem[0]: 低于此值,TCP没有内存压力.

net.ipv4.tcp_mem[1]: 在此值下,进入内存压力阶段.

net.ipv4.tcp_mem[2]: 高于此值,TCP拒绝分配socket.

net.ipv4.tcp_wmem = 4096 16384 4194304

TCP写buffer,可參考的优化值: 8192436600 873200

net.ipv4.tcp_rmem = 4096 87380 4194304

TCP读buffer,可參考的优化值:32768 436600 873200

net.ipv4.tcp_app_win = 31

net.ipv4.tcp_adv_win_scale = 2

net.ipv4.tcp_tw_reuse = 1

表示开启重用。同意将TIME-WAITsockets又一次用于新的TCP连接,默觉得0,表示关闭;

net.ipv4.tcp_frto = 2

开启F-RTO,一个针对TCP重传超时(RTOs)的增强的恢复算法。在无线环境下特别故意处,由于在这样的环境下分组丢失典型地是由于随机无线电干扰而不是中间路由器组塞。參考RFC 4318了解很多其它的细节。

这个文件拥有下列值之中的一个:

Ø 0 禁用。

Ø 1 开启基本版本号的F-RTO算法。

Ø 2 假设流使用SACK的话,开启SACK-增强的F-TRO算法。只是当使用SACK时是基本版本号也是能够使用的,由于有这样的场景存在,F-RTO和开启SACK的TCP流分组计数合作不好。

net.ipv4.tcp_frto_response = 0

当F-RTO侦測到TCP超时是伪的时(比如,通过设置了更长的超时值避免了超时),TCP有几个选项决定接下来怎样去做。可能的值是:

Ø 1 基于速率减半;平滑保守的响应,导致一个RTT之后拥塞窗体(cwnd)和慢启动阀值(ssthresh)减半。

Ø 2很保守的响应;不推荐这样做,由于即时有效,它和TCP的其它部分交互不好;马上减半拥塞窗体(cwnd)和慢启动阀值(ssthresh)。

Ø 3侵占性的响应;废弃如今已知不必要的拥塞控制措施(或略一个将引起TCP更加慎重保守的丢失的重传);cwnd and ssthresh恢复到超时之前的值。

net.ipv4.tcp_slow_start_after_idle = 1

表示拥塞窗体在经过一段空暇时间后仍然有效而不必又一次初始化。

net.ipv4.tcp_low_latency = 0

同意 TCP/IP 协议栈适应在高吞吐量情况下低延时的情况;这个选项应该禁用。

net.ipv4.tcp_no_metrics_save = 0

一个tcp连接关闭后,把这个连接以前有的參数比方慢启动门限snd_sthresh,拥塞窗体snd_cwnd 还有srtt等信息保存到dst_entry中, 仅仅要dst_entry 没有失效,下次新建立同样连接的时候就能够使用保存的參数来初始化这个连接.tcp_no_metrics_save 设置为1就是不保持这些參数(经验值),每次建立连接后都又一次摸索一次. 我认为没什么优点. 所以系统默认把它设为0。

net.ipv4.tcp_moderate_rcvbuf = 1

打开了TCP内存自己主动调整功能(1为打开、0为禁止)

net.ipv4.tcp_tso_win_divisor = 3

单个TSO段可消耗拥塞窗体的比例,默认值为3。

net.ipv4.tcp_congestion_control = cubic

net.ipv4.tcp_available_congestion_control = cubic reno

net.ipv4.tcp_allowed_congestion_control = cubic reno

丢包使得TCP传输速度大幅下降的主要原因是丢包重传机制,控制这一机制的就是TCP拥塞控制算法。 congestion(拥塞)

Linux内核中提供了若干套TCP拥塞控制算法,已载入进内核的能够通过内核參数net.ipv4.tcp_available_congestion_control看到:

没有载入进内核的通常是编译成了模块,能够用modprobe载入,这些算法各自适用于不同的环境。

Ø reno是最主要的拥塞控制算法,也是TCP协议的实验原型。

Ø bic适用于rtt较高但丢包极为罕见的情况,比方北美和欧洲之间的线路,这是2.6.8到2.6.18之间的Linux内核的默认算法。

Ø cubic是改动版的bic,适用环境比bic广泛一点,它是2.6.19之后的linux内核的默认算法。

Ø hybla适用于高延时、高丢包率的网络,比方卫星链路。

加载tcp_hybl模块 modprobe tcp_hybla

TCP拥塞控制 算法对TCP传输速率的影响可非常大。

net.ipv4.tcp_abc = 0

net.ipv4.tcp_mtu_probing = 0

net.ipv4.tcp_fastopen

GoogleTFO特性,kernel 3.6以上版本号支持,详细实现方法參考本文档 Google TFO特性。

net.ipv4.tcp_base_mss= 512

分组层路径MTU发现(MTU探測)中使用的search_low的初始值。假设同意MTU探測,这个初始值就是连接使用的初始MSS值。

net.ipv4.route.min_adv_mss= 256

该文件表示最小的MSS(MaximumSegment Size)大小,取决于第一跳的路由器MTU。

net.ipv4.tcp_workaround_signed_windows = 0

net.ipv4.tcp_dma_copybreak= 4096

下限.以字节为单位.socket 的大小将卸载到一个 dma 复制引擎.假设存在一个在系统和内核配置为使用 config_net_dma 选项。

net.ipv4.tcp_max_ssthresh= 0

慢启动阶段,就是当前拥塞窗体值比慢启动阈值(snd_ssthresh)小的时候,所处的阶段就叫做慢启动阶段。

当我们收到一个新的ACK时,则会调用tcp_slow_start()这个函数,而且为拥塞窗体添加1.(Linux中拥塞窗体的值代表数据包的个数,而不是实际的发送

字节数目。实际能够发送的字节数等于能够发送的数据包个数*MSS。)

直到慢启动阶段出现数据包的丢失。

而引入了tcp_max_ssthresh 这个參数后,则能够控制在慢启动阶段拥塞窗体添加的频度。

默认这个參数不打开,假设这个參数的值设置为1000,则当拥塞窗体值大于1000时,

则没收到一个ACK,并不再添加拥塞窗体一个单位了,而是约收到2个ACK才添加一个窗体单位。收到2ACK并非决定值!!

须要依据当前的拥塞窗体值,tcp_max_ssthresh值进行推断。

net.ipv4.tcp_thin_linear_timeouts= 0

这个函数RTO超时的处理函数。假设是thin流,则不要新设RTO是原先的2倍。

net.ipv4.tcp_thin_dupack= 0

与tcp_thin_linear_timeouts同为高速重传算法參数

net.core.netdev_max_backlog=300

进入包的最大设备队列.默认是300,对重负载server而言,该值太低,可调整到1000。

ip link set eth0mtu 1500

设置网卡mtu大小。

IP 相关部份

net.ipv4.ip_local_port_range = 1024 65000

表示用于向外连接的port范围。缺省情况下非常小:32768到61000,改为1024到65000。

net.ipv4.ip_conntrack_max = 655360

在内核内存中netfilter能够同一时候处理的“任务”(连接跟踪条目)another

避免放大攻击

net.ipv4.icmp_echo_ignore_broadcasts = 1

开启恶意icmp错误消息保护

net.ipv4.icmp_ignore_bogus_error_responses = 1

开启SYN洪水攻击保护

net.ipv4.tcp_syncookies = 1

开启并记录欺骗,源路由和重定向包

net.ipv4.conf.all.log_martians = 1

net.ipv4.conf.default.log_martians = 1

处理无源路由的包

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.conf.default.accept_source_route = 0

开启反向路径过滤

net.ipv4.conf.all.rp_filter = 1

net.ipv4.conf.default.rp_filter = 1

确保无人能改动路由表

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.default.accept_redirects = 0

net.ipv4.conf.all.secure_redirects = 0

net.ipv4.conf.default.secure_redirects = 0

不充当路由器

net.ipv4.ip_forward = 0

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

开启execshild

kernel.exec-shield = 1

kernel.randomize_va_space = 1

网络相关部份(/sys)

sys/class/net/eth0/statistics.rx_packets:

收到的数据包数据

sys/class/net/eth0/statistics.tx_packets:

传输的数据包数量

sys/class/net/eth0/statistics.rx_bytes:

接收的字节数

sys/class/net/eth0/statistics.tx_bytes:

传输的字节数

sys/class/net/eth0/statistics.rx_dropped:

收包时丢弃的数据包

sys/class/net/eth0/statistics.tx_dropped:

发包时丢弃的数据包

CentOS 1G以内内存调优

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
echo 1 > /proc/sys/kernel/softlockup_panic

echo 0 > /proc/sys/net/mptcp/mptcp_enabled
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 0 >  /proc/sys/net/ipv4/tcp_max_tw_buckets
echo "4096 16384 256000" > /proc/sys/net/ipv4/tcp_wmem
echo "4096 16384 256000" > /proc/sys/net/ipv4/tcp_rmem
echo 6 > /proc/sys/net/ipv4/tcp_retries2
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
# echo 128 > /proc/sys/net/ipv4/tcp_max_syn_backlog

echo 99 > /proc/sys/vm/swappiness
service irqbalance stop

#rm -rf /usr/local/share/aliyun-assist/