在了解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. 运用php做投票题,例题

    要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...

  2. 关于Raid0,Raid1,Raid5,Raid10的总结

    RAID0 定义: RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就 ...

  3. 从netty-example分析Netty组件

    分析netty从源码开始 准备工作: 1.下载源代码:https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程. netty提 ...

  4. jsp页面无法识别el表达式的解决方案

    今天在写一个springmvc的小demo时,碰到一个问题,在jsp页面中书写为${user.username}的表达式语言,在浏览器页面中仍然显示为${user.username},说明jsp根本不 ...

  5. obj.style.z-index的正确写法

    obj.style.z-index的正确写法 今天发现obj.style.z-index在js里面报错,后来才知道在js里应该把含"-"的字符写成驼峰式,例如obj.style.z ...

  6. python之类介绍

    python对象销毁(垃圾回收): 1>同Java语言一样,python使用了引用计数这一简单计数来追踪内存中的对象,也就是说,python内部记录着所有使用中的对象各有多少引用,一个内部跟踪变 ...

  7. Matrix4x4矩阵变换、欧拉角转四元数、角度转弧度

    Matrix4x4 // 重置矩阵 ][]) { m[][] = ; m[][] = ; m[][] = ; m[][] = ; m[][] = ; m[][] = ; m[][] = ; m[][] ...

  8. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  9. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  10. iOS 开发不可缺少的工具

    1.截屏利器:Snip 强大的滚动截屏功能,你值得拥有! Snip.png 传送门:http://www.snip.qq.com/ 2.Mac上最好的终端模拟器:iTerm2 iTeam.png 传送 ...