前几天准备把线上一批机器添加iptables。于是梳理出几个需要通外网的端口,80,81等。

防火墙规则如下:

#### filter table #############################################################
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# sshd service
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22022 -j ACCEPT
# nginx service
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 81 -j ACCEPT
# SSL
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
# IP range : 192.168.0.1 - 192.168.3.255
# The broadcast IP : 192.168.3.255
# No gateway IP for NAT, but usually 192.168.0.1 is reserved for NAT.
-A INPUT -s 192.168.0.0/22 -j ACCEPT
-A INPUT -s 10.10.0.0/20 -j ACCEPT
-A INPUT -s 10.100.255.0/24 -j ACCEPT
#
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
#
COMMIT
#### filter table #############################################################

2级的10台nginx 开启这个防火墙策略后,由于疏忽,忘了修改内核参数nf_conntrack 的值,导致周六周日时,观察公网带宽流量急剧下降,因为这个参数是监听iptables 状态的一个表的大小。默认为几W吧。于是临时调整为1KW条,业务正常恢复。

周一到公司后,准备启用raw 表 来过滤到常用的nginx请求。因为nf_conntrack数目大了之后,会消耗CPU去翻查整张表,为了提高性能,所以使用raw表。

规则如下:

# Generated by iptables-save v1.4.21 on Tue Sep 26 16:26:50 2017
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [10317:831488]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22022 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 81 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -s 192.168.0.0/22 -j ACCEPT
-A INPUT -s 10.10.0.0/20 -j ACCEPT
-A INPUT -s 10.100.255.0/24 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state UNTRACKED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Sep 26 16:26:50 2017
# Generated by iptables-save v1.4.21 on Tue Sep 26 16:26:50 2017
*raw
:PREROUTING ACCEPT [52314:16887755]
:OUTPUT ACCEPT [10317:831488]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 81 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 443 -j NOTRACK
-A PREROUTING -p udp -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 81 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 443 -j NOTRACK
-A OUTPUT -p udp -j NOTRACK
COMMIT

  

发现telnet 不通外网IP。

使用raw表target track 功能 标记80端口的tpc包来跟踪为什么通不了。配置如下

# Generated by iptables-save v1.4.21 on Tue Sep 26 16:26:50 2017
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [10317:831488]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22022 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 81 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -s 192.168.0.0/22 -j ACCEPT
-A INPUT -s 10.10.0.0/20 -j ACCEPT
-A INPUT -s 10.100.255.0/24 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state UNTRACKED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Sep 26 16:26:50 2017
# Generated by iptables-save v1.4.21 on Tue Sep 26 16:26:50 2017
*raw
:PREROUTING ACCEPT [52314:16887755]
:OUTPUT ACCEPT [10317:831488]
-A PREROUTING -s xxxxxxxxx/32 -p tcp -m tcp --dport 80 -j TRACE
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 81 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 443 -j NOTRACK
-A PREROUTING -p udp -j NOTRACK
-A OUTPUT -d xxxxxxxxx/32 -p tcp -m tcp --dport 80 -j TRACE
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 81 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 443 -j NOTRACK
-A OUTPUT -p udp -j NOTRACK
COMMIT

  centos7.2 在/var/log/message查看内核的跟踪信息如下图

重点讲一下路由跟踪的分析。

1、第一次我到达物理机匹配raw:PREROUTING:rule:2 这个规则,这些规则的行数使用iptables -t tablename -L -n的行数来的,如下图。

2、在匹配到raw表的第三行策略,为不标记因为是80 所以会匹配到。然后就直接匹配到 filter表的ONPUT链的第11行,经过3次循环的TPC SYN 然后就离开了。因为我们11行的策略为,如果上述filter表的inPUT链中没有匹配到的就会全部拒绝

3、后来思考了一下,为什么没有匹配到filter表的中间dport=80的这条规则,原因思考了一下,因为有一个-m state --state NEW 因为这条规则为 一条新连接且端口为80就放行,那么怎么定义这条新连接呢,就是在nf_conntrack表中来查询这个是不是新进来的连接。但是我们在80进来的时候已经进行了notrack了,所以就直接匹配到11行了。

4、修改后的iptables rules(跟踪已去掉)

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [56910980:19947845130]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22022 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 81 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -s 192.168.0.0/22 -j ACCEPT
-A INPUT -s 10.10.0.0/20 -j ACCEPT
-A INPUT -s 10.100.255.0/24 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state UNTRACKED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Sep 26 17:25:17 2017
# Generated by iptables-save v1.4.21 on Tue Sep 26 17:25:17 2017
*raw
:PREROUTING ACCEPT [48348514:18391836111]
:OUTPUT ACCEPT [56911513:19948023270]
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 81 -j NOTRACK
-A PREROUTING -p tcp -m tcp --dport 443 -j NOTRACK
-A PREROUTING -p udp -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 81 -j NOTRACK
-A OUTPUT -p tcp -m tcp --sport 443 -j NOTRACK
-A OUTPUT -p udp -j NOTRACK
COMMIT
# Completed on Tue Sep 26 17:25:17 2017

  这条博文教大家遇到iptables 问题后,如何找到故障点。

