设为首页 收藏本站
查看: 627|回复: 0

[经验分享] iptables 与apache杂记

[复制链接]

尚未签到

发表于 2018-11-26 12:26:32 | 显示全部楼层 |阅读模式
《《原文地址:http://blog.csdn.net/wenbingcai/archive/2009/04/09/4059685.aspx  iptales 在工作中没少用.但一直没有总结一下.都是用时man一下.没有系统性.
  现在有时间得总结一下了.
  redhat下的iptables,就是防火墙了.
  启动脚本:/etc/rc.d/init.d/iptables  --------> 看过之后就大概了解iptables启动/关闭过程了
  规则文件:/etc/sysconfig/iptables
  配置文件:/etc/sysconfig/iptables-config
  iptables规则表从上到下匹配,头一个规则如果匹配了,下一个相关规则无效
  iptables命令使用原则:
  链名  必须  大写
  表名  必须  小写
  动作  必须  大写
  匹配  必须  小写
  体系:
  它有2个表:filter ---------- 过滤作用
  nat-------------- 做网络地址转换的.network address translator
  4个链:
  INPUT ----------- 位于filter表,匹配目的ip是本机的数据包
  OUPUT ---------- 位于filter表,匹配从本机出去的数据包
  FORWARD --------- 位于filter表,匹配通过本机的数据包,从外部来,通过本机,又转发到外部
  PREROUTING ------ 位于nat表,用于修改目的地址 destination nat
  POSTROUTING ----- 位于nat表,用于修改源地址 source nat
  语法:
  如果用iptables命令写好规则后,运行 service iptables save 来保存.否则重启无效
  iptables 的表和链中都规则是从上到下都顺序来匹配的,优先级   上 > 下
  如果规则表里没有匹配的规则,最后采用默认的accept规则,如果你没改的话
  默认的规则用: ??????????????????????
  ( "+" 号无实际作用)
  iptables + [-t 要操作的表]
  + [ 操作命令 ]
  + [ 要操作的链 ]
  + [ 规则号码 ]
  + [ 匹配条件 ]
  + [ -j 匹配后的动作 ]
  参数详解:
  要操作的表:-------> 就是上述提到的表了,filter  和  nat
  操作命令:--------->
  -A : append 追加一条规则.放到规则表的最后.
  如;iptablse -t filter -A INPUT -j DROP
  # -j意为匹配后的动作 原意为jump, DROP 即丢弃
  意为:在filter表里的input链里追加一条规则,(作为本表本链的最后规则)
  匹配所有进入本机的数据包,匹配到的数据包都丢弃.
  -I : insert 插入一条规则
  如: iptables -I INPUT -j DROP
  意为: 在filter表里的input链中插入一条规则,插入成第一条
  iptables -I INPUT 3 -j DROP
  意为: 在filter表里的input链里插入一条规则,插入成第三条
  ## -t filter 不写则自动默认成filter表
  -I INPUT 3 如果不写号码,则自动插入成第一条
  确保插入的号码数  替换input链里的3号规则为accept
  -P : policy  设置某个链的默认规则
  iptables -P INPUT DROP ----> 设置filter表的INPUT链默认规则是drop
  # 这个命令  不加 -j   也是唯一不加-j的情况
  -F : flush   清空规则表
  iptables -F INPUT ---------> 清空input链的规则
  iptables -t nat -F PREROUTING -----> 清空net表的prerouting链规则
  # 如果不写链名,则为全部表.
  只是清空规则表.重启后已经保存的规则还在
  -L : list   列出规则
  iptables -nL  ----------> 列出规则 n表示ip地址和端口号
  匹配条件:
  流入/流出 -----> -i / -o          #  -i ---> in
  #  -o ---> out
  来源/目的 -----> -s / -d          #  -s ---> source
  #  -d ---> destination
  协议类型  -----> -p               #  -p ---> protocol
  来源端口/目的端口 ---> -sport / -dport
  按网络接口匹配:
  -i eth0  -------> 匹配从eth0网络接口进来的数据包
  -o ppp0  -------> 匹配从ppp0出去的数据包
  按来源目的地址匹配:
  -s 192.168.1.1 -----> 匹配来自192.168.1.1的数据包
  -s 192.168.1.0/24 --> 匹配来自192.168.1.0/24网络的数据包
  -s 192.168.1.0/16 --> 匹配来自192.168.1.0/16网络的数据包
  按目的地址匹配:
  -d < 可以是 ip , net , domain >
  -d 202.22.33.44 -----> 匹配去往 202.22.33.44的数据包
  -d www.hao123.com ---> 匹配去往www.hao123.com的数据包
  按协议匹配:
  -p tcp
  -p udp
  -p icmp
  按来源目的端口匹配:
  --sport < 可以是某个端口,也可以是端口范围 >
  --sport 1000
  --sport 1000:3000  ----> 从1000端口到3000端口
  --sport :4000     -----> 4000端口以下的所有端口
  --sport 4000:     -----> 4000端口以上的所有端口
  --dport 用法和 --sport 用法一样的
  # --s/dport 必须和 -p 一起使用
  匹配后的动作: 即-j 后的动作
  ACCEPT   ----> 通过,允许数据包通过本链.类似cisco的 permit
  DROP     ----> 拒绝, 不允许通过本链 .              deny
  SNAT     ----> -j SNAT --to ip   这是nat表的postrouting链,
  源地址转换,snat支持转换为单ip和ip池(一组连续的ip地址)
  例如:
  iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to 1.1.1.1
  ,将内网10.0.0.0/24的源地址改为1.1.1.1,用于nat
  DNAT    -----> -j DNAT --to ip   这是nat表的prerouting链
  目的地址转换,dnat支持转换为单一ip和ip池
  例如:
  iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 1.1.1.1
  将从eth0接口进来的要访问80端口的tcp数据包的目的地址改成1.1.1.1
  MASQUERADE --> -j masquerade
  动态源地址转换
  例如: iptables -t nat -A POSTROUTING -s 1.1.1.1 -j MASQUERADE
  将源地址是 1.1.1.1 的数据包进行地址伪装
  #没有用过
  附加模块:
  按包的状态匹配 ---------> state
  -m state --state 状态
  状态分为: new      ---------->  有别于tcp的syn

  >  established ------->  连接态
  invlid   ---------->  不能识别或者没有任何状态\
  例如:
  iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT   --> 接收处于连接态的包
  按mac地址匹配 ----------> mac
  -m mac --mac-source mac地址
  例如:
  iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP --> 拒绝某mac地址
  按包的速率匹配: --------> limit
  -m limit --limit  
  例如:
  iptables -A FORWARD -d 1.1.1.1 -m limit --limit 30/s -j DROP --> 拒绝速率30/s的包
  按多端口匹配 -----------> multiport     # 必须和 -p 一起用
  -m multiport  端口1 ----> 一次性匹配多个端口
  可以区分来源端口,目的端口,或者不指定端口.
  例如:
  iptables -A INPUT -p tcp -m multiport --dports 22,23,80,110 -j ACCEPT
  接收 22,23,80,110端口进来多tcp数据包
  按来源mac地址匹配 ------> mac
  按包速率匹配 -----------> limit
  按多端口匹配 -----------> multiport
  #######################################################################################
  经验: 牢记语法顺序
  #######################################################################################
