一.防火墙是什么?
防火墙分为网络防火墙和应用层防火墙
网络防火墙就是一个位于计算机和它所连接的网络之间的防火墙。
2.应用层防火墙
应用层防火墙是在 TCP/IP 堆栈的"应用层"上运作,应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。
总之应用层防火墙的算法会更复杂,过虑更为严格,所以在部署防火墙的时候,要把应用层防火墙部署到网络防火墙的里边。
二.iptables的表链结构
1.iptables介绍
平时说iptables是防火墙,其实iptables是iptables/netfilter组合中的一个,只有iptables/netfilter才应该叫做防火墙,它是基于软件方式工作的网络防火墙。iptables工作于用户空间,是防火墙的规则编写工具,使用iptables编写规则并且发送到netfilter;防火墙的规则刚放到netfilter中,它是一个能够让规则生效的网络架构,工作于内核空间。
iptables是由四表五链组成的。
四表的优先级: raw表 > mangle表 > nat表 > filter表
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。 raw内含有两个链:PREROUTING和OUTPUT
mangle表一般是对数据包进行修改用的, mangle表中含五个链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat表内含三个链:PREROUTING、POSTROUTING、OUTPUT
filter表内含三个链:INPUT、FORWARD、OUTPUT
五链
PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING
三.规则的属性定义:
1.网络层协议
主要集中在ip协议报文上
2.传输层协议属性:
主要集中在
tcp
udp
icmp icmp其并不是真正意义传输层的,而是工作在网络层和传输层之间的一种特殊的协议
3.ip报文的属性:
IP报文的属性为: 源地址.目标地址
4.iptables规则匹配
iptables如何查看表和链
大写字母选项:可以实现某种功能,比如添加删除清空规则链;
小写字母选项:用来匹配及其他;
-L :list 列表
-n :数字格式显示ip和端口;
--line-numbers:显示行号;
-x : 显示精确值,不要做单位换算;
-t : 指定表
-t{fillter|nat|mangle|raw}
-v : 显示详细信息 -v -vvv -vvvv ..可以显示更详细的信息
5.其他子命令:
管理链:
-F :清空链
清空nat表中的input链,格式如下:
#iptables-t nat -F INPUT
#清空fllter表所有链:
#iptables-F
-P : 设定默认策略,为指定链设置默认策略,格式如下:
#设置fllter表input链的默认规则为丢弃
iptables-t fllter -P INPUT DROP
-N : 新建一条自定义链(内置链不能删除,如果太多,可以自定义链)
#自定义连只能被调用才可以发挥作用
iptables-N fillter_web
-X : 删除自定义空链,如果链内有规则,则无法删除
-Z :计算器清零
iptables-Z
-E :重命名自定义链
iptables管理规则:
-A :append附加规则,将新增的规则添加到链的尾部
-I[n] :插入为第n条规则
-D : 删除第n条规则
-R[n] : 替换第N条
表和链的对应关系:
fillter :INPUT FORWORD OUTPUT
nat : PREROUTING POSTROUTING OUTPUT
使用-t指定表来查看指定表内的规则:
#iptables-t nat -L -n
raw : prerouting output
iptables-t raw -L -n
mangle: prerouting input forword output postrouting
iptables-t mangle -L -n
#查看规则
[root@test3~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot optsource destination
Chain OUTPUT (policy ACCEPT)
target prot optsource destination
通过以上可以观察到,每一个链都有默认策略:policy ACCEPT
通常只需要修改fllter表的默认策略即可,由此如果有报文请求来访问本机的某个服务,那么则会经过input链,因此进来的报文都是需要做过滤的,那么出去的报文则不需要过滤,在有些特定的场所下也需要做过滤
所以写规则的时候必须放将规则写在正确链上,意义非常重大
规则和默认策略都有2个计数器,通过-v选项可以观察规则的匹配情况
#iptables -t nat -L -n -v
编写规则语法:
iptables [-t 表] 大写选项子命令 [规则号] 链名 匹配标准 -j 目标(规则)
目标:
DROP : 丢弃
REJECT : 拒绝
ACCEPT : 接受
RETURN : 返回主链继续匹配
REDIRECT: 端口重定向
MASQUERADE :地址伪装
DNAT : 目标地址转换
SNAT :源地址转换
MARK :打标签
LOG
自定义链
匹配标准
iptables的匹配标准大致分为两类:
1.通用匹配
-s | --src | --source [!] IP/NETWORK
-d ------------------------
-i :指定数据报文流入接口 input prerouting forward
-o :指定数据报文流出接口 output postrouting forward
-p :明确说明只放行哪种协议的报文匹配规则
以当前主机为例:
凡是来自于某个ip段的网络访问本机
[[email protected]]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.0/24 -j ACCEPT
[root@test3 xtables-1.4.7]# iptables -L -n -v
ChainINPUT (policy ACCEPT 10 packets, 1029 bytes)
pkts bytestarget prot opt in out source destination
22 1660 ACCEPT all -- * * 10.0.10.0/24 10.0.10.0/24
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 16 packets, 1536 bytes)
pkts bytes target prot opt in out source destination
pkts 被本机报文所匹配的个数
bytes 报文所有大小记起来之和
opt 额外的选项,--表示没有
target 处理机制
prot 放行哪种协议
source 源地址
destination 目标地址
对于严谨的规则,一般默认规则都是拒绝未知,允许已知
如下所示:
只放行信任IP地址段,其他全部禁止
iptables-P INPUT DORP
iptables-A INPUT -s 10.0.10.0/24 -d 10.0.10.0/24 -j ACCEPT
iptables-P OUTPUT DORP
iptables-A OUTPUT -d 10.0.10.0/24 -s 10.0.10.0/24-j ACCEPT
保存规则
[root@test3~]# /etc/init.d/iptables save
iptables:Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
保存规则至其他文件
[root@test3~]# iptables-save > /tmp/iptables
加载iptables文件规则
[root@test3~]# iptables-resotre < /tmp/iptables
1.2.规则的替换
首先来查看规则
[root@test3 ~]# iptables -L -n --line-number
ChainINPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.0/24
ChainFORWARD (policy DROP)
num target prot opt source destination
ChainOUTPUT (policy ACCEPT)
num target prot opt source destination
替换规则:将规则1替换为 eth0只能够通过某个网段进来
[root@test3~]# iptables -R INPUT 1 -s 10.0.10.0/24-d 10.0.10.62 -i eth0 -j ACCEPT
[root@test3~]# iptables -L -n --line-number
ChainINPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.62
2.扩展匹配
#所有的扩展匹配表示要使用-m来指定扩展的名称来引用,而每个扩展模块一般都会有自己特有的专用选项,在这些选项中,有些是必备的:
2.1隐含扩展
如下所示:
#端口之间必须是连续的
-p tcp--sport|--dport 21-80
#取反,非21-80的端口
-p tcp--sport|--dport !21-80
#检测报文中的标志位
--tcp-flagsSYN,ACK,RST,FIN, SYN
ALL #表示为所有标志位
NONE #表示没有任何一个标志位
#--tcp-flags ALL NONE #表示所有标志位都检测,但是其中多有都为0
#--tcp-flage ALL SYN,FIN #表示SYN,FIN都为1(即握手又断开)
#生成环境下tcp-flags 用的非常多,意义非常重要
例:放行本机对web的访问
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -ptcp --dport 80 -j ACCEPT
[root@test3~]# iptables -L -n
ChainINPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 10.0.10.0/24 10.0.10.62
ACCEPT tcp -- 0.0.0.0/0 10.0.10.62 tcp dpt:80
放行出去的报文,源端口为80
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p tcp --sport 80 -j ACCEPT
查看匹配规则
[root@test3 ~]# iptables -L -n --line-number
ChainINPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.62
2 ACCEPT tcp -- 0.0.0.0/0 10.0.10.62 tcp dpt:80
ChainFORWARD (policy DROP)
num target prot opt source destination
ChainOUTPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.0/24
2 ACCEPT tcp -- 10.0.10.62 0.0.0.0/0 tcp spt:80
考虑要点:
(1)规则为放行出去的响应报文
(2)考虑源IP地址为本机,目标为访问的时候拆开报文才可以获知,而写规则的时候是面向所有主机,所以这里不用写
(3)源端口:80 ,因为用户访问的时候一定会访问其80端口,无可非议的
(4)目标端口:请求到来的时候事先无法断定对方的端口是多少,所以不用写
2.2协议匹配
通常对协议做匹配则使用 -p 参数 来指定协议即可
匹配UDP:UDP只有端口的匹配,没有任何可用扩展,格式如下
-p udp--sport | --dport
匹配ICMP格式如下
-picmp --icmp-[number]
icmp常见类型:请求为8(echo-request),响应为0(echo-reply)
例:默认规则input output 都为DROP,使其本机能ping(响应的报文)的报文出去
通过此机器去ping网关10.0.10.1 , 可结果却提示not permitted,使其能通10.0.10.0/24网段中的所有主机
[root@test3~]#iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -p icmp --icmp-type8 -j ACCEPT
可看到无法响应:0表示响应进来的报文规则,并没有放行自己作为服务端的的角色规则
[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p icmp --icmp-type0 -j ACCEPT
#ping 10.0.10.x
允许类型为0(响应报文)出去
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -picmp --icmp-type 0 -j ACCEPT
例2:本机DNS服务器,要为本地客户端做递归查询;iptables的input output默认为drop 本机地址是10.0.10.62
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --dprot 53 -j ACCEPT
[root@test3~]# iptables -A OUTPUT -S 10.0.10.62 -p udp --sprot 53 -j ACCEPT
客户端请求可以进来,响应也可以出去,但是自己作为客户端请求别人是没有办法出去的,所以:
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p udp --dport 53 -j ACCEPT
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --sprot 53 -j ACCEPT
如果为tcp 则将以上udp改为tcp即可