Iptables学习笔记

*规则顺序从上到下执行,上面查询到有符合条件的规则下面不再执行

1,iptables –t 命令规则 –j 动作

表:filternat mangle 默认是filter

Iptables –L 查看filter

-P 等于 --policy 定义默认测量

例如:更改默认策略

Iptables –t filter  --policyFORWARD DROP

Iptables –t filter  -P FORWARD ACCEPT

-A 等于 --append 在规则列表的最后添加一条规则

-I 等于 --insert 在指定的位置插入一条规则

  例如:

      Iptalbes –t filter –I INPUT –p icmp –jDROP

           Iptalbes –t filter –I INPUT 3 –p icmp –j DROP

-D 等于 --delete 删除一条规则

   例如:删除第一天规则

       Iptables –t filter –D INPUT 1

-R 等于 --replace 替换规则列表中的某条规则

     例如:

         Iptables –t filter -R INPUT 2 –p icmp–j DROP  

-F 等于 --flush 删除表中所以规则

      例如:可以指定链,也可以不指定链,不指定链,清除表

          Iptables –t filter –F INPUT

-L 查看iptables 信息

      例如:iptables –t filter -L

                        iptables –t filter -L –v-v:查看更多信息)

                         -n 以数字的形式显示

 

Iptables 匹配选项

-i --in-interface 指定数据包从那个网络接口进入,如 ppp0 ,eth0eth1等;

-o –out-interface 指定数据包从哪块网络接口输出,如:ppp0,eth0eth1等;

-p –protocol 协议类型指定数据包匹配的协议,如 tcp,udp icmp等;

-s –source 指定数据包匹配的源地址;

-d –destination 指定数据包匹配的目标地址;

--sport 指定数据包匹配的源端口号,可以使用起始端口:结束端口的格式指定一个范围的端口;

--dport 目标端口号,指定数据包匹配的目标端口号,可以使用起始端口:结束端口的格式指定一个范围的端口。

例:

Iptables  -t filter -I INPUT –p icmp -i eth0 –jDROP 

Iptables–t filter –I FORWARD –p tcp –s 172.17.31.233/32 –d 172.16.31.8/32 –dport 3389–j DROP

 

Iptables 扩展参数

 

1,       -m state --state <状态>

状态有:

1,NEW:想要新建立的封装包;

2,ESTABLISHED:已经连接成功的封装包;

3,INVALID:无效的封装包,例如数据损坏的封装包;

4,RELATED:这个最常用!表示这个封装包是与我们主机发送出去的封装包有关,可能是响应封装包或者是连接成功后的传输数据包。

2,       icmp协议 –m icmp --icmp-type <状态实现单方向ping

  icmp 状态类型:

       echo-request 8

             echo-reply  0

实例:拒绝172.16.31.2 ping 172.16.31.7

例如:iptables –t filter –I INPUT –s 172.16.31.2/32 –d172.16.31.7/32 –p icmp –m icmp --icmp-type echo-request –j DORP

3,       参数 –m multiport 指定多端口号

-m multiport

   --sports

     --dports

   --ports

实例:拒绝192.168.80.0/24 访问 192.168.10.0/24 1-1024 3389

例如:iptables –t filter –I FORWARD –p tcp –d192.168.10.0/24 –s 192.168.80.0/24 –m multiport --dports 1:1024,3389 –j DROP

4,       指定IP

-m iprange

   --src-range   ip-ip

   --dst-range   ip-ip

实例:禁止192.168.80.1-100 地址段访问 192.168.10.0/24

例如:iptables –t filter –I FORWARD –m iparnge --src-range192.168.80.1-192.168.80100  –j DROP

5,       最大连接数限制

-m connlimit

    --connlimit-above  <限制的最大连接数>

示例:只允许192.168.80.0/24 使用远程桌面连接192.168.10.123/32最多两个会话

例如:iptables –t filter –I FORWARD –s 192.168.80.0/24 –d192.168.10.123/32 –p tcp –dport 3389 –m connlimit --connlimit-above 2 –j DROP

6,       使用扩至选项限速

-m limit --limit

可以每秒钟、每分钟、每小时或每天平均一次,默认值为每小时平均一次,参数如:/second, /minute, /hour, /day

