一.防火墙是什么? web
防火墙分为网络防火墙和应用层防火墙 算法
网络防火墙就是一个位于计算机和它所链接的网络之间的防火墙。 服务器
2.应用层防火墙 网络
应用层防火墙是在 TCP/IP 堆栈的"应用层"上运做,应用层防火墙能够拦截进出某应用程序的全部封包,而且封锁其余的封包(一般是直接将封包丢弃)。 架构
总之应用层防火墙的算法会更复杂,过虑更为严格,因此在部署防火墙的时候,要把应用层防火墙部署到网络防火墙的里边。 app
二.iptables的表链结构 tcp
1.iptables介绍 工具
平时说iptables是防火墙,其实iptables是iptables/netfilter组合中的一个,只有iptables/netfilter才应该叫作防火墙,它是基于软件方式工做的网络防火墙。iptables工做于用户空间,是防火墙的规则编写工具,使用iptables编写规则而且发送到netfilter;防火墙的规则刚放到netfilter中,它是一个可以让规则生效的网络架构,工做于内核空间。 post
iptables是由四表五链组成的。 spa
四表的优先级: 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段的网络访问本机
[root@test3xtables-1.4.7]# 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便可