一、Sysctl命令拿来配置与显示在/proc/sys目录中的内核参数.假若想使参数常年保存,可以通过编辑/etc/sysctl.conf文件来实现。
命令格式:
sysctl[-n][-e]-wvariable=value
sysctl[-n][-e]-p(default/etc/sysctl.conf)
sysctl[-n][-e]–a
常用参数的意义:
-w临时改变某个指定参数的值,如
#sysctl-wnet.ipv4.ip_forward=1
-a显示所有的系统参数
-p从指定的文件加载系统参数,默认从/etc/sysctl.conf文件中加载,如:
#echo1>/proc/sys/net/ipv4/ip_forward
#sysctl-wnet.ipv4.ip_forward=1
以上两种方式都可能立刻开启路由功能linux设置默认网关,但若果系统重启,或执行了
#servicenetworkrestart
命令,所设置的值即会遗失,假如想永久保留配置,可以更改/etc/sysctl.conf文件linux培训学校,将net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1
二、linux内核参数调整:linux内核参数调整有两种方法
方式一:更改/proc下内核参数文件内容,不能使用编辑器来更改内核参数文件,理由是因为内核随时可能修改那些文件中的任意一个,另外,这种内核参数文件都是虚拟文件,实际中不存在,因而不能使用编辑器进行编辑,而是使用echo命令linux内核参数详解,之后从命令行将输出重定向至/proc下所选取的文件中。如:将timeout_timewait参数设置为30秒:
#echo30>/proc/sys/net/ipv4/tcp_fin_timeout
参数更改后立刻生效,并且重启系统后,该参数又恢复成默认值。为此,想永久修改内核参数,须要更改/etc/sysctl.conf文件
方式二.更改/etc/sysctl.conf文件。检测sysctl.conf文件,假如早已包含须要更改的参数,则更改该参数的值,假如没有须要更改的参数,在sysctl.conf文件中添加参数。如:
net.ipv4.tcp_fin_timeout=30
保存退出后,可以重启机器使参数生效,假如想使参数马上生效,也可以执行如下命令:
#sysctl-p
三、sysctl.conf文件中参数设置及说明
proc/sys/net/core/wmem_max
最大socket写buffer,可参考的优化值:873200
/proc/sys/net/core/rmem_max
最大socket读buffer,可参考的优化值:873200
/proc/sys/net/ipv4/tcp_wmem
TCP写buffer,可参考的优化值:8192436600873200
/proc/sys/net/ipv4/tcp_rmem
TCP读buffer,可参考的优化值:32768436600873200
/proc/sys/net/ipv4/tcp_mem
同样有3个值,意思是:
net.ipv4.tcp_mem[0]:高于此值,TCP没有显存压力.
net.ipv4.tcp_mem[1]:在此值下,步入显存压力阶段.
net.ipv4.tcp_mem[2]:低于此值,TCP拒绝分配socket.
上述显存单位是页,而不是字节.可参考的优化值是:786432864
/proc/sys/net/core/netdev_max_backlog
步入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000
/proc/sys/net/core/somaxconn
listen()的默认参数,挂起恳求的最大数目.默认是128.对忙碌的服务器,降低该值有助于网路性能.可调整到256.
/proc/sys/net/core/optmem_max
socketbuffer的最大初始化值,默认10K
/proc/sys/net/ipv4/tcp_max_syn_backlog
步入SYN包的最大恳求队列.默认1024.对重负载服务器,可调整到2048
/proc/sys/net/ipv4/tcp_retries2
TCP失败重传次数,默认值15,意味注重传15次才彻底舍弃.可降低到5,尽快释放内核资源.
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
这3个参数与TCPKeepAlive有关.默认值是:
tcp_keepalive_time=7200seconds(2hours)
tcp_keepalive_probes=9
tcp_keepalive_intvl=75seconds
意思是假如某个TCP联接在idle2个小时后,内核才发起probe.假如probe9次(每次75秒)不成功,内核才彻底舍弃,觉得该联接已失效.对服务器而言,其实上述值太大.可调整到:
/proc/sys/net/ipv4/tcp_keepalive_time1800
/proc/sys/net/ipv4/tcp_keepalive_intvl30
/proc/sys/net/ipv4/tcp_keepalive_probes3
/proc/sys/net/ipv4/ip_local_port_range
指定端口范围的一个配置,默认是3276861000,已够大.
net.ipv4.tcp_syncookies=1
表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN功击,默认为0,表示关掉;
net.ipv4.tcp_tw_reuse=1
表示开启重用。准许将TIME-WAITsockets重新用于新的TCP联接,默认为0,表示关掉;
net.ipv4.tcp_tw_recycle=1
表示开启TCP联接中TIME-WAITsockets的快速回收,默认为0,表示关掉。
net.ipv4.tcp_fin_timeout=30
表示假如套接字由本端要求关掉,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time=1200
表示当keepalive起用的时侯,TCP发送keepalive消息的频率。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range=102465000
表示用于向外联接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog=8192
表示SYN队列的宽度,默认为1024,加强队列宽度为8192,可以容纳更多等待联接的网路联接数。
net.ipv4.tcp_max_tw_buckets=5000
表示系统同时保持TIME_WAIT套接字的最大数目,假如超过这个数字,TIME_WAIT套接字将立即被消除并复印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以挺好地降低TIME_WAIT套接字数目,而且对于Squid,疗效却不大。此项参数可以控制TIME_WAIT套接字的最大数目,防止Squid服务器被大量的TIME_WAIT套接字拖死。
Linux上的NAT与iptables
谈起Linux上的NAT,大多数人会跟你提及iptables。缘由是由于iptables是目前在linux上实现NAT的一个特别好的插口。它通过和内核级直接操作网路包,效率和稳定性都十分高。这儿简单罗列一些NAT相关的iptables实例命令linux内核参数详解,可能对于大多数实现有多帮助。
这儿说明一下,为了节约篇幅,这儿把打算工作的命令略去了,仅仅列举核心步骤命令,所以假如你单单执行这种没有实现功能的话,很可能因为打算工作没有做好。假如你对整个命令细节感兴趣的话,可以直接访问我的《如何让你的Linux网段更强悍》系列文章,其中对于各个脚本有详尽的说明和描述。
#案例1:实现网段的MASQUERADE
#具体功能:外网网卡是eth1,内网eth0,致使外网指定本服务做网段可以访问内网
EXTERNAL="eth0"
INTERNAL="eth1"
#这一步开启ip转发支持,这是NAT实现的前提
echo1>/proc/sys/net/ipv4/ip_forward
iptables-tnat-APOSTROUTING-o$EXTERNAL-jMASQUERADE
#案例2:实现网段的简单端口映射
#具体功能:实现内网通过访问网段的外部ip:80,可以直接达到访问私有网路内的一台主机192.168.1.10:80疗效
LOCAL_EX_IP=11.22.33.44#设定网段的内网卡ip,对于多ip情况,参考《如何让你的Linux网段更强悍》系列文章
LOCAL_IN_IP=192.168.1.1#设定网段的外网卡ip
INTERNAL="eth1"#设定外网卡
#这一步开启ip转发支持,这是NAT实现的前提
echo1>/proc/sys/net/ipv4/ip_forward
#加载须要的ip模块,下边两个是ftp相关的模块,假如有其他特殊需求,也须要加进来
modprobeip_conntrack_ftp
modprobeip_nat_ftp
#这一步实现目标地址指向网段外部ip:80的访问都吧目标地址改成192.168.1.10:80
iptables-tnat-APREROUTING-d$LOCAL_EX_IP-ptcp--dport80-jDNAT--to192.168.1.10
#这一步实现把目标地址指向192.168.1.10:80的数据包的源地址改成网段自己的本地ip,这儿是192.168.1.1
iptables-tnat-APOSTROUTING-d192.168.1.10-ptcp--dport80-jSNAT--to$LOCAL_IN_IP
#在FORWARD链上添加到192.168.1.10:80的准许,否则不能实现转发
iptables-AFORWARD-o$INTERNAL-d192.168.1.10-ptcp--dport80-jACCEPT
#通过里面重要的三句话以后,实现的疗效是,通过网段的内网ip:80访问,全部转发到外网的192.168.1.10:80端口,实现典型的端口映射
#非常注意,所有被转发过的数据都是源地址是网段外网ip的数据包,所以192.168.1.10上看见的所有访问都似乎是网段发过来的一样,而看不到外部ip
#一个重要的思想:数据包按照“从哪儿来,回那里去”的策略来走,所以何必害怕回头数据的问题
#如今还有一个问题,网段自己访问自己的内网ip:80,是不会被NAT到192.168.1.10的,这不是一个严重的问题,但让人很不爽,解决的方式如下:
iptables-tnat-AOUTPUT-d$LOCAL_EX_IP-ptcp--dport80-jDNAT--to192.168.1.10
获取系统中的NAT信息和确诊错误
了解/proc目录的意义
在Linux系统中,/proc是一个特殊的目录,proc文件系统是一个伪文件系统,它只存在显存当中,而不占用外存空间。它包含当前系统的一些参数(variables)和状态(status)情况。它以文件系统的方法为访问系统内核数据的操作提供插口
通过/proc可以了解到系统当前的一些重要信息,包括c盘使用情况,显存使用状况,硬件信息,网路使用情况等等,好多系统监控工具(如HotSaNIC)都通过/proc目录获取系统数据。
另一方面通过直接操作/proc中的参数可以实现系统内核参数的调节,例如是否容许ip转发,syn-cookie是否打开,tcp超时时间等。
获得参数的方法:
第一种:cat/proc/xxx/xxx,如cat/proc/sys/net/ipv4/conf/all/rp_filter
第二种:sysctlxxx.xxx.xxx,如sysctlnet.ipv4.conf.all.rp_filter
改变参数的方法:
第一种:echovalue>/proc/xxx/xxx,如echo1>/proc/sys/net/ipv4/conf/all/rp_filter
第二种:sysctl[-w]variable=value,如sysctl[-w]net.ipv4.conf.all.rp_filter=1
以上设定系统参数的方法只对当前系统有效,重起系统就没了,想要保存出来,须要写入/etc/sysctl.conf文件中
通过执行man5proc可以获得一些关于proc目录的介绍
查看系统中的NAT情况
和NAT相关的系统变量
/proc/slabinfo:内核缓存使用情况统计信息(Kernelslaballocatorstatistics)
/proc/sys/net/ipv4/ip_conntrack_max:系统支持的最大ipv4联接数,默认65536(事实上这也是理论最大值)
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established已完善的tcp联接的超时时间,默认432000,也就是5天
和NAT相关的状态值
/proc/net/ip_conntrack:当前的前被跟踪的联接状况,nat翻译表就在这儿彰显(对于一个网段为主要功能的Linux主机,上面大部份信息是NAT翻译表)
/proc/sys/net/ipv4/ip_local_port_range:本地开放端口范围,这个范围同样会间接限制NAT表规模
#1.查看当前系统支持的最大联接数
cat/proc/sys/net/ipv4/ip_conntrack_max
#值:默认65536,同时这个值和你的显存大小有关,假如显存128M,这个值最大8192,1G以上显存这个值都是默认65536
#影响:这个值决定了你作为NAT网段的工作能力上限,所有局域网内通过这台网段对外的联接都将占用一个联接,假如这个值太低,将会影响吞吐量
#2.查看tcp联接超时时间
cat/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
#值:默认432000(秒),也就是5天
#影响:这个值过大将造成一些可能早已不用的联接常驻于显存中,占用大量链接资源,因而可能造成NATip_conntrack:tablefull的问题
#建议:对于NAT负载相对本机的NAT表大小很紧张的时侯,可能须要考虑缩小这个值,以尽快消除联接,保证有可用的联接资源;假如不紧张,不选修改
#3.查看NAT表使用情况(判定NAT表资源是否紧张)
#执行下边的命令可以查看你的网段中NAT表情况
cat/proc/net/ip_conntrack
#4.查看本地开放端口的范围
cat/proc/sys/net/ipv4/ip_local_port_range
#返回两个值,最小值和最大值
#下边的命令帮你明晰一下NAT表的规模
wc-l/proc/net/ip_conntrack
#或则
grepip_conntrack/proc/slabinfo|grep-vexpect|awk'{print$1','$2;}'
#下边的命令帮你明晰可用的NAT表项,假如这个值比较大,那就说明NAT表资源不紧张
grepip_conntrack/proc/slabinfo|grep-vexpect|awk'{print$1','$3;}'
#下边的命令帮你统计NAT表中占用端口最多的几个ip,很有可能那些家伙再做一些bt的事情,嗯bt的事情:-)
cat/proc/net/ip_conntrack|cut-d''-f10|cut-d'='-f2|sort|uniq-c|sort-nr|head-n10
#前面这个命令有点瑕疵cut-d''-f10会由于命令输出有些行缺项而导致统计误差,下边给出一个正确的写法:
cat/proc/net/ip_conntrack|perl-pes/^(.*?)src/src/g|cut-d''-f1|cut-d'='-f2|sort|uniq-c|sort-nr|head-n10