首页 > 代码库 > iptables
iptables
一.防火墙是什么?
防火墙分为网络防火墙和应用层防火墙
- 网络防火墙
网络防火墙就是一个位于计算机和它所连接的网络之间的防火墙。
2.应用层防火墙
????????应用层防火墙是在 TCP/IP 堆栈的"应用层"上运作,应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。
?
总之应用层防火墙的算法会更复杂,过虑更为严格,所以在部署防火墙的时候,要把应用层防火墙部署到网络防火墙的里边。
二.iptables的表链结构
1.iptables介绍
????平时说iptables是防火墙,其实iptables是iptables/netfilter组合中的一个,只有iptables/netfilter才应该叫做防火墙,它是基于软件方式工作的网络防火墙。iptables工作于用户空间,是防火墙的规则编写工具,使用iptables编写规则并且发送到netfilter;防火墙的规则刚放到netfilter中,它是一个能够让规则生效的网络架构,工作于内核空间。
?
- iptables的表、链结构
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段的网络访问本机
[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即可
?
?????????
?
????????
iptables