1 简介
linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成。
netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易。
2 实验环境
OS:Debian 8.3
iptables安装:
1
|
sudo aptitude install iptables
|
检查iptables是否已经安装
3 Iptables 命令说明及参考
命令:
1
|
iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
|
3.1 表名
表名:Filter, NAT, Mangle, Raw
起包过滤功能的为表Filter,可以不填,不填默认为Filter
3.2 命令选项
选项名 |
功能及特点 |
-A |
在指定链的末尾添加(–append)一条新的规则 |
-D |
删除(–delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则 |
-I |
在指定链中插入(–insert)一条新的规则,默认在链的开头插入 |
-R |
修改、替换(–replace)指定链中的一条规则,按规则序号或内容确定 |
-L |
列出(–list)指定链中的所有的规则进行查看,默认列出表中所有链的内容 |
-F |
清空(–flush)指定链中的所有规则,默认清空表中所有链的内容 |
-N |
新建(–new-chain)一条用户自己定义的规则链 |
-X |
删除指定表中用户自定义的规则链(–delete-chain) |
-P |
设置指定链的默认策略(–policy) |
-n |
用数字形式(–numeric)显示输出结果,若显示主机的 IP地址而不是主机名 |
-P |
设置指定链的默认策略(–policy) |
-v |
查看规则列表时显示详细(–verbose)的信息 |
-V |
查看iptables命令工具的版本(–Version)信息 |
-h |
查看命令帮助信息(–help) |
–line-number |
查看规则列表时,同时显示规则在链中的顺序号 |
3.3 链名
作为-A的参数,可以根据数据流向来确定具体使用哪个链,在Filter中的使用情况如下
链名 |
说明 |
INPUT链 |
处理来自外部的数据。 |
OUTPUT链 |
处理向外发送的数据。 |
FORWARD链 |
将数据转发到本机的其他网卡设备上。 |
3.4 条件匹配
条件匹配分为基本匹配和扩展匹配,拓展匹配又分为隐式扩展和显示扩展。
3.4.1 基本匹配:
匹配参数 |
说明 |
-p |
指定规则协议,如tcp, udp,icmp等,可以使用all来指定所有协议 |
-s |
指定数据包的源地址参数,可以使IP地址、网络地址、主机名 |
-d |
指定目的地址 |
-i |
输入接口 |
-o |
输出接口 |
3.4.2 隐式扩展匹配:
扩展项 |
隐含扩展条件 |
需包含 |
说明 |
–sport | -m tcp | -p tcp |
源端口 |
|
|
–dport |
目标端口 |
|
|
–tcp-flags |
示例(SYN,ACK,RST,FIN SYN) |
|
|
–sport |
第一次握手 |
|
|
–sport | -m tcp | -p tcp |
源端口 |
|
|
–dport |
目标端口 |
|
|
–icmp-type |
-m icmp |
-p icmp |
8:echo-request 0:echo-reply |
3.4.3 显示扩展匹配:
使用额外的匹配规则
扩展项 |
显示扩展条件 |
说明 |
–state |
-m state |
用于实现连接的状态检测(NEW,ESTABLISHED,RELATED,INVALID) |
–source-ports | -m multiport |
多个源端口 |
|
–destination-ports |
多个目的端口 |
|
–ports |
源和目的端口 |
|
–limit | -m limit |
速率(如3/minute 表示每分钟三个数据包) |
|
–limit -burst |
峰值速率(如100 表示最大不能超过100个数据包) |
|
–connlimit-above n |
-m connlimit |
多于n个表示满足条件,前面加!表示取反 |
–src-range ip-ip | -m iprange |
源IP范围 |
|
–dst-range ip-ip |
目的IP范围 |
|
–mac-source |
-m mac |
mac地址限制 |
–algo [bm,kmp] | -m string |
匹配算法 |
|
–string “Pattern” |
要匹配的字符串 |
|
–name | -m recent |
设置列表名称,默认为 DEFAULT |
|
–resouce |
源地址,些为默认 |
|
–rdest |
目的地址 |
|
–set |
添加源地址的包到列表中 |
|
–update |
每次建立连接都更新列表 |
|
–rcheck |
检查地址是否在列表 |
|
–seconds |
指定时间内,必须与–recheck或–update同时使用 |
|
–hitcount |
命中次数,必须与–recheck或–update同时使用 |
|
–remove |
在列表中移除相应地址 |
|
3.5 目标值
目标类型 |
说明 |
ACCEPT |
允许数据包通过。 |
DROP |
直接丢弃数据包,不给出任何回应信息。 |
REJECT |
拒绝数据包通过,必须时会给数据发送端一个响应信息。 |
LOG |
在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。 |
QUEUE |
防火墙将数据包移交到用户空间 |
RETURN |
防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain) |
3.6 常用Iptables 命令示例
以root权限运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
# 删除iptables现有规则
iptables –F
# 查看iptables规则
iptables –L(iptables –L –v -n)
# 增加一条规则到最后
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# 添加一条规则到指定位置
iptables -I INPUT 2 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# 删除一条规则
iptabels -D INPUT 2
# 修改一条规则
iptables -R INPUT 3 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# 设置默认策略
iptables -P INPUT DROP
# 允许远程主机进行SSH连接
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 允许 HTTP 请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
# 允许 MySQL 请求
iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
# 限制 ping 192.168.146.3 主机的数据包数,平均 2/s 个,最多不能超过 3 个
iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
# 限制 SSH 连接速率(默认策略是 DROP)
iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT
|
3.7 配置样例(by shell)
只打开主机的22和80端口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 1.删除现有规则
iptables -F
# 2.配置默认链策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 3.允许远程主机进行 SSH 连接
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 4.允许本地主机进行 SSH 连接
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 5.允许 HTTP 请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
|
备份 iptables 策略
1
|
iptables-save > /etc/iptables.sample.rules
|
3.8 配置样例(by conf)
该配置效果同3.7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# Generated by iptables-save v1.4.21 on Wed Mar 2 16:55:01 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [134:8040]
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
COMMIT
# Completed on Wed Mar 2 16:55:01 2016
|
使用方法
还原备份过的 iptables 策略
1
|
iptables-restore < /etc/iptables.sample.rules
|