iptables
iptables和netfilter
netfilter是实现数据包过滤的,工作在内核
iptables是告诉Netfilter怎么过滤的一个工具
iptables的四表五链
四表:filter, nat, mangle, raw
filter:实现数据包过滤的,因为iptables主要就是数据包过滤
所以filter是默认表
nat:地址转换的,主要用于做路由
mangle:修改数据报文的
raw:
五链:
表和链是一起的,链是表上的某个点
filter表有三个链:
1,INPUT:进入到本机的数据包
2,OUTPUT:从本机出去的数据包
3,PORWORD:由本机转发的数据包
iptables 过滤基本语法
1,基本格式
例子:iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
iptables: 命令
-t filter: 指定表,表有四个
-A : 追加一条规则,放到最后面,和-A相对应的还有:
-I:插入一条规则,放到最前面(规则的顺序很重要,因为前面匹配到了就
不会往下走了)
-F:清除所有(这里的所有是相对于前面指定的表下面也是)规则
-D:删除一条指定的规则
-L:列出所有规则 和-vn一起使用列出更多信息
-N:创建一条自定义的规则链
-X:删除一条自定义的规则链
-E: 修改自义链名
-P: 为链指定默认策略
INPUT: 链名,与之对应的有:
OUTPUT:从本机出去的
INPUT:从本机出去的
FORWARD:由本机转发的
-p tcp --dport 22 -s 192.168.0.0/24
这些是一组的,与之对应的还有很多,表示匹配条件
这里写的才是真正的规则
-j ACCEPT -j后面接的是要执行的操作
ACCEPT:允许
DROP:丢弃
REJECT:不仅丢弃,还告诉别人你的包被丢了
MASQUERADE:做地址伪装
DNAT:做目标地址转换
SNAT: 做源地址转换
RETURN:返回主链
关于上面的匹配条件主要有:
-d: 目标地址,可以是一个也可以是一个网段
-s: 源地址,可以是一个也可以是一个网段
-p: 指定一个协议,tcp,udp,icmp
--dport: 指定一个目标端口 (和上面的-p一起用)
--sport:指定一个源端口 (和上面的-p一起用)
-p tcp
--sport, --dport, --tcp-flags
--syn
-p udp
--sport, --dport
-p icmp
--icmp-type
echo-request: 8
echo-reply: 0
使用-m指定启用模块匹配
-m state
连接状态模块,可以指定连接状态来确定是否要放行
连接状态有四种:
NEW:新的连接
ESTABLISHED:已经建立的连接
RELATED:和以前已经建立的连接有关联的
INVALID:有问题的连接
用法:
-m state --state ESTABLISHED,RELATED
-m multiport
端口匹配,多个端口用逗号分割
--sports, --dports, --ports
用法:
-m multiport --sports 80,22,53
-m iprange
IP地址段匹配
--src-range, --dst-range
用法:
-m iprange --src-range 192.168.0.1-1.2.168.0.100
-m string
字串匹配
--algo {bm|kmp}(算法), --string, --hex-string
用法:
-m string --algo bm --string "hello"
-m connlimit
单个IP的最大并发连接数
--connlimit-above
用法:
-m connlimit --connlimit-above 5
-m limit
速率控制
--limit n(/second|/minute|/hour|/day), --limit-burst(初始峰值)
用法 :
-m limit --limit 2/min --limit-burst 5
# iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 5 -j ACCEPT
每秒让ping一下:
-m time
时间限制
--datestart, --datestop
--timestart, --timestop
--weekdays
用法:
-m time --weekdays 1,2,3
-m time --timestart 08:00 --timestop 20:00
nat表:
1,POSTROUTING:在路由判断后做地址转换
2,PREROUTING:在路由判断之前做地址转换
先看下nat的地址转换过程:
POSTROUTING是在1-2的时候实现的
PREROUTING是在5-6的时候实现的
这个过程是怎么实现的呢,iptables的命令又是什么呢:
1,nat服务器有两快网卡
公网地址eth0:10.0.1.200/32(就当是了)
内网地址eth1:192.168.0.254/24
打开转发:
# echo "1" > /proc/sys/net/ipv4/ip_forward
表示替别人转发数据包
怎么转:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT --to-source 10.0.1.200
表示来自192.168.0.0/24网段的主机经过eth0时都做源地址转换,转换为10.0.1.200
当转发完成后nat服务器记录一行数据:哪个主机访问哪个地址我把它的源地址改了
当记录的条目多了就成表了(个人理解)
数据包回来的时候nat服务器会去查记录的张变表,然后把回来的数据包
的源地址改回来。所以PREROUTING就可以不用写。
如果nat服务器是拨号上网的,公网地址不固定可写成:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
2,然后192.168.0.0/24网段的主机把网关指向192.168.0.254就可以上网了
当只内网建服务器就需要写PREROUTING了
当这么一种情况:
对外说10.0.1.200这个ip上提供了WEB服务
当别人访问10.0.1.200:80的时候就给他转发到
后面提供web服务的主机上:
在nat服务器上和上面一样打开转发
写入:
iptables -t nat -A PREROUTING -d 10.0.1.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80
意思就是当别人访问10.0.1.200:80 的时候把它的目标地址改为192.168.0.1:80
还是记录一张表:
当web服务器回应那个访问的家伙时,把web服务器回应的数据包的源地址改成自己的10.0.1.200
-------------------
iptables 简单应用
1,拒绝单个IP大量访问脚本如下:
每2小时执行一次
#!/bin/bash
#
# 2/hour
##
is=iptables
$is -D INPUT -j clean
$is -F clean
$is -X clean
$is -N clean
$is -I INPUT -j clean
$is -A clean -j RETURN
每分钟执行一次
#!/bin/bash
#
## 1/minute
#
ss -an|awk '{print $5}'|egrep -o \
"\<[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\>"|\
sort|uniq -c \
|while read line;do
nme=`echo $line|awk '{print $1}'`
ip=`echo $line|awk '{print $2}'`
if [ $nme -gt 10 ];then
iptables -I clean -s $ip -j DROP
fi
done
2,默认INPUT为DROP,OUTPUT为DROP放行ftp,ssh,dns,www服务
# modprobe ip_conntrack_ftp
# modprobe ip_nat_ftp
# iptables -I OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp -m multiport --sports 22,21,20,53,80 -j ACCEPT
# iptables -A INPUT -p tcp -m multiport --dports 22,21,20,53,80 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -j DROP
# iptables -A OUTPUT -j DROP
3,丢弃不正常的报文
# iptables -I INPUT -m state --state INVALID -j DROP
# iptables -I INPUT -p tcp --tcp-flags ALL ALL -j DROP
# iptables -I INPUT -p tcp --tcp-flags ALL NONE -j DROP
4,限制ping速率
# iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 5 -j ACCEPT
5,本机做路由限制周一到周五不能上网
# iptables -A FORWARD -m time --timestart 08:00:00 --timestop 18:45:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP