在了解iptables的详细原理之前,我们先来看下如何使用iptables,以终为始,有可能会让你对iptables了解更深

所以接下来我们以配置一个生产环境下的iptables为例来讲讲它的常用命令

第一步:清空当前的所有规则和计数

iptables -F  #清空所有的防火墙规则
iptables -X #删除用户自定义的空链
iptables -Z #清空计数

第二步:配置允许ssh端口连接

iptables -A INPUT -s 192.168.1.0/ -p tcp --dport  -j ACCEPT  #22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求

第三步:允许本地回环地址可以正常使用

iptables -A INPUT -i lo -j ACCEPT  #本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A OUTPUT -o lo -j ACCEPT

第四步:设置默认的规则

(由于在生产上,我们设置默认的入与转发都不允许,出的允许)

iptables -P INPUT DROP #配置默认的不让进
iptables -P FORWARD DROP #默认的不允许转发
iptables -P OUTPUT ACCEPT #默认的可以出去

第五步:配置白名单

iptables -A INPUT -p all -s 192.168.1.0/ -j ACCEPT  #允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/ -j ACCEPT #允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport -j ACCEPT #允许183.121.3.7访问本机的3380端口

第六步:开启相应的服务端口

iptables -A INPUT -p tcp --dport  -j ACCEPT #开启80端口,因为web对外都是这个端口
iptables -A INPUT -p icmp --icmp-type -j ACCEPT #允许被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #已经建立的连接得让它进来

第七步:保存规则到配置文件中

因为刚刚的所有的规则都还是在内存中的,如果重启机器或者执行service iptables restart都会让其它失效,所以我们要把它保存在文件中,让它重启的时候能够被加载到。

