iptables

iptables

iptables和netfilter

netfilter是实现数据包过滤的,工作在内核
iptables是告诉Netfilter怎么过滤的一个工具

iptables的四表五链
wKioL1M5SjyRN3-uAADLQqFLDYg089.png
四表:filter, nat, mangle, raw
   filter:实现数据包过滤的,因为iptables主要就是数据包过滤
           所以filter是默认表
      nat:地址转换的,主要用于做路由
   mangle:修改数据报文的
   raw:
五链:
   表和链是一起的,链是表上的某个点
   filter表有三个链:
       1,INPUT:进入到本机的数据包
       2,OUTPUT:从本机出去的数据包
       3,PORWORD:由本机转发的数据包
wKiom1M5SomT7nG7AAD6QpNA5yk568.png

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一下:


wKioL1M5SnrA7xuRAAA3Q70KyiA859.png
-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的地址转换过程:
wKioL1M5SqGQle0-AAHBsHIQSDc496.png

   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了
当这么一种情况:


wKioL1M5SsWDlJk0AAIlpoNBhTA149.png

对外说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小时执行一次
wKioL1M5SuHSJ4mEAAAy47i5Y54607.png


#!/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


每分钟执行一次

wKiom1M5Sx_Ct7VeAABPjm0M-8Q525.png


#!/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

你可能感兴趣的:(iptables)