示例:192.168.10.0/24 发送数据包不能超过300个,(一个包最大1500字节)1500*300=450 000=450k

例如(需要两条命令,这是对网段进行限制)#iptables –t filter –I FORWARD –s192.168.10.0/24 –d 192.168.80.0/24 –m limit --limit 300/second –j ACCEPT

          #Iptables –t filter –A FORWARD –s 192.168.10.0/24 –d192.168.80.0/24 –j DROP

对每个ip进行限制

公司使用Linux服务器来当网关,配置iptables NAT上网,使用iptables对每一个用户进行带宽限制:

vi /etc/sysconfig/limit.sh

#!/bin/bash

for((i=2; i<254; i++))

do

iptables –I FORWARD –s 192.168.10.$i –j DROP

iptables –I FORWARD –s 192.168.10.$I –m limit --limit 300/sec --limit-burst400 –j ACCEPT

done

注:--limit-burst (瞬间流量)上面的脚步是对192.168.10.1-254 限制每秒只运行最多300个数据包通过的限制。

7,       瞬间流量控制

参数--limit-burst 用来比对瞬间最大封装包数量,超过数量的封装包将直接丢弃。

示例:允许192.168.10.123/32 ping 192.168.80.123/32 4个包

例如:iptables –t filter –I FORWARD –s 192.168.10.123/32 –d192.168.80.123/32 –p icmp –m limit --limit-burst 4 –j ACCEPT

           iptables –t filter –IFORWARD –s 192.168.10.123/32 –d 192.168.80.123/32 –p icmp –j DROP

# iptables –t filter –Z     #清除filter表的计数器

8,       基于mac地址的过滤流量

参数–m mac --mac-source

说明:用来对比封装包来源网络接口地址的硬件地址,这个参数不能用在OUTPUTPSOTROUTING链上,这是因为封装包要送出到网卡后,才能由网卡驱动程序通过ARP通讯协议查出目的地的MAC地址,所以iptables在进行封装包对比时,并不知道封装包会送到哪个网络接口去。

示例:拒绝xp计算机的mac能够访问192.168.80.0/24 网段

例如:iptables –t filter –I FORWARD –d 192.168.80.0/24 –mmac --mac-source  00-50-56-C0-00-08 –jDROP

Filter表处理动作介绍

-j 参数用来指定要进行的处理动作,常用的处理动作有:ACCEPT, DROP, REJECT,  LOG , REDIRECT , MASQUERADE , DNAT , SNAT,MIRROR , QUEUE ,RETURN ,MARK .

Filter 表使用的主要动作

    ACCEPT : 封装包放行,进行完此处理后,将不再匹配其他规则,直接跳往下一个规则链。

    DROP : 丢弃封装包不予处理,进行完此处理后,将不在匹配其他规则,直接中断过滤程序。

    REJECT : 拦截封装包,并传送封装包通知对方,可以传送的封装包有下列选择:ICMP port-unreachable ICMP echo-reply tcp-reset(这个封装包要求对方关闭连接),进行完此处理后,将不再匹配其它规则,直接中断过滤程序。

示例:拦截192.168.10.0/24 ping 192.168.10.0/24 3389端口

例如:iptables –t filter –I FORWARD –s 192.168.10.0/24 –picmp –j REJECT

    Iptables –t filter –I FORWARD–s 192.168.10.0/24 –p tcp --dport 3389 –j REJECT

    LOG : 将封装包相应通讯记录在/var/log中,详细位置请查阅/etc/syslog.conf 配置文件,进行完此处理动作后,将会继续匹配其它规则。

示例:记录192.168.10.0/24网段连接远程桌面和ping过服务器

例如:iptables –t filter –I FORWARD –s 192.168.10.0/24 –ptcp –dport 3389 –j LOG --log-prefix “iptables-rdp”

           iptables –t filter –IFORWARD –p icmp –j LOG --log-prefix “iptables-icmp”

注:--log-prefix 是给日志添加一个标记,方便以后查询

保存还原iptable设置

显示防火墙状态

Service iptables status

防火墙配置文件位置

/etc/sysconfig/iptables

防火墙服务配置文件

/etc/sysconfig/iptables-config

IPTABLES_MODULES=”ip_connrack_ftp ip_nat_ftp” #是否需要支持其它模块例如在地址转换的情况下支持FTP

