对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的。因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的。

防火墙定义:
所谓防火墙是工作在网络或主机的边缘,对进出的数据包根据定义的规则进行检查,并做出相应处理的一套组件。
防火墙类型
根据工作的层次来划分,常见的防火墙工作在OSI模型的第三层,称为网络层防火墙,工作在OSI第七层的称为应用层防火墙
 
    网络层防火墙又称为包过滤型防火墙,它内置于linux系统的内核,在网络层或传输层对经过的数据包进行筛选,筛选的依据是系统内设置的过滤规则。通过检查数据流中每个数据包的源地址、目的地址、所有的协议、端口号等因素,来决定是否允许该数据包通过。
 
    应用层防火墙又称为代理服务器型防火墙,代理服务器实际上是运行在防火墙上的一种服务器程序。服务器监听客户机的请求,当内网的客户机请求与外网的真实服务器连接时,客户端首先连接代理服务器,然后再由代理服务器与外网的真实服务器连接,取得客户想要的信息,然后再把信息返回给客户。
防火墙工作模式:

防火墙基础及iptables应用_基础   在Linux系统中提供了一个非常优秀的包过滤型防火墙工具—netfilter/iptables。它功能强大、使用灵活、可以对流入和流出的信息进行细化控制,且可以在一台低配置机器上很好地运行。这里我们详细介绍下iptables的规则及其用法。

    Netfilter/iptables最早是与2.4内核版本的Linux系统集成的IP信息包过滤系统。它由Netfilter和iptables两个组件组成。
 
    Netfilter组件称为内核空间,它集成在Linux的内核中。主要由信息包过滤表(tables)组成,而表由若干个链组成,每条链中可以由一条或者多条规则组成。总的来说,Netfilter是表的容器,表是链的容器,而链又是规则的容器。
 
    Netfilter本身并不对数据包进行过滤,而iptables就是在Netfilter之上建立了防火墙功能,iptables就是由一组有序的规则建立起来的,这些规则与包含共同特征的数据包进行匹配,根据规则来判定是放行或丢弃。
 
表(table):主要包含四种表,filter,nat,mangle,raw.
链(chain):主要有5种链,PREROUTING,INPUT,OUTPUT,FORWORD,POSTROUTING
 
filter表是iptables默认的表,主要用于数据包的过滤。
它包含的链有:
INPUT:处理进入的数据包
FORWORD:处理转发的数据包
OUTPUT:处理本地生成的数据包
nat表主要用于网络地址转换。
它包含的链:
PREROUTING:修改即将到来的数据包
OUTPUT:修改在路由之前本地生成的数据包
POSTROUTING:修改即将出去的数据包
mangle表主要用于对指定的包进行修改。
它包含的链:
在linux内核2.4.18之后包含了所有的链。
独立于netfilter连接跟踪子系统起作用的规则应用于raw表。
它包含的链:
PREROUTING和OUTPUT
 
具体匹配流程如图:

防火墙基础及iptables应用_基础_02

iptables命令的格式:
iptables [-t 表名] -命令 [链名] 匹配条件 目标动作
iptables [-t table] command CHAIN [NUM ]   match criteria -j TARGET
 
对链(CHAIN)的操作:
-N:新建一条链
-X: 删除一条用户自定义的链
-F: 清空一条链,默认清空filter中的链
-Z:清空计数器,iptables中的每条规则默认有两个计数器,用于记录本条规则多匹配到的数据包的个数和大小
-P:定义链的默认处理策略
-E:重命名一条链
 
对规则的操作:
-A:追加,在链的最后追加一条规则
-I:插入,一般使用-I CHAIN num 指插入哪一条
-R:替换某条规则,-R CHAIN num 替换哪一条
-D:删除一条规则,可以指定num来指定删除哪条规则。
 
