IPTABLES笔记

0x01 iptables的结构

简单地讲,tables由chains组成,而chains又由rules组成。iptables 默认有四个表Filter, NAT, Mangle, Raw。

0x02 filter表详解

1. 在iptables中,filter表起过滤数据包的功能,它具有以下三种内建链:

1
2
3
INPUT链–处理来自外部的数据。
OUTPUT链–处理向外发送的数据。
FORWARD链–将数据转发到本机的其他网卡设备上。

2. 数据流向场景

访问本机:在INPUT链上做过滤

本机访问外部:在OUTPUT链上做过滤

通过本机访问其他主机:在FORWARD链上做过滤

3. Iptables基本操作

启动iptables:service iptables start

关闭iptables:service iptables stop

重启iptables:service iptables restart

查看iptables状态:service iptables status

保存iptables配置:service iptables save

Iptables服务配置文件:/etc/sysconfig/iptables-config

Iptables规则保存文件:/etc/sysconfig/iptables

打开iptables转发:echo "1"> /proc/sys/net/ipv4/ip_forward

0x03 iptables命令参考

命令:

1
iptables [ t 表名] 命令选项 [链名] [条件匹配] [j 目标动作或跳转]

1. 表名

表名:Filter, NAT, Mangle, Raw

起包过滤功能的为表Filter,可以不填,不填默认为Filter

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. 链名

可以根据数据流向来确定具体使用哪个链,在Filter中的使用情况如下:

1
2
3
INPUT链–处理来自外部的数据。
OUTPUT链–处理向外发送的数据。
FORWARD链 – 将数据转发到本机的其他网卡设备上。

4. 条件匹配

条件匹配分为基本匹配和扩展匹配,拓展匹配又分为隐式扩展和显示扩展。

a)基本匹配包括:

匹配参数 说明
-p 指定规则协议,如tcp, udp,icmp等,可以使用all来指定所有协议
-s 指定数据包的源地址参数,可以使IP地址、网络地址、主机名
-d 指定目的地址
-i 输入接口
-o 输出接口

5. 目标值

数据包控制方式包括四种为:

1
2
3
4
5
6
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给出任何回应信息。
REJECT:拒绝数据包通过,必须时会给数据发送端一个响应信息。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。
QUEUE:防火墙将数据包移交到用户空间
RETURN:防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)

0x04 iptables常见命令

a) 1. 删除iptables现有规则

1
iptablesF

b) 2. 查看iptables规则

1
iptablesLiptablesLv n

c) 3. 增加一条规则到最后

1
iptables A INPUT i eth0 p tcp dport 80 m state state NEW,ESTABLISHED j ACCEPT

d) 4.添加一条规则到指定位置

1
iptables I INPUT 2 i eth0 p tcp dport 80 m state state NEW,ESTABLISHED j ACCEPT

e) 5.  删除一条规则

1
iptabels D INPUT 2

f) 6.修改一条规则

1
iptables R INPUT 3 i eth0 p tcp dport 80 m state state NEW,ESTABLISHED j ACCEPT

g) 7. 设置默认策略

1
iptables P INPUT DROP

h) 8.允许远程主机进行SSH连接

1
2
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

i) 9.允许本地主机进行SSH连接

1
2
iptables A OUTPUT o eth0 p tcp dport 22 m state state NEW,ESTABLISHED j ACCEPT
iptables A INTPUT i eth0 p tcp sport 22 m state state ESTABLISHED j ACCEPT

j) 10.允许HTTP请求

1
2
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

k) 11.限制ping 192.168.146.3主机的数据包数,平均2/s个,最多不能超过3个

1
iptables A INPUT i eth0 d 192.168.146.3 p icmp icmptype 8 m limit limit 2/second limitburst 3 j ACCEPT

l) 12.限制SSH连接速率(默认策略是DROP)

1
2
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 limitburst 2 m state state NEW j ACCEPT

0x05 如何正确配置iptables

a) 1. 删除现有规则

iptables -F

b) 2.  配置默认链策略

1
2
3
iptables P INPUT DROP
iptables P FORWARD DROP
iptables P OUTPUT DROP

c) 3. 允许远程主机进行SSH连接

1
2
iptables A INPUT i eth0 p tcpdport 22 m statestate NEW,ESTABLISHED j ACCEPT
iptables A OUTPUT o eth0 p tcpsport 22 m statestate ESTABLISHED j ACCEPT

d) 4. 允许本地主机进行SSH连接

1
2
iptables A OUTPUT o eth0 p tcpdport 22 m statestate NEW,ESTABLISHED j ACCEPT
iptables A INPUT i eth0 p tcpsport 22 m statestate ESTABLISHED j ACCEPT

e) 5. 允许HTTP请求

1
2
iptables A INPUT i eth0 p tcpdport 80 m statestate NEW,ESTABLISHED j ACCEPT
iptables A OUTPUT o eth0 p tcpsport 80 m statestate ESTABLISHED j ACCEPT

0x06 使用iptables抵抗常见攻击

1.防止syn攻击

思路一:限制syn的请求速度(这个方式需要调节一个合理的速度值,不然会影响正常用户的请求)

1
2
3
4
5
6
7
iptables N synflood
iptables A INPUT p tcp syn j synflood
iptables A synflood m limit limit 1/s limitburst 4 j RETURN
iptables A synflood j DROP

思路二:限制单个ip的最大syn连接数

1
iptablesA INPUTi eth0p tcp syn m connlimit connlimitabove 15 j DROP

2. 防止DOS攻击

利用recent模块抵御DOS攻击

1
iptables I INPUT p tcp dport 22 m connlimit connlimitabove 3 j DROP

单个IP最多连接3个会话

1
iptables I INPUT p tcp dport 22 m state state NEW m recent set name SSH

只要是新的连接请求,就把它加入到SSH列表中

1
iptables I INPUT p tcp dport 22 m state NEW m recent update seconds 300 hitcount 3 name SSH j DROP

5分钟内你的尝试次数达到3次,就拒绝提供SSH列表中的这个IP服务。被限制5分钟后即可恢复访问。

3. 防止单个ip访问量过大

1
iptables I INPUT p tcp dport 80 m connlimit connlimitabove 30 j DROP

4. 木马反弹

1
iptablesA OUTPUTm state state NEWj DROP

5. 防止ping攻击

1
iptables A INPUT p icmp icmptype echorequest m limit limit 1/m j ACCEPT

End