一、防火墙简述

防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668(A)1993-12-15)。它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。

所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。

在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术。防火墙是在两个网络通讯时执行的一种访问控制尺度,它能允许你“同意”的人和数据进入你的网络,同时将你“不同意”的人和数据拒之门外,最大限度地阻止网络中的***来访问你的网络。换句话说,如果不通过防火墙,公司内部的人就无法访问Internet,Internet上的人也无法和公司内部的人进行通信。

概括一句话:防火墙是一种工作于主机或网络的边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,并对能够被规则匹配到报文作出相应处理的隔离工具。



二、netfilter/iptables

netfilter/iptables是在linux2.4+内核版本上特有的包过滤型防火墙。其中netfilte位于内核空间,iptables位于用户空间,二者通过ip_tables模块来完成封包过滤、封包重定向和网络地址转换(NAT)等一系列的功能。


wKiom1ap5O6wJZY0AAH2JVh9afc246.png


1、iptables的基础概念

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

内置链有:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

每个表的对应链如下:

filter:INPUT、FORWARD、OUTPUT

nat:PREROUTING,INPUT(CentOS7+)、OUTPUT、POSTROUTING

mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

raw:PREOUTING、



2、iptables传输数据包的过程

wKioL1ap60GA2fvWAAQCLgnnIf4987.png

a、当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。

b、如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

c、如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。


简单的报文流向:

流入本机:PREROUTING-->INPUT

由本机流出:OUTPUT-->POSTROUTING

转发:PREROUTING-->FORWARD-->POSTROUTING



三、iptables命令

规则格式:iptables [-t tables] COMMAND chain [rules]|[-m matchname [per-match-options]] -j targetname [per-target-options]

table:表选项

COMMAND:对链的操作命令

chain:链名

rules:匹配的条件

matchname:显示扩展加载的模块名

per-match-options:扩展模块的选项

targetname:处理动作

per-target-options:处理动作的选项


1、table

其选项有filter、nat、raw、mangle,不同的表对应不同的功能,常用的表为filter和nat,默认为filter表。


2、COMMAND

-L:list,显示当前链上的所有规则

  -n:以数字格式显示地址和端口号

  -v:显示详细信息

  -x:显示计数器结果的精确数值(每条规则都有2个计数器,分别用来计算报文个数和报文大小之和,需和-v一起使用)

  --line-number:显示规则的序号

[root@localhost ~]# iptables -L -n -x -v --line-number
Chain INPUT (policy ACCEPT 349 packets, 32318 bytes)
num      pkts      bytes target     prot opt in     out     source               destination         
1         119     9996 DROP       all  --  *      *       172.16.7.20          172.16.7.22         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num      pkts      bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 192 packets, 17840 bytes)
num      pkts      bytes target     prot opt in     out     source               destination


-N:new,新建一条自定义链

[root@localhost ~]# iptables -N TEST
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  172.16.7.20          172.16.7.22         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain TEST (0 references)
target     prot opt source               destination


-X:delete,删除自定义的规则链,不指明则清空所有自定义链

[root@localhost ~]# iptables -X TEST
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  172.16.7.20          172.16.7.22         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


-P:policy,设置默认链的策略;对filter表来说其默认策略有:ACCEPT、DROP、REJECT(使用ssh登录时注意不能乱改)

[root@localhost ~]# iptables -P FORWARD DROP
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  172.16.7.20          172.16.7.22         

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


-E:重命名自定义链


-A:append,追加一条规则

