第十五章 iptables

15.1 iptables简介

iptables是与最新的3.5版本Linux内核集成的IP信息包过滤系统。如果Linux系统连接到因特网或LAN、服务器或连接LAN和因特网的代理服务器,则该系统有利于在Linux系统上更好地控制IP信息包过滤和防火墙配置。

防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在Linux内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。

虽然netfilter/iptables IP信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter和iptables组成。

netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用Red Hat Linux 7.1或更高版本,否则需要下载该工具并安装使用它。

15.2 防火墙介绍

Firewall,防火墙,也称防护墙,,是一种隔离工具。其工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检测规则作匹配检测,对于能够被规则匹配到的报文做出相应处理。

防火墙有主机防火墙和网络防火墙,主机防火墙主要用来监测和处理流经本主机的数据包;网络防火墙则是用来监测和处理流经本防火墙的数据包。

与Linux内核各版本集成的防火墙历史版本:

2.0.x内核:ipfwadm

2.2.x内核:ipchains

2.4.x内核:iptables

15.3 iptables的优点

netfilter/iptables的最大优点是它可以配置有状态的防火墙,这是ipfwadm和ipchains等以前的工具都无法提供的一种重要功能。

有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为ESTABLISHED、INVALID、NEW和RELATED。

ESTABLISHED:指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。

INVALID:指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。

NEW:意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。

RELATED:表示该信息包正在启动新连接,以及它与已建立的连接相关联。

netfilter/iptables的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。用户可以定制自己的规则来满足特定需求,从而只允许想要的网络流量进入系统。

另外,netfilter/iptables是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。

15.4 iptables四表五链

15.4.1 iptables四表及其对应的功能

iptables四表分别是filter、nat、mangle和raw。四表各自的功能如下:

filter:过滤,防火墙

nat:network address translation,网络地址转换

mangle:拆解报文,做出修改,封装报文

raw:关闭nat表上启用的连接追踪机制

15.4.2 iptables五链

iptables五链分别是PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

数据包的处理方式不同,流经的链也不同:

数据流入时要经过的链:PREROUTING --> INPUT

数据流出时要经过的链:OUTPUT --> POSTROUTING

数据转发时要经过的链:PREROUTING --> FORWARD --> POSTROUTING

各功能的分别实现位置:

filter:INPUT,FORWARD,OUTPUT

nat:PREROUTING(DNAT),OUTPUT,POSTROUTING(SNAT)

mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

raw:PREROUTING,OUTPUT

15.5 iptables数据包过滤匹配流程

15.5.1 iptables添加规则的考量点

添加规则的考量点:

a) 要实现哪种功能:判断添加在哪张表上

b) 报文流经的路径:判断添加在哪个链上

15.5.2 iptables处理的优先级次序

链:链上规则的次序,即为检查的次序,因此隐含一定的法则

a) 同类规则(访问同一应用),匹配范围小的放上面

b)不同类规则(访问不同应用),匹配到报文频率较大的放上面

c) 将那些可由一条规则描述的多个规则合并为一个

d) 设置默认策略

功能的优先级次序:raw --> mangle --> nat --> filter

15.6 iptables规则

15.6.1 iptables规则的组成

iptables规则的组成部分:报文的匹配条件,匹配到之后的处理动作

匹配条件:根据协议报文特征指定

基本匹配条件:源IP,目标IP,源端口,目标端口

扩展匹配条件:连接追踪,状态追踪

处理动作

内建处理机制

自定义处理机制

注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效

15.6.2 iptables规则管理工具

iptables是一种规则管理工具,可实现iptables规则的添加、修改、删除和显示等功能。

规则和链有计数器:

pkts:表示由规则或链所匹配到的报文的个数

bytes:表示由规则或链所匹配到的所有报文大小之和

iptables命令:

说明:

iptables是用来设置、维护和检查Linux内核的IP包过滤规则的。

可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配;每条规则指定应当如何处理与之相匹配的包。这被称作“target”,也可以跳向同一个表内的用户定义的链。

targets:

防火墙的规则指定所检查包的特征和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,则下一条规则由目标值确定。该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT,DROP,QUEUE或者RETURN。

语法:

iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name

常用options:

-t table:
  filter,nat,mangle,raw

链管理选项:

-F:flush,清空规则链,若省略链则表示清空指定表上的所有的链
-N:new,创建新的自定义规则链
-X:drop,删除用户自定义的空的规则链
-Z:zero,清零,置零规则计数器,让计数器重新开始计数
-P:Policy,为指定链设置默认策略,对filter表中的链而言,默认策略通常有ACCEPT,DROP,REJECT
-E:rEname,重命名自定义链,引用计数不为0的自定义链无法改名也无法删除