防止linux出现大量 FIN_WAIT1,提高性能
Written by xkou on November 25th, 2007当连接数多时,经常出现大量FIN_WAIT1,可以修改 /etc/sysctl.conf修改
net.ipv4.tcp_fin_timeout = 10  net.ipv4.tcp_keepalive_time = 30
  net.ipv4.tcp_window_scaling = 0
  net.ipv4.tcp_sack = 0
然后:
/sbin/sysctl -p
使之生效#######################################################################################apache服务器的time_wait过多 fin_wait1过多等问题1。time_wait状态过多。    通常表现为apache服务器负载高,w命令显示load average可能上百,但是web服务基本没有问题。同时ssh能够登陆,但是反应非常迟钝。原因:最可能的原因是httpd.conf里面keepalive没有开,导致每次请求都要建立新的tcp连接,请求完成以后关闭,增加了很多time_wait的状态。另,keepalive可能会增加一部分内存的开销,但是问题不大。也有一些文章讨论到了sysctl里面一些参数的设置可以改善这个问题,但是这就舍本逐末了。2。fin_wait1状态过多。fin_wait1状态是在server端主动要求关闭tcp连接,并且主动发送fin以后,等待client端回复ack时候的状态。fin_wait1的产生原因有很多,需要结合netstat的状态来分析。netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n上面的命令可以帮助分析哪种tcp状态数量异常netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n  则可以帮助你将请求80服务的client ip按照连接数排序。
回到fin_wait1这个话题,如果发现fin_wait1状态很多,并且client ip分布正常,那可能是有人用肉鸡进行ddos***、又或者最近的程序改动引起了问题。一般说来后者可能性更大,应该主动联系程序员解决。但是如果有某个ip连接数非常多,就值得注意了,可以考虑用iptables直接封了他。Linux下查看Apache的请求数
在Linux下查看Apache的负载情况,以前也说过,最简单有有效的方式就是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apache Server Status的情况下,或安装的是其他的Web Server,比如Nginx的时候,下面的命令就体现出作用了。ps -ef|grep httpd|wc -l命令  #ps -ef|grep httpd|wc -l
  1388
  统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。
  表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整,我这组服务器中每台的峰值曾达到过2002。