iptables 添加raw提高服务器性能之路的更多相关文章

  1. Linux(Centos )的网络内核参数优化来提高服务器并发处理能力【转】

    简介 提高服务器性能有很多方法,比如划分图片服务器,主从数据库服务器,和网站服务器在服务器.但是硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题 ...

  2. IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力

    上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度. IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作 ...

  3. 优化Linux的内核参数来提高服务器并发处理能力

    提高Linux系统下的负载能力,可以使用nginx等原生并发处理能力就很强的web服务器 使用Apache的可以启用其Worker模式,来提高其并发处理能力 修改Linux的内核相关TCP参数,来最大 ...

  4. [记录]优化Linux 的内核参数来提高服务器并发处理能力

    优化Linux 的内核参数来提高服务器并发处理能力PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题.要提高Linux 系统下的负载 ...

  5. 性能测试学习之路 (三)jmeter常见性能指标(相关术语、聚合报告 && 服务器性能监控配置 && 图形结果 && 概要报告)

    1 性能测试目的 性能测试的目的:验证软件系统是否能够达到用户提出的性能指标,同时发现软件系统中存在的性能瓶颈,以优化软件. 最后起到优化系统的目的性能测试包括如下几个方面: 1.评估系统的能力:测试 ...

  6. HTTP/2 服务器推送(Server Push)教程(HTTP/2 协议的主要目的是提高网页性能,配置Nginx和Apache)

    HTTP/2 协议的主要目的是提高网页性能. 头信息(header)原来是直接传输文本,现在是压缩后传输.原来是同一个 TCP 连接里面,上一个回应(response)发送完了,服务器才能发送下一个, ...

  7. 关于大小型项目如何最大限度提高WebAPi性能

    前言 WebAPi作为接口请求的一种服务,当我们请求该服务时我们目标是需要快速获取该服务的数据响应,这种情况在大型项目中尤为常见,此时迫切需要提高WebAPi的响应机制,当然也少不了前端需要作出的努力 ...

  8. IIS网站服务器性能优化指南(转载)

    原文网址:http://www.phontol.com/20090507_419416_1.html       Windows Server自带的互联网信息服务器(Internet Informat ...

  9. 【转】提高PHP性能的53个技巧

    PHP技巧汇总:提高PHP性能的53个技巧用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符 ...

随机推荐

  1. echarts常用方法(一)

    目前,项目中涉及到图表的,使用echarts的频率较多,因为UI设计一般不会考虑到是否能实现的问题,他们专注的只是显示的效果.所以作为前端开发,要对echarts进行不同程度的改造,组合,甚至重写等. ...

  2. MySQL数据库(2)

    上一篇我们讲述过MySQL创建数据库,数据表的内容,其中涉及到了几个约束: NOT NULL   非空约束 PRIMARY KEY   主键约束 UNIQUE KEY    唯一约束 其实还有两个约束 ...

  3. C++标准模板库(STL)之Vector

    在C中,有很多东西需要自己实现.C++提供了标准模板库(Standard Template Libray,STL),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能. 具体容器链 ...

  4. QT-简易视频播放器

    一直没找到理由去学一下QT,由于工作原因之后的工作内容会用到QT,于是这两天摸索了下:早上临时决定先做个视频播放器玩一下,于是先用qml发现不会用,无果,于是放弃了使用qml,等之后系统的看一下Jav ...

  5. Kubernetes 实践指南之Kubernetes 的命令行工具详解

    kubectl作为客户端CLI工具,可以让用户通过命令行的方式对Kubernetes集群进行管理.本节内容将对kubectl的子命令和用法进行详细描述. 一.kubectl 用法概述 kubectl语 ...

  6. EChart.js 简单入门

    EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Visual Studio里的自带控件,使用比 ...

  7. Haxe:东游记(上)part1:intro

    原标题:西行漫记之Haxe初探·上篇 1. 简述:haxe是啥? haxe(读作蛤克思),是以前flash时代诞生的一种的开源跨平台方案.学会了haxe,可以直接用这种类似TypeScript的语法, ...

  8. 比较推荐学习Linux系统应该看的书籍

    对于如何学习Linux,我想大家多多少少会有自己的一些想法--不管是学过Linux的还是没有学过Linux的.学习,对于我们来说,应该不是一件陌生的事:从小学开始,然后中学.大学.乃至于读硕读博,可以 ...

  9. ios和android适配问题总结

    _________________________________________________________________________________ 相关知识点 移动端. 适配(兼容). ...

  10. JS 判断两个时间的大小(可自由选择精确度:天,小时,分钟,秒)

    //可自由选择精确度 如:签到时间:2018-11-07 11:00:00 签退时间:2018-11-07 10:59:59 //判断时间先后 //统一格式 var a = $("#fdtm ...