查看规则:
-L:列出链中所有的规则
-L还有许多辅助的子命令,可以和它一起使用
-n: 不要对地址和端口做反解,即只显示数字地址
-v:显示详细信息,-vv -vvv  v表示详细程度
-x:显示计数器的精确值
--line-numbers 显示规则的行号
匹配条件:分2种
1、通用匹配
-s  --src,--source 指定匹配的源地址
-d  --dst,--destination 指定匹配的目标地址
地址的格式:
IP
NETWORK/MASK
地址前加!可以表示取反
-p  {icmp| tcp|udp} 指定协议
-i  数据包的流入接口(INPUT,FORWORD,PREROUTING)
-o   数据包的流出接口(OUTPUT,FORWORD,POSTROUTING)
2、扩展匹配:扩展匹配中又分为隐式扩展和显示扩展
1),隐式扩展:是对协议的扩展
-p tcp
--sport PORT[-PORT2] 指定源端口
--dport PORT[-PORT2] 指定目标端口
--tcp-flags {SYN,ACK,URG,RST,PSH,FIN}指定要检查的位(需要跟2个标志位列表,中用空格隔开)
eg:--tcp-fiags SYN,ACK,RST,FIN  SYN
第一个列表表示要检查的位,第二个列表该标志位必须为1
--syn :专门匹配第一次握手。
-p udp
--sport 指定源端口
--dport 指定地址端口
-p icmp
--icmp-type 指icmp类型
0:echo-reply 指给予回应
8:echo-request 指请求回应
2),显式扩展:由netfilter扩展模块引入的扩展,用于匹配条件
-m :指定模块 (只引用模块的名称),模块在/lib/iptables下
-m state  :用于实现连接的状态检测
--state 
NEW,通信者发送新的请求状态
ESTABLISHED,建立连接的状态
RELATED相关联的,指一个完整的连接,需要依赖另一个完整的连接
INVALID,非法的,无效的连接状态
-m multiport  
--source-ports port1,port2.. 指定多个源端口
--destination-ports  port1,port2.. 指定多个目标端口
--ports 无论是源还是目标都予以匹配
-m limit 用一令牌桶过滤器限定速率(每时间多少个)
--limit 后接速率 (3/second)
--limit-burst num  最大峰值
-m connlimit  限定连接并发速率
[!] --connlimit-above num  指定多于num才满足条件将被拒绝
-m iprange 用于指定连续的地址匹配
--src-range ip-ip 源IP的网段
--dst-range ip-ip 目标IP的网段
eg: -m iprange --src-range 172.16.100.1-172.16.100.100
-m mac mac地址的匹配
--mac-source XX:XX:XX:XX:XX:XX
只能用在PREROUTING,INPUT,FORWORD链中
-m string 根据一定的模式和一定的策略来匹配字符串
--algo bm|kmp 匹配算法
--string “pattern” 匹配模式
-m recent 动态指定一个ip地址列表,不让它们匹配
--name NAME
--set 把数据包源地址加到指定列表中
--rcheck 同常和--set 一起用
--remove 从列表中释放
--second 限定时间 和--rcheck/--update一起使用
--hitcount hits 
-m time 基于时间的匹配
--datestart 开始日期
--datestop 结束日期
--timestart 开始时间
--timestop 结束时间
--weekdays 周几
目标动作都有哪些:(TARGET)
ACCEPT 接收
DROP 丢弃
REJECT 拒绝(给予拒绝回应)
REDIRECT 端口重定向
LOG 记录访问日志
SNAT:
源地址转换
隐藏内部网络及其主机
使得众多内网客户端能够使用有限IP地址访问互联网工作在nat表中的POSTROUTING
-j SNAT
--to-source
DNAT:
目标地址转换,将内部私有的服务公开给外部,工作在nat表中的PREROUTING 
-j DNAT
--to-destination
PNAT: 端口转换,在DNAT中将用户访问的目标端口映射为内网服务器上的一个不同端口,实现方法只需要为--to-destination 的目标端口的主机添加':8080'式的端口即可。
PNAT本身并不是一个TARGET
 
下面举几个示例来具体看下iptables的用法:
例1:用iptables命令写一条规则,限制主机172.16.9.2对外部网络不能访问,别人也不可以访问该主机 
  1. [root@www ~]# iptables -t filter -A INPUT -d 172.16.9.2 -p icmp --icmp-type 8 -j DROP   #进来的数据包 
  2. [root@www ~]# iptables -t filter -A OUTPUT -s 172.16.9.2 -p icmp --icmp-type 0 -j DROP  #出去的数据包 
自己也ping不出去的
  1. [root@www ~]# ping 172.16.1.1 
  2. PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data. 
  3. From 172.16.9.2 icmp_seq=1 Destination Host Unreachable 
  4. From 172.16.9.2 icmp_seq=2 Destination Host Unreachable 
  5. From 172.16.9.2 icmp_seq=3 Destination Host Unreachable 