IPTABLES_MODULES_UNLOAD=”yes” #iptables服务停止的时候自定义的模块是否被卸载,yes是卸载;

IPTABLES_SAVE_ON_STOP=”no” #当服务停止的时候定义的规则是否保存,默认是不保存;

IPTABLES_SAVE_ON_RESTART =”no” #当服务重启的时候默认规则是否保存,默认是不保存;

IPTABLES_SAVE_COUNTER=”no” #当配置保存的时候,防火墙计数器是否保存,默认是不保存;

IPTABLES_STATUS_NUMERIC=”yes”#当显示防火墙状态时,是否以数字的形式显示端口号和ip地址;

IPTABLES_STATUS_VERBOSE=”no” #当显示防火墙状态时,显示网卡接口;

IPTABLES_STATUS_LINENUMBERS=”yes”#查看时,是否显示行号;

清空防火墙配置

iptables –F

保存配置文件

/etc/rc.d/init.d/iptables save

把配置文件保存到另为一个文件

iptables-save > iptables.conf.bak

导入配置文件

Iptables-restored < iptables.conf.bak

Recent模块实现服务器网络安全

常用参数:

--name  #设定列表名称,默认DEFAULT

--rsource #源地址,此为默认

--rdest   #目的地址

--seconds #指定时间内

--hitcount #命中次数

--set     #将地址添加进列表,并更新信息,包含地址加入的时间戳

--rcheck  #检测地址是否在列表,以第一匹配开始计算时间

--update  #rcheck类似,以最后一个匹配计算时间

--remove  #在列表里删除相应地址,后跟列表名称及地址

示例1

           SSH连接一个客户端60秒内只允许连接2

1,用来设置多长时间,几次拒绝

#iptables –t filter –A INPUT –p tcp --dport 22 –m state --state NEW –m

 recent --name SSHPOOL --rcheck--seconds 60 --hitcount 2 –j DROP

2,连接计算

#iptables –t filter –A INPUT –p tcp --dport 22 –m state --state NEW –mrecent --name SSHPOOL --set –j ACCEPT

3,建立的会话就允许进入

#iptables –t filter –A INPUT –m state --state ESTABLISHED –j ACCEPT

示例2

限制TCP 80 端口 60 秒内每个IP只能发10个新建连接,超过记录日志及丢弃数据包,可防CC及非伪造IPsyn flood

#iptables –A INPUT –p tcp --dport 80 --syn –m recent --name webpool--rcheck --seconds 60 --hitcount 10 –j LOG --log-frefix “DDOS” --log-ip-options

#iptables –A INPUT –p tcp --dport 80 --syn –m recent --name webpool--rcheck ---seconds 60 --hitcount 10 –j DROP

#iptables –A INPUT –p tcp --dport 80 --syn –m recent --name webpool--set –j ACCEPT

设置打开端口的钥匙

#记录日志,前缀是SSHOPEN(可选)

iptables –A INPUT –p icmp –icmp-type echo-request –m length –length 1078–j LOG –log-prefix “SSHOPEN:”

#指定数据包1078字节,包含IP头部20字节,icmp头部8字节。(1078=1050+20+8ping 172.16.31.7 –l 1050

iptables –A INPUT –p icmp --icmp-type echo-request –m length --length 1078–m recent --set --name sshoopen --rsource –j ACCEPT

#检查sshopen表中60秒内的记录如果有有源地址则允许访问tcp22端口;

iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds60 --name sshopen --rsource -j ACCEPT

#发送ping包指定数据包1178个字节,将客户端地址从sshopen表中移除,客户端将不能使用tcp22端口建立连接;

iptables -A INPUT -p icmp --icmp-type echo-request -m length --length1178 -m recent --set --name sshopen -rmove -j ACCEPT

#已经连接的保持连接

iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

NAT地址转换

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth3 -j SNAT--to-source 192.168.20.10-192.168.20.11

NAT端口映射

端口映射选做地址转换

iptables -t nat -A PREROUTING -i eth3 -d 192.168.20.10/32 -p tcp--dport 3389 -j DNAT --to 192.168.10.110:3389

iptables -t nat -A PREROUTING -i eth3 -d 192.168.20.10/32 -p tcp--dport 4000 -j DNAT --to 192.168.10.222:3389