[root@zejin238 ~]# cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak #任何改动之前先备份,请保持这一优秀的习惯
[root@zejin238 ~]# iptables-save > /etc/sysconfig/iptables
[root@zejin238 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Wed Sep 28 18:06:07 2016
*filter
:INPUT DROP [8:632]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [4:416]
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.0/24 -j ACCEPT
-A INPUT -s 192.168.140.0/24 -j ACCEPT
-A INPUT -s 183.121.3.7/32 -p tcp -m tcp --dport 3380 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Wed Sep 28 18:06:07 2016

至次,我们完成了生产环境iptables的配置

iptables文件说明

前面四行

*filter #代表接下来的配置都是在filter表上的。我们默认的配置都在filter表上的,当然还有其它表,如raw,mangle,nat

:INPUT DROP [:]   #代表filter表上默认的input chain为drop ,对应上面的命令iptables -P INPUT DROP,中括号里面的两个数字代表的是这条链上已经接受到的包的数量及字节数量[包的数量:包的总字节数]
:FORWARD DROP [:] #代表filter表上默认的forward chain为drop ,对应上面的命令iptables -P FORWARD DROP,中括号里面的两个数字代表的是这条链上已经接受到的包的数量及字节数量[包的数量:包的总字节数]
:OUTPUT ACCEPT [:] #代表filter表上默认的forward chain为drop ,对应上面的命令iptables -P OUTPUT ACCEPT,中括号里面的两个数字代表的是这条链上已经接受到的包的数量及字节数量[包的数量:包的总字节数]

接下来的部分到commit结束前,都是我们刚刚执行的配置命令


-A INPUT -s 192.168.1.0/ -p tcp -m tcp --dport  -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.0/ -j ACCEPT
-A INPUT -s 192.168.140.0/ -j ACCEPT
-A INPUT -s 183.121.3.7/ -p tcp -m tcp --dport -j ACCEPT
-A INPUT -p tcp -m tcp --dport -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

input chain与output chain分开,其它的顺序与我们配置时的顺序一致。

iptables优化

当服务器收到一条请求时,它会把iptables从上往下,一条条匹配定制的规则,那么假如机器收到一个正常的web请求,要走80端口,它需要先去检验前面5条规则,发现都不符合,直到第六条满足条件,那么这样的话防火墙的工作效率就低了很多。

所以我们优化的思路是:请求最频繁的放在最上面,请求频率较小的放在最后面。

我们此时可以直接去修改文件:vi /etc/sysconfig/iptables

调整后顺序大概为:

# Generated by iptables-save v1.4.7 on Wed Sep  ::
*filter
:INPUT DROP [:]
:FORWARD DROP [:]
:OUTPUT ACCEPT [:]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport -j ACCEPT
-A INPUT -s 192.168.135.0/ -j ACCEPT
-A INPUT -s 192.168.140.0/ -j ACCEPT
-A INPUT -s 183.121.3.7/ -p tcp -m tcp --dport -j ACCEPT
-A INPUT -s 192.168.1.0/ -p tcp -m tcp --dport -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Wed Sep ::

因为web服务器,肯定是80端口访问最频繁,那为什么不是放第一条呢?

在这里,我们把已经有状态的联接放在第一条是因为在请求连接中,有很多都是在建立在已经联接的基础上通信的,譬如有可能你第一次连接的3380端口,状态是new,但在后续的联接都为ESTABLISHED,第一条就可以匹配到了。

理解iptables格式

我们在上面的iptables文件中,最开始接触会发现格式蛮奇怪的,不知道什么回事

其实iptables就是定义一些规则,满足相应的规则则进行ACCEPT、DROP、REJECT、DNAT、SNAT......

那么怎么定义匹配规则:

通用匹配

-s 指定源地址

-d 指定目标地址

-p 指定协议

-i 指定数据报文流入接口

-o 指定数据报文流出接口

扩展匹配

指定-m选项,表示用什么模块来匹配,如:

-m state --state

NEW,ESTABLISHED,RELATED  表示用state模块来匹配当前连接状态为这三种状态的连接

-m iprange

--src-range 用iprange模块匹配来源的ip地址范围

--dst-range 用iprange模块匹配目的的ip地址范围

-m multiport

--source-ports  用multiport模块来匹配来源的端口范围

--destination-ports 用multiport模块来匹配目的的端口范围

我们看如下一条例子来解读:

-A INPUT -p tcp -m iprange --src-range 121.21.30.36-121.21.30.100 -m multiport --destination-ports 3326,3327,3328 -m state --state NEW -j ACCEPT

这表示来自121.21.30.36-121.21.30.100这个地址范围的,请求端口为3326,3327,3328并且是新建的连接,都给予放行。

模块有很多,参数有很多,有些没看过怎么办?

man iptables

那iptables还有其它表,内部是怎么流转的,请看 Linux iptables原理--数据包流向

linux iptables常用命令之配置生产环境iptables及优化的更多相关文章

  1. iptables常用命令之配置生产环境iptables及优化

    第一步:清空当前的所有规则和计数 iptables -F #清空所有的防火墙规则 iptables -X #删除用户自定义的空链 iptables -Z #清空计数 第二步:配置允许ssh端口连接 i ...

  2. Linux系统管理常用命令

    Linux系统管理常用命令 分类: Linux2011-01-10 18:26 1538人阅读 评论(0) 收藏 举报 linuxcommandservicenginxuserunix 目录(?)[+ ...

  3. Centos6.5生产环境最小化优化配置

    Centos6.5生产环境最小化优化配置,满足业务需求! 01.启动网卡 #centos6.x最小化安装后,网卡默认不是启动状态 ifup eth0  //  ifconfig eth0 up /et ...

  4. [转帖]Linux systemd 常用命令

    Linux systemd 常用命令 https://www.cnblogs.com/tsdxdx/p/7288490.html systemctl hostnamectl timedatectl l ...

  5. Linux 下常用命令

    linux 下常用命令: 1.删除文件命令为 rm 2.创建目录的命令是:mkdir 3.删除目录的命令是rmdir(空目录) 4.切换到root帐号:su 5.查看所有进程:ps -aux 6.杀死 ...

  6. linux 下安装jdk及配置jdk环境图解

    linux 下安装jdk及配置jdk环境图解 一:先检測是否已安装了JDK 运行命令: # rpm -qa|grep jdk  或   # rpm -q jdk  或  #find / -name j ...

  7. 计算机硬件基本知识及Linux的常用命令

    ------------------1. 计算机硬件基本知识------------------ CPU - 寄存器 - L1/L2/L3 - 内存 - 硬盘 - 互联网下载/其他存储介质传输 寄存器 ...

  8. 一、Linux概述 二、Linux的安装 三、Linux的常用命令(重点)

    一.Linux概述###<1>操作系统 OS,管理和控制 计算机的 硬件和软件资源的 计算机程序. 最基本的系统软件. 是用户和计算机交互的桥梁,是硬件和软件交互的桥梁. 操作系统:she ...

  9. Linux帮助——常用命令

    Linux帮助——常用命令 摘要:本文主要学习了Linux系统中常用的一些命令. uname命令 uname命令可以显示电脑以及操作系统的相关信息. 基本语法 uname [选项] 选项说明 -a:显 ...

随机推荐

  1. AngularJS过滤器filter-保留小数,小数点-$filter

    AngularJS      保留小数 默认是保留3位 固定的套路是 {{deom | number:4}} 意思就是保留小数点 的后四位 在渲染页面的时候 加入这儿个代码 用来精确浮点数,指定小数点 ...

  2. python黑魔法 -- 内置方法使用

    很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...

  3. DDD 领域驱动设计-两个实体的碰撞火花

    上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...

  4. Android 几种消息推送方案总结

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...

  5. var和dynamic的区别

    1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...

  6. oracle 误删数据恢复

    1.根据时间点查系统版本号scn: select timestamp_to_scn(to_timestamp('2013-01-07 11:20:00','YYYY-MM-DD HH:MI:SS')) ...

  7. Linux虚拟化学习笔记<一>

    关于虚拟化,原理的东西是非常复杂的,要想完全理解,没有足够的耐心是不不能完全学透这部分内容的.那下面我主要以资源汇总的形式把一些资料罗列出来,帮助大家快速理解虚拟化,快速使用和配置. 为什么要虚拟化: ...

  8. Struts2日期类型转换

    针对日期类java.util.Date进行类型转换,要求客户端使用"yyyy-MM-dd","yyyy/MM/dd"中的任意一种输入,并以"yyyy- ...

  9. 一不小心写了个WEB服务器

    开场 Web服务器是啥玩意? 是那个托管了我的网站的机器么? No,虽然那个也是服务器,但是我们今天要说的Web服务器主要是指像IIS这样一类的,用于处理request并返回response的工具,没 ...

  10. lucene 基础知识点

    部分知识点的梳理,参考<lucene实战>及网络资料 1.基本概念 lucence 可以认为分为两大组件: 1)索引组件 a.内容获取:即将原始的内容材料,可以是数据库.网站(爬虫).文本 ...