iptables 添加raw提高服务器性能之路
前几天准备把线上一批机器添加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提高服务器性能之路的更多相关文章
- Linux(Centos )的网络内核参数优化来提高服务器并发处理能力【转】
简介 提高服务器性能有很多方法,比如划分图片服务器,主从数据库服务器,和网站服务器在服务器.但是硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题 ...
- IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力
上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度. IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作 ...
- 优化Linux的内核参数来提高服务器并发处理能力
提高Linux系统下的负载能力,可以使用nginx等原生并发处理能力就很强的web服务器 使用Apache的可以启用其Worker模式,来提高其并发处理能力 修改Linux的内核相关TCP参数,来最大 ...
- [记录]优化Linux 的内核参数来提高服务器并发处理能力
优化Linux 的内核参数来提高服务器并发处理能力PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题.要提高Linux 系统下的负载 ...
- 性能测试学习之路 (三)jmeter常见性能指标(相关术语、聚合报告 && 服务器性能监控配置 && 图形结果 && 概要报告)
1 性能测试目的 性能测试的目的:验证软件系统是否能够达到用户提出的性能指标,同时发现软件系统中存在的性能瓶颈,以优化软件. 最后起到优化系统的目的性能测试包括如下几个方面: 1.评估系统的能力:测试 ...
- HTTP/2 服务器推送(Server Push)教程(HTTP/2 协议的主要目的是提高网页性能,配置Nginx和Apache)
HTTP/2 协议的主要目的是提高网页性能. 头信息(header)原来是直接传输文本,现在是压缩后传输.原来是同一个 TCP 连接里面,上一个回应(response)发送完了,服务器才能发送下一个, ...
- 关于大小型项目如何最大限度提高WebAPi性能
前言 WebAPi作为接口请求的一种服务,当我们请求该服务时我们目标是需要快速获取该服务的数据响应,这种情况在大型项目中尤为常见,此时迫切需要提高WebAPi的响应机制,当然也少不了前端需要作出的努力 ...
- IIS网站服务器性能优化指南(转载)
原文网址:http://www.phontol.com/20090507_419416_1.html Windows Server自带的互联网信息服务器(Internet Informat ...
- 【转】提高PHP性能的53个技巧
PHP技巧汇总:提高PHP性能的53个技巧用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符 ...
随机推荐
- C# Winform 仪表盘
winform 仪表盘相关下载链接://download.csdn.net/download/floweroflvoe/10432601?utm_source=bbsseo 控件首次拖拽上来是这样的: ...
- 启用hyper-v后无法卸载vmware
机器上启用了hyper-v,想卸载vmware,报错了: Error: This product may not be installed on a computer that has Microso ...
- QT:QHash的使用
QHash<QPointF, QVector<float>> data; 此时会报错说没有声明QPointF的Key类型 需要我们手动实现一个函数 static uint qH ...
- 学号 20175212 《Java程序设计》第3周学习总结
学号 20175212 <Java程序设计>第3周学习总结 教材学习内容总结 一. Java--面向对象语言 核心内容为对象,一切围绕着对象.以下为三个重要性质: 封装性:将数据和对数据的 ...
- oracle存储过程出现ORA-01403: 未找到数据 问题解决方法
这段时间在做一个业务,需要用到存储过程处理业务逻辑,但是出现一个ORA-01403: 未找到数据 问题, 那么这个应该如何解决这个问题 declare mixType integer; begin - ...
- Spring中使用RedisTemplate操作Redis(spring-data-redis)
RedisTemplate如何检查一个key是否存在? return getRedisTemplate().hasKey(key); 由一个问题,复习了一下redis 抄自: https://www. ...
- PDF 补丁丁 0.6.0.3369 版发布(修复保存文件时文件名替代符失效的问题)
新的测试版修复之前测试版本在保存文件时文件名替代符失效的问题
- git切换用户踩坑
1)配置用户信息 git config --global user.name "username" git config --global user.email "**@ ...
- websocket+rabbitMQ
拉取镜像:docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 15672:15672 -p 61613:616 ...
- 链接中 href='#' 和 href='###' 的区别
<a> 标签 + onclick='{jscode}' 是很常用的一种 js 运用方式,而不使用 href='javascript:{jscode}' 是为了兼容多种浏览器对 <a& ...