规则管理选项:

-A:append,将新规则追加于指定链的尾部
-I:insert,将新规则插入至指定链的指定位置,不指定位置则默认插入为第一条
-D:delete,删除指定链上的指定规则
#  有两种指定方式:
#  a) 指定匹配条件
#  b) 指定规则编号
-R:replace,替换指定链上的指定规则

查看选项:

-L:list,列出指定链上的所有规则
-n:numberic,以数字格式显示地址和端口号
-v:verbose,显示详细信息,支持-vv,-vvv
--line-numbers:显示规则编号
-x:exactly,显示计数器计数结果的精确值

匹配条件选项:

基本匹配:

[!] -s,--src,--source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围
[!] -d,-dst,--destination IP|Netaddr:检查报文中目标IP地址是否符合此处指定的地址范围
-p,--protocol {tcp|udp|icmp}:检查报文中的协议,即IP首部中的protocols所标识的协议
-i,--in-interface IFACE:数据报文的流入接口,仅能用于PREROUTING,INPUT及FORWARD链上
-o,--out-interface IFACE:数据报文的流出接口,仅能用于FORWARD,OUTPUT及POSTROUTING链上

扩展匹配:-m match_name --spec_options

例如:-m tcp --dport 22

隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项

-p tcp
  --dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口
  --sport PORT[-PORT]:源端口,可以是单个端口或连续多个端口
  --tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没在LIST1中指明的不作检查
    SYN,ACK,FIN,RST,PSH,URG
如:
  --tcp-flags SYN,ACK,FIN,RST SYN表示匹配三次握手中的第一次握手,SYN必须为1,其余的必须为0
  --syn:表示匹配三次握手中的第一次握手
  
-p udp
  --dport
  --sport
  
-p icmp
  --icmp-type:可用数字表示其类型
    0:echo-reply,响应
    8:echo-request,请求
如:
  iptables -A OUTPUT -s 192.168.1.1 -p icmp --icmp-type 8 -j ACCEPT
  iptables -A INPUT -d 192.168.1.1 -p icmp --icmp-type 0 -j ACCEPT

显式扩展:必须使用-m选项指定使用的扩展

multiport扩展:以离散方式定义多端口匹配,最多指定15个端口

[!] --source-ports,--sports port[,port |,port:port]...:指定多个源端口
[!] --destination-ports,--dports port[,port |,port:port]...:指定多个目标端口
[!] --ports port[,port |,port:port]...:指定特定端口
如:
iptables -I INPUT -s 192.168.1.0/24 -d 192.168.1.250 -p tcp -m multiport --dports 22,80 -j ACCEPT

iprange扩展:指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用

[!] --src-range from[-to]:指明连续的源IP地址范围
[!] --dst-range from[-to]:指明连续的目标IP地址范围
如:
iptables -I INPUT -d 192.168.1.250 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.1.1-192.168.1.249 -j ACCEPT

string扩展:检查报文中出现的字符串

--algo {bm|kmp}:指定字符串比对算法
[!] --string pattern
[!] --hex-string pattern
如:
iptables -I OUTPUT -m string --algo bm --string ‘movie‘ -j REJECT表示无论是谁访问的,只要响应报文中包含movie字符串的全部拒绝掉

time扩展:基于时间做检查,根据报文到达的时间与指定的时间范围进行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定起始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定结束日期
--timestart hh:mm[:ss]:指定起始时间
--timestop hh:mm[:ss]:指定结束时间
[!] --monthdays day[,day...]:指定一个月内具体哪几天
[!] --weekdays day[,day...]:指定一周内具体周几
如:
-m time --weekdays Sa,Su
-m time --datestart 2007-12-24 --datestop 2007-12-27
-m time --datestart 2007-01-01T17:00 --datestop 2007-01-01T23:59:59
-m time --timestart 12:30 --timestop 13:30
-m time --weekdays Fr --monthdays 22,23,24,25,26,27,28

connlimit扩展:连接限制,根据每客户端IP(也可以是地址块(仅centos7支持))做并发连接数数量匹配

[!] --connlimit-above n:连接的数量大于n
[!] --connlimit-upto n:连接的数量小于等于n,centos7上新版的iptables才有此选项
--connlimit-mask prefix_length
如:
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

limit扩展:基于收发报文的速率做检查

--limit rate[/second|/minute|/hour|/day]:指定速率
--limit-burst number:指定峰值

state扩展:状态扩展,根据连接追踪机制检查连接的状态

