目录

Iptables 实践教程(一)

1 简介

linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成。

netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易。

2 实验环境

OS:Debian 8.3 iptables安装:

1
sudo aptitude install iptables

检查iptables是否已经安装

1
sudo which 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