iptables学习使用笔记
本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性。
最近在学习netfilter框架,少不了来学习它的控制工具iptables。
先来了解一下iptables的历史。iptables 的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是 ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)。
总得来说就是netfilter由内核实现, iptables只是用户层工具,用户通过iptables工具来配置规则,最终由netfilter使规则生效。明白了netfilter和iptables的关系后再去学习它们心理就有把握些了。
1,NetFilter在协议栈中定义了五个钩子函数:
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
引用网上的一副图:
NF_IP_PRE_ROUTING(ip_rcv)-------->NF_IP_FORWARD(ip_forward)--------->NF_IP_POST_ROUTING(ip_output)
| ^
| |
∨ |
NF_IP_LOCAL_IN NF_IP_LOCAL_OUT
(ip_local_deliver) (ip_local_out)
2,iptables策略
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
3,实际例子iptables的使用。
下面结合实际iptables例子,然后讲解其格式,更详细的可看man iptables
环境如下:
实验主机:VMware CentOS release 5.4, IP:192.168.95.228/24
控制主机:win7 IP:192.168.95.165/24
首先在95.228中开启iptables服务,service iptables restart,并确保setup中的防火墙安全级别为启用。
通用命令:
1),查看当前规则列表:
iptables -L -n -v --line-number(--line-number为了查看规则序号)
iptables -L -t nat
2), 清空规则
iptables -F //清空全部规则
或者使用iptables -F -t nat
iptables -t nat -F PREROUTING //清空指定规则
首先把实验主机默认规则设为DROP,丢弃所有数据包, 然后尝试使用ssh登陆和ping请求,无法完成登陆,无法ping通,现在相当于与世隔绝了。
然后通过增加规则,使用控制主机可以ping通实验主机。
设置DROP:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
设置过滤规则:
iptables -t filter -A INPUT -s 192.168.95.165/32 -d 192.168.95.228/42 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.95.228/32 -d 192.168.95.165/32 -p tcp --sport 22 -j ACCEPT
增加以上两条规则后,使用控制主机可以通过ssh登陆。
iptables -t filter -A INPUT -s 192.168.95.165/32 -d 192.168.95.228/32 -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.95.228/32 -d 192.168.95.165/32 -p icmp -j ACCEPT
增加以上两条规则后,使用控制主机可以ping通实验主机。
4,命令讲解
1)、规则写法:
iptables定义规则的方式比较复杂:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :4个filter nat mangle raw
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理
2)、COMMAND
-A:追加,在当前链的最后新增一个规则
-I num : 插入,把当前规则插入为第几条。
-I 3 :插入为第三条
-R num:Replays替换/修改第几条规则
-D num:删除,明确指定删除第几条规则
格式,在命令和NUM之前需要指定对哪条链操作,比如:iptables -D INPUT3
3)通用匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
-p tcp :TCP协议的扩展。一般有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21 或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
-p udp:UDP协议的扩展
-p icmp:icmp数据报文的扩展
--icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
4)、-j ACTION
常用的ACTION:
DROP:丢弃
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。
本文是按以下文章写的一个适合自己理解的学习笔记,而且不全面,原文写的比较详细。
http://blog.chinaunix.net/uid-26495963-id-3279216.html