kk Blog —— 通用基础


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

关闭非业务端口

查看本机监听的端口

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:

发包时丢弃的数据包