[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  172.16.7.20          172.16.7.22         
REJECT     all  --  172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


-I:insert,插入一条规则,不指明位置时默认为第一条

[root@localhost ~]# iptables -I INPUT -s 172.16.7.21 -d 172.16.7.22 -p 22 -j ACCEPT
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     22   --  172.16.7.21          172.16.7.22         
DROP       all  --  172.16.7.20          172.16.7.22         
REJECT     all  --  172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


-D:delete,删除一条规则

[root@localhost ~]# iptables -D INPUT 1
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  172.16.7.20          172.16.7.22         
REJECT     all  --  172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


-R:replace,替换指定的链上的规则

[root@localhost ~]# iptables -R INPUT 1 -s 172.16.7.21 -d 172.16.7.22 -p 22 -j ACCEPT
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     22   --  172.16.7.21          172.16.7.22         
REJECT     all  --  172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


-F:flush,清空指定的链上的规则,不指明则清空全部

[root@localhost ~]# iptables -F INPUT 
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


-Z:zero,将规则的计数器置零

[root@localhost ~]# iptables -Z
[root@localhost ~]# iptables -L -v
Chain INPUT (policy ACCEPT 8 packets, 590 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  any    any     172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 400 bytes)
 pkts bytes target     prot opt in     out     source               destination


3、chain

链分为内置链和自定义链。

内置链有5种,分别为PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING,对应于netfilter上的hook函数。

自定义链是对内置链的扩展和补充,可以实现更加灵活的规则管理机制。


在添加规则时,一般从实现的功能和报文流经的路径2方面考虑。与此同时,链上的规则次序也是检查的次序,其中隐含着一定的应用法则:

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

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

c、将那些可由一条规则描述的多个规则合并起来

d、设置默认策略


4、rules

a、基本匹配条件:不需要加载额外模块,由iptables/netfilter自行提供

[!] -s, --source  address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围

[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围

[!] -p, --protocol protocol:检查报文的中IP地址的端口是否符合此处指定的地址或范围

protocol:tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or "all"

[root@localhost ~]# iptables -A INPUT -s 172.16.7.20 -d 172.16.7.22 -p icmp -j DROP      
#将172.16.7.20主机p发送给172.16.7.22主机的icmp包全部丢弃,即禁ping


[!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;

[!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;

b、扩展匹配条件:需要事先加载扩展模块,才能生效。其分为隐式扩展和显式扩展。


隐式扩展:是对协议的扩展,不需要手动加载模块,只要用-p指明了协议,即自动表明了要扩展的模块,常用的有tcp、udp、icmp。

a、tcp:

[!] --source-port,--sport port[:port]:匹配报文的源端口;可以是端口范围         

[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围


b、udp:

[!] --source-port,--sport port[:port]:匹配报文的源端口;可以是端口范围 

[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围


c、icmp:

[!] --icmp-type {type[/code]|typename}:匹配icmp报文的类型

     echo-request:8(请求报文)

     echo-reply:0(回应报文)

[root@localhost ~]# iptables -A OUTPUT -d 172.16.7.20 -s 172.16.7.22 -p icmp --icmp-type 0 -j REJECT
#拒绝所有从172.16.7.22主机出来到172.16.7.20主机的icmp的回复报文


显示扩展:必须要手动加载才能实现多种功能的模块。

a、multiport扩展

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

[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口

[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口

[!] --ports port[,port|,port:port]...:指明多个端口

[root@localhost ~]# iptables -A INPUT -s 172.16.7.20 -d 172.16.7.22 -p tcp -m multiport --dports 20,22 -j REJECT
#在INPUT链上拒绝所有从172.16.7.20主机发送到172.16.7.22主机的需要调用20(ftp)和22(ssh)端口的tcp报文。


b、iprange扩展

指明连续的(但一般不是整个网络)ip地址范围

[!] --src-range from[-to]:源IP地址范围

[!] --dst-range from[-to]:目标IP地址范围

[root@localhost ~]# iptables -A INPUT -m iprange --src-range 172.16.7.20-172.16.7.100 -d 172.16.7.22 -j REJECT
##在INPUT链上拒绝所有从172.16.7.20主机到172.16.7.100主机范围地址内的主机发送到172.16.7.22主机的所有报文。


c、string扩展

对报文中的应用层数据做字符串模式匹配检测

--algo {bm|kmp}:字符串匹配检测算法

[!] --string pattern:要检测的字符串模式

[!] --hex-string pattern:要检测的字符串模式,16进制格式

[root@localhost ~]# iptables -A OUTPUT -m string --algo bm --string 1989 -j REJECT
#拒绝所有包含字符1989的报文从OUTPUT链上发出去


d、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...]

--kerneltz:使用内核上的时区,而非默认的UTC

[root@localhost ~]# iptables -A INPUT -d 172.16.7.22 -m time --timestart 8:00 --timestop 17:30 -j REJECT
#在8:00-17:30时间内,拒绝所有到达172.16.7.22主机的报文


e、connlimit扩展

根据每客户端单IP做并发连接数量匹配

--connlimit-upto n:连接的数量小于等于n时匹配(CentOS7新增选项)

--connlimit-above n:连接的数量大于n时匹配

[root@localhost ~]# iptables -A INPUT -s 172.16.7.20 -d 172.16.7.22 -m connlimit --connlimit-above 2  -j REJECT
#从172.16.7.20主机发送到172.16.7.22主机的报文同时最多不能超过2个,否则拒绝


f、limit扩展

基于收发报文的速率做匹配

令牌桶过滤器:

--limit rate[/second|/minute|/hour|/day]:平均允许

--limit-burst number:峰值允许(第一次)

[root@localhost ~]# iptables -A INPUT -d 172.16.7.22 -t icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
#发送到172.16.7.22主机的icmp发送请求每分钟不超过3个,峰值最大为5个


g、state扩展(conntrack)

根据”连接追踪机制“去检查连接的状态

conntrack机制:追踪本机上的请求和响应之间的关系;状态有以下几种:

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

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

RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系(第一次)nf_conntrack_ftp)

INVALID:无效的连接

UNTRACKED:未进行追踪的连接


[!] --state state

[root@localhost ~]# iptables -A INPUT -d 172.16.7.22 -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
#只允许状态为NEW和ESTABLISHED的tcp包到达172.16.7.22的主机
[root@localhost ~]# iptables -A OUTPUT -s 172.16.7.22 -p tcp -m state --state ESTABLISHED -j ACCEPT
#只允许状态为ESTABLISHED的tcp包从172.16.7.22的主机输出


5、target

target=-j targetname [per-target-options]

表示对该匹配条件的处理动作,常用的有以下几种:

ACCEPT:接受数据包

DROP:丢弃数据包

REJECT:与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息

REDIRECT:端口重定向

RETURN:返回调用链

SNAT:源地址转换,即改变数据包的源地址

DNAT:目标地址转换,即改变数据包的目的地址

MASQUERADE:IP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT

LOG:日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错

MARK:进行防火墙标志



四、iptables的nat应用

1、nat简介

NAT:Network Address Translation,即网络地址转换。它是一个IETF标准,允许一个机构以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个IP地址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有Internet地址和私有IP地址的使用。


2、nat的类型

常见的NAT有SNAT、DNAT和PNAT。

SNAT:source nat,即源地址转换。用于让本地网络中的主机通过某一特定的地址访问外部网络,主要在POSTROUTING和OUTPUT上。

DNAT:destination nat,即目标地址转换。用于让本地网络中的某一主机的某服务开放给外部网络的用户访问时,主要在PREROUTING上


3、nat的相关命令

作为iptables的功能表之一,nat的要点主要在于处理动作上:

a、SNAT

--to-source [ipaddr[-ipaddr]][:port[-port]]

--random

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.7.22
#任何从192.168.1.0/24发来的包在经过本机转发出去时都会把包的源IP改为172.16.7.22(需在内核启动转发功能)


b、DNAT

--to-destination [ipaddr[-ipaddr]][:port[-port]]

[root@localhost ~]# iptables -t nat -A PREROUTING -d 172.16.7.22 -j DNAT --to-destination 172.16.7.20
#将发送到172.16.7.22主机的包直接转发给172.16.7.20主机


c、MASQUERADE

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
#将从192.168.1.0/24网段的包的源地址自动转换地址后从本机转发出去



参考:

http://blog.chinaunix.net/uid-23069658-id-3160506.html

http://blog.csdn.net/andy_yf/article/details/7730525

http://www.ibm.com/developerworks/cn/linux/network/s-netip/