在这里会检测到别人ping进来的匹配的包
  1. [root@www ~]# iptables -L -n -v 
  2. Chain INPUT (policy ACCEPT 345 packets, 27474 bytes) 
  3.  pkts bytes target     prot opt in     out     source               destination          
  4.     3   252 DROP       icmp --  *      *       0.0.0.0/0            172.16.9.2          icmp type 8  
  5.  
  6. Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 
  7.  pkts bytes target     prot opt in     out     source               destination          
  8.  
  9. Chain OUTPUT (policy ACCEPT 217 packets, 21320 bytes) 
  10.  pkts bytes target     prot opt in     out     source               destination          
  11.     0     0 DROP       icmp --  *      *       172.16.9.2           0.0.0.0/0           icmp type 0  

  1. [root@www ~]# iptables -F   #删除规则,默认是删除filter表中的规则也可以用-t TABLE 指定删除哪个表中的规则。 

例2、从172.16.9.2这台主机出去的已经建立连接的数据包都予以放行
  1. [root@www ~]# iptables -A OUTPUT -s 172.16.9.2 -m state --state ESTABLISHED -j ACCEPT 
例3、在INPUT链中插入第一条规则,表示新建立tcp和已经建立tcp连接的主机远程连接以及访问172.16.9.2的网页的都予以放行
  1. [root@www ~]# iptables -I INPUT 1 -d 172.16.9.2 -p tcp -m multiport --destination-ports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT   
例4、从接口eth0请求访问172.16.9.2的主机5分钟内不超过3次请求的都予以放行,超过3次的都丢弃
  1. [root@www ~]# iptables -A INPUT -i eth0 -d 172.16.9.2 -p icmp --icmp-type 8 -m limit --limit 300/second  --limit-burst 3 -j ACCEPT 
  2. [root@www ~]# iptables -A INPUT -i eth0 -d 172.16.9.2 -p icmp --icmp-type 8 -j DROP 
例5、在OUTPUT链中新增一条规则,表示从172.16.9.2的80端口出去的里面包含"sex"字符串的数据包予以丢弃
  1. [root@www ~]# iptables -I OUTPUT 1 -o eth0 -s 172.16.9.2 -p tcp --sport 80 -m string --algo kmp --string "sex" -j DROP 

iptables还可以限制很多功能的,可以自己摸索下哦。
 
下面我们来演示源地址转换功能:
假设这样一种场景,假设192.168.10.2是外网的一台WEB服务器,中间的那台是NAT服务器,假设有2块网卡不再同一地址段内,我们在其上面添加iptables规则,可以实现地址转换的功能,以使172.16.0.2的pc机能够连接通过该服务器访问到WEB服务器上来。

防火墙基础及iptables应用_防火墙_03

1、搭建的环境:172.16.9.0 网段使用虚拟网卡的仅主机功能
192.168.10.0网段使用桥接功能
 
2、设置:PC机的网关设为192.168.10.1,WEB服务器的网关设为172.16.9.1,打开中间NAT服务器的转发功能,PC机就可以访问web服务器了。

防火墙基础及iptables应用_基础_04

防火墙基础及iptables应用_基础_05

防火墙基础及iptables应用_防火墙_06

防火墙基础及iptables应用_基础_07

这时看下http的访问日志,源地址即是pc机的地址:
tail /var/log/httpd/accecc_log

防火墙基础及iptables应用_基础_08

我们在NAT服务器上添加一条iptables转换规则:

防火墙基础及iptables应用_基础_09

再去通过192.168.10.2访问该WEB服务器(规则会自动生效的,不用重启服务)

防火墙基础及iptables应用_防火墙_10

再次打开访问日志,源地址就会改变的哦:

防火墙基础及iptables应用_防火墙_11

规则里面就会有访问该服务器所匹配到的包了:

防火墙基础及iptables应用_基础_12

我们还可以通过远程访问下WEB服务器看下源地址是否改变了。

防火墙基础及iptables应用_防火墙_13

再来看下web服务器登录的效果:

防火墙基础及iptables应用_防火墙_14

源地址已经改变了~~
这就是我们所说的源地址转换了,只需要一条规则即可,很简单吧。
 
由于我的电脑性能不好,开了3台虚拟机已经卡的不能工作了,暂时只给大家提供源地址转换的操作,目标地址转换原理和源地址转换是一样的,您可以自己动手操作下哦。^_^

 补充:

iptables规则在电脑重启后就会消失不见的,如果想要永久保存规则的话,可以使用 service iptables save 命令,规则就会被保存在/etc/sysconfig/iptables 文件中了。

再次用到的时候可以用命令直接恢复即可:

iptables-restore < /etc/sysconfig/iptables

保存时还可以保存到指定的文件中:

iptables-save > /PATH/TO/FILE

iptables-restore < /PATH/TO/FILE