调整连接追踪功能所能够容纳的最大连接数量:并发量很大的情况下建议把值调大点

/proc/sys/net/nf_conntrack_max

iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max文件设定的值,链接碰到各种状态的超时后就会从表中删除

所以解决方法一般有两个:

a) 加大ip_conntrack_max值

vim /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216

b) 降低ip_conntrack timeout时间

vim /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait =  60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n

已经追踪到并记录下的连接:

/proc/net/nf_conntrack

不同协议或连接类型追踪的时长:

/proc/sys/net/netfilter/*

可追踪的连接状态:

NEW:新发出的请求,连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发来的请求

ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态

RELATED:相关的连接,如ftp协议的命令连接与数据连接之间的关系

追踪RELATED状态的专用模块:/lib/modules/KERNEL-VERSION/kernel/net/netfilter/nf_conntrack*.ko

INVALIED:无法识别的连接

--state STATE1,STATE2,...:指明要检查的状态

例:开放被动模式的ftp服务需要以下几步:

a) 装载FTP追踪时的专用模块(nfconntrack_ftp.ko)

modprobe nfcontrack_ftp

b) 放行请求报文

命令连接:NEW,ESTABLISHED

iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED  -j ACCEPT

数据连接:RELATED,ESTABLISHED

iptables -I INPUT -d LocalIP -m state --state RELATED,ESTABLISHED -j ACCEPT

c) 放行响应报文

iptables -I OUTPUT -s LocalIP  -m state --state ESTABLISHED -j ACCEPT

  目标选项:

-j TARGET:跳转至指定的TARGET

常用的TARGET:

ACCEPT:接受

DROP:丢弃

REJECT:拒绝

RETURN:返回调用链

REDIRECT:端口重定向

LOG:记录日志

MARK:做防火墙标记

DNAT:目标地址转换

iptables -t nat -A PREROUTING -d ExternalIP -p tcp|udp --dport PORT -j DNAT --to-destination InterServerIP[:PORT]

SNAT:源地址转换

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j SNAT --to-source ExternalIP

MASQUERADE:地址伪装

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j MASQUERADE

自定义链:由自定义链上的规则进行匹配检查

保存及重载规则:

保存规则至指定文件:

iptables-save > /PATH/TO/SOMEFILE

从指定文件重载规则:

iptables-restore < /PATH/FROM/SOMEFILE

CentOS6:

service iptables save    #相当于iptables-save > /etc/sysconfig/iptables
service iptables restore    #相当于iptables-restore < /etc/sysconfig/iptables

CentOS7:引入了新的iptables前端管理服务工具:firewalld

firewall-cmd
firewalld-config

关于firewalld:

https://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html

时间: 2024-12-19 18:22:04

第十五章 iptables的相关文章

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文

C和指针 (pointers on C)——第十五章:输入输出函数

第十五章 输入输出函数 这一章读完的第一感觉就是"呵呵". 如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了.尤其是那些抽象的格式说明.还有scanf()为什么要加括号. 读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大. 再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了. 再加上FILE的操作,输入输出定位刷新删除改名,流的概念. 这一章就会

第十五章 链表

/** 数组与链表的区别:数组易随机访问,链表易插入和删除 链表组成:储存数据元素的数据域,储存下一结点地址的指针域 链表易于插入与删除 lists 的用法????????????????????? *///建立一个图书链表 #include<iostream> #include <string> using namespace std; struct book //第一步: 用于建立节点. class 默认为私有 struct 默认为公有 //节点组成:①数据域 ②指针域(*ne

java(第十五章)

第十五章 一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名=new String("值"); 3.字符串的常用方法 3.1 字符串长度--length() 3.2 判断值是否相等 equals() 3.3 判断字符串对象地址是否相同 == 3.4 忽略 大小写 判断 equalsIgnoreCase() 3.5 大小写转换 toLowerCase(

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

第十五章 文正学院成绩录入系统

这是13年上半年给文正学院做的一个成绩录入系统,只需要实现成绩录入的功能,嫁接到文正教务系统中.实现的功能如图所示. 王川 2014/5/30 第十五章 文正学院成绩录入系统,布布扣,bubuko.com

C++ Primer Plus学习:第十五章

第十五章 友元.异常和其他 友元 友元类 表 0-1 class Tv { public: friend class Remote; } Remote类可以使用Tv的数据成员,Remote类在Tv类后定义 . 友元成员函数 表 0-2 class Tv; //前向声明 class Remote { public: void chanup(Tv &t); } class Tv { public: friend void Remote::set_chan(Tv& t, int c); } 异常

Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/usergu