netstat -nat|grep -i “80″|wc -l命令  #netstat -nat|grep -i “80″|wc -l
  4341
  netstat -an会打印系统当前网络链接状态,而grep -i “80″是用来提取与80端口有关的连接的, wc -l进行连接数统计。
  最终返回的数字就是当前所有80端口的请求总数。
netstat -na|grep ESTABLISHED|wc -l命令  #netstat -na|grep ESTABLISHED|wc -l
  376
  netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。
  最终返回的数字就是当前所有80端口的已建立连接的总数。
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’命令  #netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
  FIN_WAIT_1 286
  FIN_WAIT_2 960
  SYN_SENT 3
  LAST_ACK 32
  CLOSING 1
  CLOSED 36
  SYN_RCVD 144
  TIME_WAIT 2520
  ESTABLISHED 352
  这条语句是在张宴那边看到,据说是从新浪互动社区事业部技术总监王老大那儿获得的,非常不错。返回参数的说明如下:
  SYN_RECV表示正在等待处理的请求数;
  ESTABLISHED表示正常数据传输状态;
  TIME_WAIT表示处理完毕,等待超时结束的请求数。
Tag: 调优, 性能, 优化  kimi at 2008-09-01 03:01:08 in Apache, Linux
解决linux下大量的time_wait问题vi /etc/sysctl.conf  编辑/etc/sysctl.conf文件,增加三行:
引用 net.ipv4.tcp_fin_timeout = 30  net.ipv4.tcp_keepalive_time = 1200
  net.ipv4.tcp_syncookies = 1
  net.ipv4.tcp_tw_reuse = 1
  net.ipv4.tcp_tw_recycle = 1
  net.ipv4.ip_local_port_range = 1024    65000
  net.ipv4.tcp_max_syn_backlog = 8192
  net.ipv4.tcp_max_tw_buckets = 5000
  net.ipv4.route.gc_timeout = 100
  net.ipv4.tcp_syn_retries = 1
  net.ipv4.tcp_synack_retries = 1
说明:  net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN***,默认为0,表示关闭;
  net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  再执行以下命令,让修改结果立即生效:
引用  /sbin/sysctl -p
  用以下语句看了一下服务器的TCP状态:
  引用
  netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  返回结果如下:
  ESTABLISHED 1423
  FIN_WAIT1 1
  FIN_WAIT2 262
  SYN_SENT 1
  TIME_WAIT 962
  效果:处于TIME_WAIT状态的sockets从原来的10000多减少到1000左右。处于SYN_RECV等待处理状态的sockets为0,原来的为50~300。
  通过上面的设置以后,你可能会发现一个新的问题,就是netstat时可能会出现这样的警告:
  引用
  warning, got duplicate tcp line
  这正是上面允许tcp复用产生的警告,不过这不算是什么问题,总比不允许复用而给服务器带来很大的负载合算的多
尽管如此,还是有解决办法的:  1、 安装rpm包:
  [root@root2 opt]# rpm -Uvh net-tools-1.60-62.1.x86_64.rpm
  Preparing...                ########################################### [100%]
  1:net-tools              ########################################### [100%]
  [root@root2 opt]#
对于下载的是源码的rpm则需要使用以下方法安装: 2、 安装rpm源码包方法:  a)         安装src.rpm:
  # [root@root1 opt]# rpm -i net-tools-1.60-62.1.src.rpm
  ……
  b)        制作rpm安装包:
  [root@root1 opt]# cd /usr/src/redhat/SPECS/
  [root@root1 SPECS]# rpmbuild -bb net-tools.spec
  c)        rpm包的升级安装:
  [root@root1 SPECS]# pwd
  /usr/src/redhat/SPECS
  [root@root1 SPECS]# cd ../RPMS/x86_64/
  [root@root1 x86_64]# rpm -Uvh net-tools-1.60-62.1.x86_64.rpm
3、 再使用netstat来检查时系统正常:  说明:
  net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN***,默认为0,表示关闭;
  net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为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 = 1024    65000 表示用于向外连接的端口范围。缺省情况下很小: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套接字拖死。
  net.ipv4.route.gc_timeout = 100  路由缓存刷新频率, 当一个路由失败后多长时间跳到另一个
  默认是300
  net.ipv4.tcp_syn_retries = 1  对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右。
  netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  连接状态数量统计
  文章出处:DIY部落(http://www.diybl.com/course/6_system/linux/linuxjq/20090307/159515.html)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-639838-1-1.html 上篇帖子: apache 常用管道符 下篇帖子: apache常用的配置指令:ServerRoot
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表