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能这么做,它是一种可以把多个字符 ...
随机推荐
- PHP的json_encode()函数与JSON对象
一.问题描述 这周搬砖的时候,前端通过ajax获取后端的数据后,照例用 对象.属性 的方式取值,然而结果总是总是不能如预期般展示在页面上. 先写个 demo 还原下场景:选中一个下拉框列表选项后,会在 ...
- Win10 禁止自动更新以及禁止Windows 10升级助手(Windows 10 易升)
微软目前已经重新启用非常烦人的Windows 10升级助手,现在该助手主要帮助用户自动下载以及安装更新. 彻底禁用: 1.在开始菜单右侧的搜索框中输入关键词控制面板,然后打开控制面板后转到程序与功能里 ...
- Angular7.1.4+Typescript3.1框架学习(二)
接着第一部分,这篇文章就 Angular cli进行介绍总结: 1. ng g:列出当前命令 ng g 需在angular工程文件夹下执行: C:\Users\zb\angulardemo\heroe ...
- promise知识点小结
断断续续学习es6也有一段时间了,趁着开学空闲对知识点做一些小结. 为什么使用promise 谈到Promise,我们知道,这是社区较理想的异步编程解决方案.想要掌握promise,我们首先要知道其提 ...
- Objective-C基础教程 笔记
一.对C的扩展 1. #import VS #include C语言使用#include语句通知编译器应在头文件中查询定义. OC中也可以使用#include,但几乎不这么用,而是使用#import. ...
- wait和sleep的区别
wait是线程永久等待,只有调用notify才能进行唤醒 sleep是等待指定的时间,自动唤醒
- java通过HttpClient方式和HttpURLConnection方式调用WebService接口
1.引入maven依赖: <dependency> <groupId>org.apache.httpcomponents</groupId> <artifac ...
- laravel5.5 env
env 函数 读取的变量里面带有 # 号的情况下 数据会丢失
- Spring学习之实例化bean的三种方式
实例化bean的三种方式 构造器实例化bean Person.java public class Person { private String name; private Integer age; ...
- aspectj编程简介
现在java生态中spring大行其道,一般使用aspectj进行切面编程使用注解方式实现,比较少使用原生的aspectj编程,网上的资料也比较少.最近工作中需要封装redisson客户端提供统一的r ...