iptables
netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 iptables 建立在 netfilter 架构基础上的一个包过滤管理工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。 iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。
1.iptables 语法规则
1
iptables [-t 表] 大写选项子命令(-A) [规则号] 链名 匹配标准(-s xx.xx.xx.xx) -j 目标(规则)
注意:所有表名必须小写,命令动作必须大写,链名必须大写,匹配标准必须小写,目标规则必须大写
2.iptables 表
filter | 一般的数据包过滤功能 |
nat | 用于nat(网络地址转换)功能(端口映射,地址映射等) |
mangle | 用于对特定数据包进行修改 |
raw | 优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能 |
表的处理优先级:raw > mangle > nat > filter
3.iptables 链
PREROUTING | 数据包进入路由表之前 |
INPUT | 通过路由表后目的地为本机 |
FORWARDING | 通过路由表后,目的地不为本机 |
OUTPUT | 由本机产生,向外转发 |
POSTROUTIONG | 发送到网卡之前。 |
如图: iptables 中表和链的对应关系如下:
表 | 包含的规则链 |
---|---|
filter | INPUT , FORWARD , OUTPUT |
nat | PREROUTING , OUTPUT , POSTROUTING |
mangle | PREROUTING , OUTPUT , POSTROUTING |
4.iptables 相关参数
4.1.命令参数
-A | 向规则链中添加一条规则,默认被添加到末尾 |
-I | 插入一条规则,默认会被插入到首部 |
-T | 指定要操作的表,默认是 filter |
-D | 从规则链中删除规则,可以指定序号或者匹配的规则来删除 |
-R | 进行规则替换 |
-F | 清空所选的链,重启后恢复 |
-N | 新建用户自定义规则链 |
-X | 删除用户自定义的规则链 |
4.2.匹配标准参数
-p | 用来指定协议。可以是 tcp,udp,icmp等,也可以是数字的协议号 |
-s | 指定源地址 |
-d | 指定目的地址 |
-i | 进入接口 |
-o | 流出接口 |
–sport | 源端口 |
–dport | 目的端口,端口必须和协议一起来配合使用 |
4.3.目标规则
-j | 采取的动作。ACCEPT(接收),DROP(丢弃),REJECT(拒绝), |
RETURN(返回主键继续匹配),REDIRECT(端口重定向), | |
MASQUERADE(地址伪装),DNAT(目标地址转换),SNAT(源地址转换),MARK(打标签) |
5.iptables 实际操作
以上是 iptables 语法规则的相关参数和说明,现在让我们来实际操作使用一下。一般常用操作的是 filter
表, mangle
和 raw
请自行 google 高级用法。
5.1.基本使用
1
2
3
4
5
6
7
8
9
10
11
列出 iptables 规则
# iptables -L # 默认选择 filter 表
# iptables -t nat -L
清除 内置规则
# iptables -F
# iptables -t nat -F
清除自定义规则
# iptables -X
# iptables -t nat -F
5.2.filter
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
禁止某个IP访问
# iptables -I INPUT -s xxx.xxx.xx.x -j DROP
服务器禁止被 ping
# iptables -A INPUT -p icmp -j DROP
禁止某个 IP ping 服务器
# iptables -A INPUT -p icmp -s xxx.xxx.xx.x -j DROP
只允许某个 IP ping 服务器
# iptables -I INPUT -p icmp -s xxx.xxx.xx.x -j ACCEPT
开启端口服务
# iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
# iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
开启转发功能
- 普通转发,假设 eth0 连接内网,eth1 连接公网。(必须要有2块网卡)
# iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
- 只允许已建连接以及相关连接对内转发
# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
- 允许对外转发
# iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
允许 loopback 回环通讯
# iptables -A INPUT -i lo -p all -j ACCEPT
# iptables -A OUTPUT -o lo -p all -j ACCEPT
实例:当总连接数超过100时,启用 litmit/minute 限制
# iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
- litmit 25/minute 每分钟限制最大连接数为25
- litmit-burst 100 当总连接数超过100时,启动 limit/minute 限制
5.3 nat
1
2
3
4
5
6
7
8
9
10
目的地址转换,映射内部地址
# iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.2:80
# iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.1-192.168.0.10
源地址转换,隐藏内部地址
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
地址伪装,动态ip的NAT(地址转换)
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
masquerade
和 snat
的主要区别在于,snat 是把源地址转换为固定的 IP 地址或者是地址池,而 masquerade 在 adsl 等方式拨号上网时候非常有用,因为是拨号上网所以网卡的外网IP经常变化,这样在进行地址转换的时候就要在每次都要修改转换策略里面的 ip,使用 masquerade 就很好的解决了这个问题,他会自己去探测外网卡获得的ip地址然后自动进行地址转换,这样就算外网获得的 ip 经常变化也不用人工干预了。
5.4 删除规则
1
iptables -D chain rulenum [options]
chain 是链的意思,就是 INPUT FORWARD 之类的定语,rulenum 是该条规则的编号,从1开始。可以使用iptables -L INPUT --line
列出指定的链的规则的编号来。然后通过编号删除
1
iptables -D INPUT 1
第二种办法是 -A
命令的映射,不过用 -D
替换 -A
。当你的链中规则很复杂,而你不想计算它们的编号的时候这就十分有用了。
也就是说,你如何一开始时用 iptables -A....
语句定义了一个规则,那么删除此条规则时直接用 -D
来代替 -A
, 其余的都不变即可,而不需要什么编号了。
DDoS deflate
DDos deflate 是一款免费的用来防御和减轻 DDos 攻击的脚本。它通过 netstat
监测跟踪与服务器创建了大量网络连接的IP地址,在监测到某个节点超过预设的限制时,该程序会通过 APF 或者 iptables 对这些 IP 进行一段时间内的禁止访问。
DDoS deflate官方网站:http://deflate.medialayer.com/
如何确定是否受到DDoS攻击了呢?
执行 netstat 命令
1
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
或者
1
2
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sed -n '/[0-9]/p' | sort |
uniq -c | sort -nr
下一段会过滤掉其中不是 IP 的一些记录,结果如下: 第一个表示每个IP当前的连接数,一般IP几十个以内都算比较正常。如果突然某个IP的连接数有成百上千个,那肯定就不正常了。
1.安装 DDoS deflate
1
2
3
4
# cd /tmp
# wget http://www.inetbase.com/scripts/ddos/install.sh
# chmod 0700 install.sh
# ./install.sh
分别是:1.下载文件,2.给文件添加权限,3.执行安装
2.配置 DDoS deflate
文件安装目录位于 /usr/local/ddos
,其中文件有:
- ddos.conf // 相关配置文件
- ssos.sh // shell脚本
- ignore.ip.list // ip白名单
- LICENSE // 许可
ddos.conf
配置如下
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
##### Paths of the script and other files
PROGDIR="/usr/local/ddos"
PROG="/usr/local/ddos/ddos.sh"
IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" # ip 地址白名单
CRON="/etc/cron.d/ddos.cron" # 定时任务位置
APF="/etc/apf/apf" # APF
IPT="/sbin/iptables" # iptables
##### frequency in minutes for running the script
##### Caution: Every time this setting is changed, run the script with --cron
##### option so that the new frequency takes effect
FREQ=1 # 检测时间间隔,默认为1分钟
##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150 # 一个IP下的最大连接数,超过就会屏蔽
##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
APF_BAN=0 # 使用 APF还是iptables,推荐使用 iptables,将APF_BAN 改为0即可。
# APF 是基于 iptables 的防火墙
##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)
##### KILL=1 (Recommended setting)
KILL=1 # 是否屏蔽禁止IP,默认。
##### An email is sent to the following address when an IP is banned.
##### Blank would suppress sending of mails
EMAIL_TO="1@vincents.cn" # 当IP被屏蔽时给指定邮箱发送邮件。
##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=600 # 禁用IP时长,默认为600秒
ddos.sh
中,可以将第 117 行的内容修改为,就是上面那句 netstat 命令:
1
2
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sed -n '/[0-9]/p' | sort |
uniq -c | sort -nr
有文件内容更改后,执行:
1
# sh /usr/local/ddos/ddos.sh
会在/etc/cron.d/
目录下生成一个定时任务ddos.cron
。内容为:
1
0-59/1 * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1
3.测试
接下来你就可以使用压力测软件 webbench,Siege 来进行测试实验了。我的测试结果如下, 通过 webbench
开启压力测试后,IP就立即被封禁,且很快就收到邮件,效果还是非常明显的。
ps: 为了让图片少占点位置,只有这么拼接一下了。将就看。。。