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。

语法:

1
2
3
4
5
6
7
8
9
10
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:

1
2
-t table:
  filter,nat,mangle,raw

链管理选项:

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

规则管理选项:

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

查看选项:

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

匹配条件选项:

基本匹配:

1
2
3
4
5
[!] -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选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-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个端口

1
2
3
4
5
[!] --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地址范围时使用

1
2
3
4
[!] --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扩展:检查报文中出现的字符串

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

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

1
2
3
4
5
6
7
8
9
10
11
12
--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支持))做并发连接数数量匹配

1
2
3
4
5
6
7
[!] --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扩展:基于收发报文的速率做检查

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

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

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

1
/proc/sys/net/nf_conntrack_max

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

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

a) 加大ip_conntrack_max值

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

b) 降低ip_conntrack timeout时间

1
2
3
4
5
6
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

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

1
/proc/net/nf_conntrack

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

1
/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)

1
modprobe nfcontrack_ftp

b) 放行请求报文

命令连接:NEW,ESTABLISHED

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

数据连接:RELATED,ESTABLISHED

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

c) 放行响应报文

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

  目标选项:

-j TARGET:跳转至指定的TARGET

常用的TARGET:

ACCEPT:接受

DROP:丢弃

REJECT:拒绝

RETURN:返回调用链

REDIRECT:端口重定向

LOG:记录日志

MARK:做防火墙标记

DNAT:目标地址转换

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

SNAT:源地址转换

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

MASQUERADE:地址伪装

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

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

保存及重载规则:

保存规则至指定文件:

1
iptables-save > /PATH/TO/SOMEFILE

从指定文件重载规则:

1
iptables-restore < /PATH/FROM/SOMEFILE

CentOS6:

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

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

1
2
firewall-cmd
firewalld-config

关于firewalld:

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

本文转自 忘情OK  51CTO博客,原文链接:http://blog.51cto.com/itchentao/1933530,如需转载请自行联系原作者

第十五章 iptables相关推荐

  1. java十五章_java:第十五章

    第十五章 字符串1.字符串(String)的定义 String str="内容"; String str=new String(); //内容为null String str=ne ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...

  3. Gradle 1.12用户指南翻译——第三十五章. Sonar 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  4. Visual C++ 2008入门经典 第十五章 在窗口中绘图

    /*第十五章 在窗口中绘图 主要内容: 1 Windows为窗口绘图提供的坐标系统 2 设置环境及其必要性 3 程序如何以及在窗口中绘图 4 如何定义鼠标消息的处理程序 5 如何定义自己的形状类 6 ...

  5. 第十五章 shell正则表达式

    第十五章 shell正则表达式 见图片 Shell正则表达式 正则表达式的分类 基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 扩展的正 ...

  6. 第二十五章补充内容 3 assert()宏

    //第二十五章补充内容 3 assert()宏 //有的编译器还提供了assert()宏,这个宏在许多书中被翻译为断言,它的作用是当assert()的参数为真时,返回真,假如参数值为假,那么它将执行某 ...

  7. 《Erlang程序设计》第十五章 ETS和DETS:大数据的存储机制

    第十五章 ETS和DETS:大数据的存储机制 Table of Contents 第十五章 ETS和DETS:大数据的存储机制 15.1 表的基本操作 创建和打开表 插入表 查找元组 释放表 15.2 ...

  8. 第十五章 异常检测-机器学习老师板书-斯坦福吴恩达教授

    第十五章 异常检测 15.1 问题动机 15.2 高斯分布 15.3 算法 15.4 完善和评估一个异常检测系统 15.5 异常检测 vs 监督学习 15.6 选择使用的特征 15.7 多元高斯分布 ...

  9. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...

最新文章

  1. 连续 3 天,企业容器应用实战营上海站来啦!
  2. SAP UI5 footerbar按钮高亮实现逻辑
  3. J - Just Multiplicative Inverse Gym - 102875J
  4. 73 forward动作
  5. SCCM2012R2部署之四:配置客户端发现
  6. 昇腾AI处理器软件栈--流程编排器(Matrix)
  7. 4月8日--关于Date的练习题--自定义获取当前时间
  8. springcache使用笔记001_注释驱动的 Spring cache 简单使用
  9. 删除节点命令removeNode
  10. win11组策略如何开启自动更新 Windows11组策略开启自动更新的设置方法
  11. 20165328 第八周学习总结
  12. Wolfram Mathematica 13 for Mac(功能强大的科学计算软件)
  13. C语言scanf跳出循环的问题
  14. Android入门基础教程1
  15. 【单位换算】存储单位(bit Byte KB MB GB TB PB EB ZB YB BB)时间单位(ms μs ns ps)长度单位(dm cm mm μm nm pm fm am zm ym)
  16. 台式计算机屏幕亮度在哪调,电脑亮度怎么调?教您电脑亮度在哪里调
  17. java写一个android程序_【Android开发笔记】3.编写第一个Android程序
  18. 从0了解矩阵——矩阵的本质
  19. 【NLP】jieba分词
  20. IBM ServerGuide 9.21

热门文章

  1. Refactoring之——代码的坏味道(一)过长方法
  2. PAT:1050. String Subtraction (20) AC
  3. QTP模拟鼠标和键盘事件整理
  4. shell 并行执行与串行执行
  5. 【Linux】索引式文件系统
  6. boa 调用 cgi 读取文件_PHP7的内核CGI与FastCGI,你懂多少?
  7. 完美安装ubuntu
  8. Binary Tree Paths
  9. SMP IRQ affinity
  10. LeetCode - 48. Rotate Image