<服务>iptables基础使用

时间:Jan. 25, 2017 分类:

目录:

iptables防火墙

Linux下的自带的基于包过滤的开源防火墙,主要工作在OSI的二三四层,如果编译内核也可以支持七层,不过效果不好,可以用squid进行7层过滤。iptabls由表和表中包含的链组成,包括FILTER表,NAT表,MANGLE表和RAW表(不常用)四张表和INPUT,OUTPUT,FORWARD(转发), PREROUTING(预路由)和POSTROUTING五种链,链中包含着一条条的过滤语句。

表包含链

iptables表 表内包含链
FILTER INPUT,FORWARD和OUTPUT
NAT OUTPUT,PREROUTING和POSTROUTIN
MANGLE INPUT,FORWARD,OUTPUT,PREROUTING和POSTROUTIN

常用表的作用

FILTER表与主机本身有关,主要负责防火墙功能负责过滤流入流出主机的数据包,iptables默认就使用这张表,INPUT负责过滤所有目标地址是本机地址的数据包,FORWARD负责转发流经主机的数据包,起转发的作用,和NAT关系比较大,OUTPUT处理所有源地址是本机地址的数据包,通俗讲就是处理从主机发出去的数据包

NAT表负责网络地址转换,即来源与目的ip地址与port的转换,应用与主机无关,一般用于局域网共享上网或特殊端口转换服务相关,OUTPUT为主机发出的数据包,可以改变主机发出的数据包的目的地址,PREROUTING在数据包到达防火墙的时候进行路由规则判断,作用是改变包的目的地址和目的端口等,POSTROUTING是在数据包离开防火墙时进行路由判断之后执行的规则,作用是改写数据包的源地址和源端口等,共享上网就是通过这个实现的

数据包经过防火墙时,根据规则一层层的由上至下过滤,如果规则匹配,不会继续向下匹配,而执行Accept或drop,如果所有规则都不匹配,就会根据默认的数据包规则进行处理.

每个表的链所在位置示意图:

我们一般常用的是FILTER表的INPUT和NAT的POSTROUTING,其次是NAT表的PREROUTING和FILTER表的FORWARD

iptables使用

[root@h1 ~]#  iptables -V
iptables v1.4.7
[root@h1 ~]#  iptables -h
iptables v1.4.7

Usage: iptables -[AD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain        Append to chain                             #添加规则到结尾
  --delete  -D chain        Delete matching rule from chain             #删除规则
  --delete  -D chain rulenum
                Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]                                          ##添加规则到开头(一般封IP都用-I)
                Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
                Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]                                        #列表
                List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
                Print the rules in a chain or all chains
  --flush   -F [chain]      Delete all rules in  chain or all chains    #清除所有规则
  --zero    -Z [chain [rulenum]]                                        #链的计数器清零
                Zero counters in chain or all chains
  --new     -N chain        Create a new user-defined chain             #添加自定义的链
  --delete-chain
            -X [chain]      Delete a user-defined chain                 #删除自定义的链
  --policy  -P chain target                                             #默认规则
                Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
                Change chain name, (moving any references)
Options:
[!] --proto -p proto    protocol: by number or name, eg. `tcp'
[!] --source    -s address[/mask][...]
                source specification
[!] --destination -d address[/mask][...]
                destination specification
[!] --in-interface -i input name[+]
                network interface name ([+] for wildcard)
 --jump -j target                                                       #处理规则
                target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match   -m match
                extended match (may load extension)
  --numeric -n      numeric output of addresses and ports               #显示数量
[!] --out-interface -o output name[+]
                network interface name ([+] for wildcard)
  --table   -t table    table to manipulate (default: `filter')
  --verbose -v      verbose mode
  --line-numbers        print line numbers when listing                 #规则序号
  --exact   -x      expand numbers (display exact values)
[!] --fragment  -f      match second or further fragments only
  --modprobe=<command>      try to insert modules using this command
  --set-counters PKTS BYTES set the counter during insert/append
[!] --version   -V      print package version.                          #查看版本

这个是通过-h获得的,博客最下面有根据百度文库整理的iptables指令。

启动防火墙

[root@h1 ~]# service iptables start
iptables: Applying firewall rules:                         [  OK  ]
[root@h1 ~]# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination  
[root@h1 ~]# lsmod | egrep "nat|filter"         #iptables模块
iptable_filter          2793  1 
ip_tables              17831  1 iptable_filter
ip6table_filter         2889  1 
ip6_tables             18732  1 ip6table_filter

如果无法启动防火墙,可以在setup中选择Firewall configuration选择enable

显示默认表的规则

[root@h1 ~]# iptables -L -n         
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

当然也可以加-v -x参数

清除所有规则

[root@h1 ~]# iptables -F 
[root@h1 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination           

生成新规则

[root@h1 ~]# ss -lnptu | grep ssh
tcp    LISTEN     0      128                   :::22                   :::*      users:(("sshd",1709,4))
tcp    LISTEN     0      128                    *:22                    *:*      users:(("sshd",1709,3))
[root@h1 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
[root@h1 ~]#

  • 然后就我们的ssh登录就断开了,如果想恢复就需要清楚规则
  • -t参数可以不加,默认为filter
  • -dport为发送端口,-sport是源端口,不过源端口用的比较少
  • 链和规则都必须要大写
  • 基本处理规则为DROP(丢弃),REJECT(拒绝)和APPECT(接受),不过DROP(丢弃)比REJECT(拒绝)好一些

查看规则顺序

[root@h1 ~]# iptables -t filter -L -n   --line-numbers 
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

规则顺序

[root@h1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
[root@h1 ~]# iptables -t filter -A INPUT -p tcp --dport 81 -j DROP
[root@h1 ~]# iptables -t filter -A INPUT -p tcp --dport 82 -j DROP
[root@h1 ~]# iptables -t filter -I INPUT -p tcp --dport 79 -j DROP
[root@h1 ~]# iptables -t filter -L -n   --line-numbers 
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:79 
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:81 
4    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:82 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination    
[root@h1 ~]# iptables -t filter -I INPUT 2 -p tcp --dport 78 -j DROP
[root@h1 ~]# iptables -t filter -L -n   --line-numbers 
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:79 
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:78 
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 
4    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:81 
5    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:82 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination        

-A为插入到结尾,-I为插入到开头,对于封IP都是用-I参数,因为放在后边会不生效,也可以在INPUT等后边加上数字,代表插入为第几个规则

禁止目的IP网络接入

[root@h1 ~]# iptables -t filter -A INPUT -i eth0 -s 192.168.174.102 -j DROP
[root@h1 ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 33 packets, 2208 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  148 12432 DROP       all  --  eth0   *       192.168.174.102      0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 21 packets, 2300 bytes)
 pkts bytes target     prot opt in     out     source               destination         

通过-i指定接入网卡,同理-o为指定发出网卡,不过出就一般是用FORWARD链,-s指定ip,也可以是网段,例如192.168.174.0/24,防火墙禁止后,192.168.174.102就无法访问192.168.174.101的主机了。还有一个'!'用于非,即匹配非-s参数进行允许 CentOS5.X版本

[root@h1 ~]# iptables -t filter -A INPUT -i eth0 -s ! 192.168.174.102 -j ACCEPT

CentOS6.X版本

[root@h1 ~]# iptables -t filter -A INPUT -i eth0 ! -s 192.168.174.102 -j ACCEPT

禁止ICMP协议,禁ping

[root@h1 ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -s 192.168.174.102 -j DROP

一般VPN服务,对外体统服务的机器的SSH端口都做禁止外部IP访问限制,这个8是数据包的大小,也可以指定为any

封范围端口

[root@h1 ~]# iptables -A INPUT -dport 50:80 -j DROP
[root@h1 ~]# iptables -A INPUT -m multiport -dport 21,22,23,24 -j DROP

根据连接状态进行匹配

[root@h1 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

一般用于FTP

指定请求速率

[root@h1 ~]# iptables -A INPUT -s 192.168.174.0/24 -d 192.168.0.101 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT

--limit用法是n/{second/minute/hour}指定时间内的请求数为n ----limit-burst限制在同一时间内允许通过的请求数为n,默认为5

企业防火墙配置

基本配置

清除默认规则

[root@h1 ~]# iptables -F        #清除所有规则
[root@h1 ~]# iptables -X        #清除自定义链
[root@h1 ~]# iptables -Z        #计数器清零

添加ssh登录和本地回环

[root@h1 ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.174.0/24  -j ACCEPT     #允许ssh登录,可以根据需要修改端口号及网段
[root@h1 ~]# iptables -A INPUT -i lo -j ACCEPT                                      #允许本地回环
[root@h1 ~]# iptables -A OUTPUT -o lo -j ACCEPT  

添加默认规则

[root@h1 ~]# iptables -P INPUT DROP         #默认规则,不允许进入
[root@h1 ~]# iptables -P OUTPUT ACCEPT      #默认规则,允许离开
[root@h1 ~]# iptables -P FORWARD DROP       #默认规则,不允许转发

根据自身配置

添加网段访问

一般是允许办公网的IP,IDC机房内网网段,IDC机房外网网段,以及其他所属机房的网段或固定IP地址访问 例如:

[root@h1 ~]# iptables -A INPUT -s 192.168.0.0/24 -p all -j ACCEPT

添加服务端口

允许web服务访问,同理mysql服务,hdfs服务等 例如:

[root@h1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

是否允许ping通

ping默认为8字节,禁止的话为DROP,允许的话为ACCEPT,也可以按照上面的限制次数和并发的访问

[root@h1 ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP 

允许FTP关联的包通过

[root@h1 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@h1 ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

检验

[root@h2 ~]# nmap 192.168.174.101 -p 1-65535
Nmap scan report for A (192.168.174.101)
Host is up (0.00038s latency).
Not shown: 65533 closed ports
Port    STATE   SERVICE
22/tcp  open    ssh
80/tcp  open    http

[root@h1 ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  192.168.174.0/24     0.0.0.0/0           tcp dpt:22 
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  192.168.0.0/24       0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 
5    DROP       icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 8 
6    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

Chain FORWARD (policy DROP)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

保存防火墙配置

上述配置都是存放在在内存中,当前生效,重启后就失效了,需要保存到iptables文件中

[root@h1 ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@h1 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Tue Jan 24 20:48:37 2017
*filter
:INPUT DROP [12:936]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [191:25372]
-A INPUT -s 192.168.174.0/24 -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -s 192.168.0.0/24 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -o lo -j ACCEPT 
COMMIT
# Completed on Tue Jan 24 20:48:37 2017

也可以用

iptables-save>/etc/sysconfig/iptables

防止syn攻击

[root@h1 ~]# iptables -N syn-flood
[root@h1 ~]# iptables -A INPUT -i eth0 -p tcp --syn -j syn-flood
[root@h1 ~]# iptables -A syn-flood -m limit --limit 5000/s --limit-burst 200 -j RETURN
[root@h1 ~]# iptables -A syn-flood -j DROP

RETURN,结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。

日后添加或删除规则

日后添加或删除规则需要通过直接修改/etc/sysconfig/iptables配置文件实现,然后保存后通过service iptables reload生效

iptables tcp-flags过滤

# prevent all Stealth Scans and TCP State Flags
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# All of the bits are cleared
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
#SYN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# SYN and FIN are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# FIN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

定时脚本

提供一个简单的加墙脚本,仅提供一个思路

#!/bin/sh
/bin/netstat -na | grep ESTABLISHED | awk '{print $5}' | awk -F':' '{print $1}' | sort | uniq -c | sort -rn | head -10 | egrep -v '192.168|127.0' | awk '{if ($2!=null && $1<4) {print $2}}' > /why/dropip
for i in $(cat /why/dropip)
do 
        /sbin/iptables -I INPUT -s $i -j DROP
        echo "$i kill at `date`">>/var/log/ddos
done

iptables 指令语法

以下内容摘自百度文库链接

iptables [-t table] command [match] [-j target/jump]

[-t table] 指定规则表

-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle和filter,当未指定规则表时,则一律视为是filter。

三个规则表的功能

  • filter:这是默认的表,包含了内建的链INPUT(处理进入的包)、FORWORD(处理通过的包)和OUTPUT(处理本地生成的包)。这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、LOG、ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中;
  • nat:这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成:PREROUTING(修改到来的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包)。这个规则表除了作网址转换外,请不要做其它用途;
  • mangle:此规则表拥有PREROUTING、FORWARD和POSTROUTING三个规则链。除了进行网址转换工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。

    command常用命令列表

命令 范例 说明
-A, --append iptables -A INPUT ... 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则
-D, --delete iptables -D INPUT --dport 80 -j DROP iptables -D INPUT 1 说明从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除
-R, --replace iptables -R INPUT 1 -s 192.168.0.1 -j DROP 取代现行规则,规则被取代后并不会改变顺序
-I, --insert iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本该位置上的规则将会往后移动一个顺位
-L, --list iptables -L INPUT 列出某规则链中的所有规则
同上 iptables -t nat -L 列出nat表所有链中的所有规则
-F, --flush iptables -F INPUT 删除filter表中INPUT链的所有规则
-Z, --zero iptables -Z INPUT 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
-N, --new-chain iptables -N allowed 定义新的规则链
-X, --delete-chain iptables -X allowed 删除某个规则链
-P, --policy iptables -P INPUT DROP 定义过滤政策。也就是未符合过滤条件之封包,默认的处理方式。可以是:ACCEPT:未经禁止全部许可,DROP:未经许可全部禁止
-E, --rename-chain iptables -E allowed disallowed 修改某自定义规则链的名称
-h --Help iptables -h 帮助。给出当前命令语法非常简短的说明

附加选项(OTHER OPTIONS)

  • -v --verbose 详细输出。这个选项让list命令显示接口地址、规则选项(如果有)和TOS(Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。
  • -n --numeric
    数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显示主机名、网络名或者服务(只要可用)。
  • -x -exact 扩展数字。显示包和字节计数器的精确值,代替用K,M,G表示的约数。这个选项仅能用于-L命令。
  • --line-numbers 当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应。

    [match] 常用封包匹配参数

参数 范例 说明
-p, --protocol iptables -A INPUT -p tcp 匹配通讯协议类型是否相符,可以使用"!"运算符进行反向匹配,例如:-p !tcp,意思是指除 tcp 以外的其它类型,如udp、icmp ...等。如果要匹配所有类型,则可以使用all关键词,例如:-p all
-s, --src, --source iptables -A INPUT -s 192.168.1.1 用来匹配封包的来源 IP,可以匹配单机或网络,匹配网络时请用数字来表示 子网掩码,例如:-s 192.168.0.0/24;匹配IP 时可以使用 ! 运算符进行反向匹配,例如:-s !192.168.0.0/24
-d, --dst, --destination iptables -A INPUT -d 192.168.1.1 用来匹配封包的目的地 IP,设定方式同上。
-i, --in-interface iptables -A INPUT -i eth0 用来匹配封包是从哪块网卡进入,可以使用通配字符 + 来做大范围匹配,例如:-i eth+表示所有的ethernet网卡,也可以使用!运算符进行反向匹配,例如:-i !eth0
-o, --out-interface iptables -A FORWARD -o eth0 用来匹配封包要从哪 块网卡送出,设定方式同上

对应的扩展(MATCH EXTENSIONS)

iptables能够使用一些与模块匹配的扩展包。以下就是含于基本包内的扩展包,而且他们大多数都可以通过在前面加上!来表示相反的意思。

tcp

--protocol tcp被指定,且其他匹配的扩展未被指定时,这些扩展被装载。它提供以下选项:

参数 范例 说明
--sport, --source-port iptables -A INPUT -p tcp --sport 22 用来匹配封包的源端口,可以匹配单一端口,或是一个范围,例如:--sport 22:80表示从22到80端口之间都算是符合条件,如果要匹配不连续的多个端口,则必须使用--multiport参数,详见后文。匹配端口号时,可以使用"!"运算符进行反向匹配。
--dport, --destination-port iptables -A INPUT -p tcp --dport 22 用来匹配封包的目的地端口号,设定方式同上
--tcp-flags iptables -p tcp --tcp-flags SYN,FIN,ACK,SYN 说明匹配TCP封包的状态标志,参数分为两个部分,第一个部分列举出相匹配的标志,第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的。TCP 状态标志包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等均可使用于参数中,除此之外还可以使用关键词ALL和NONE进行匹配。匹配标志时,可以使用"!"运算符行反向匹配
--syn iptables -p tcp --syn 用来表示TCP通信协议中,SYN位被打开,而ACK与FIN位关闭的分组,即TCP的初始连接,与iptables -p tcp --tcp-flags SYN,FIN,ACK,SYN的作用完全相同,如果使用!运算符,可用来匹配非要求连接封包。 --tcp-option [!] number匹配设置了TCP选项的

udp

--protocol udp被指定,且其他匹配的扩展未被指定时,这些扩展被装载,它提供以下选项:

参数 范例 说明
--sport --source-port [!] [port:[port]] 源端口或端口范围指定。详见 TCP扩展的--source-port选项说明
--dsport --destination-port 目标端口或端口范围指定。详见 TCP扩展的--destination-port选项说明

icmp

--protocol icmp被指定,且其他匹配的扩展未被指定时,该扩展被装载。它提供以下选项:

参数 范例 说明
--icmp-type iptables -A INPUT -p icmp --icmp-type 8 用来匹配ICMP的类型编号,可以使用代码或数字编号来进行匹配。请打iptables -p icmp --help 来查看有哪些代码可用
-m mac --mac-source iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 用来匹配封包来源网络接口的硬件地址,这个参数不能用在OUTPUT和POSTROUTING规则链上,这是因为封包要送到网卡后,才能由网卡驱动程序透过ARP通讯协议查出目的地的MAC地址,所以iptables在进行封包匹配时,并不知道封包会送到哪个网络接口去

m参数选项

multiport模块

这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p tcp 或者 -p udp 连着使用

参数 范例 说明
-m multiport --source-port iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 用来匹配不连续的多个源端口,一次最多可以匹配 15 个端口,可以使用"!"运算符进行反向匹配
-m multiport --destination-port 用来匹配不连续的多个目的地端口号,设定方式同上
-m multiport --port iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为80目的地端口号为110,这种封包并不算符合条件

limit模块

这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了"!"标记)

参数 范例 说明
-m limit --limit iptables -A INPUT -m limit --limit 3/hour 用来匹配某段时间内封包的平均流量,上面的例子是用来匹配:每小时平均流量是否超过一次3个封包。除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day,除了进行封包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动作,以避免因骇客使用洪水攻击法,导致服务被阻断
--limit-burst iptables -A INPUT -m limit --limit-burst 5 用来匹配瞬间大量封包的数量,上面的例子是用来匹配一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上

mark模块

这个模块和与netfilter过滤器标记字段匹配(就可以在下面设置为使用MARK标记)

参数 --mark

范例 iptables -t mangle -A INPUT -m mark --mark 1

说明 用来匹配封包是否被表示某个号码,当封包被 匹配成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最大不可以超过 4294967296

owner模块

此模块试为本地生成包匹配包创建者的不同特征。只能用于OUTPUT链,而且即使这样一些包(如ICMP ping应答)还可能没有所有者,因此永远不会匹配。

参数 范例 说明
-m owner --uid-owner iptables -A OUTPUT -m owner --uid-owner 500 用来匹配来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用root或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法匹配出来自其它主机的封包
-m owner --gid-owner iptables -A OUTPUT -m owner --gid-owner 0 用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上
-m owner --pid-owner iptables -A OUTPUT -m owner --pid-owner 78 用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上
-m owner --sid-owner iptables -A OUTPUT -m owner --sid-owner 100 用来匹配来自本机的封包,是否为某特定 连接(Session ID)的响应封包,使用时机同上。

state模块

此模块,当与连接跟踪结合使用时,允许访问包的连接跟踪状态;

参数 -m state --state

范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED

说明 用来匹配连接状态, 连接状态共有四种:INVALID、ESTABLISHED、NEW和RELATED。

  • INVALID 表示该封包的连接编号(Session ID)无法辨识或编号不正确。
  • ESTABLISHED 表示该封包属于某个已经建立的连接。
  • NEW 表示该封包想要起始一个连接(重设连接或将连接重导 向)。
  • RELATED 表示该封包是属于某个已经建立的连接,所建立的新连接。例如:FTP-DATA连接必定是源自某个FTP连接。

tos模块

此模块匹配IP包首部的8位tos(服务类型)字段(也就是说,包含在优先位中)

--tos tos 这个参数可以是一个标准名称(iptables -m tos -h 察看该列表),或者数值。

[-j target/jump] 常用的处理动作:

-j 参数用来指定要进行的处理动作,常用的处理动作包括: ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:

  • ACCEPT: 将封包放行,进行完此处理动作后,将不再匹配其 它规则,直接跳往下一个规则链(natostrouting)。

  • REJECT: 作为对匹配的包的响应,返回一个错误的包:其他 情况下和DROP相同。 此目标只适用于INPUT、FORWARD和OUTPUT链,和调用这些链的用户自定义链。这几个选项控制返回的错误包的特性: --reject-with type Type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-unreachable,icmp-proto-unreachable、 icmp-net-prohibited或者icmp-host-prohibited,该类型会返回相应的ICMP错误信息(默认是port-unreachable)。选项echo-reply也是允许的;它只能用于指定ICMP ping包的规则中,生成ping的回应。最后,选项tcp-reset可以用于在INPUT链中,或自INPUT链调用的规则,只匹配TCP协议:将回应一个TCP RST包。

  • DROP: 丢弃封包不予处理,进行完此处理动作后,将不再匹 配其它规则,直接中断过滤程序。

  • REDIRECT: 只适用于nat表的PREROUTING和OUTPUT链, 和只调用它们的用户自定义链。将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则。 这个功能可以用来实现透明代理或用来保护 web 服务器。它包含一个选项: --to-ports [] 指定使用的目的端口或端口范围:不指定的话,目标端口不会被修改。只能用于指定了-p tcp 或 -p udp的规则。 例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

  • MASQUERADE:只用于nat表的POSTROUTING链。只能用于动态获取IP(拨号)连接:如果你拥有静态IP地址,你要用SNAT。伪装相当于给包发出时所经过接口的IP地址设置一个映像,当接口关闭连接会终止。这是因为当下一次拨号时未必是相同的接口地址(以后所有建立的连接都将关闭)。它有一个选项: --to-ports <port>[-port]指定使用的源端口范围,覆盖默认的SNAT源地址选择(见上面)。这个选项只适用于指定了-p tcp或者-p udp的规则。 范例如下:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

  • LOG: 为匹配的包开启内核记录。当在规则中设置了这一选项后,linux内核会通过printk()打印一些关于全部匹配包的信息(诸如IP包头字段等) --log-level level 记录级别(数字或参看 syslog.conf(5))。 --log-prefix prefix 在纪录信息前加上特定的前缀:最多14个字母长,用来和记录中其他信息区别。 例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
    --log-tcp-sequence 记录TCP序列号。如果记录能被用户读取那么这将存在安全隐患 --log-tcp-options 记录来自TCP包头部的选项。 --log-ip-options 记录来自IP包头部的选项。

  • SNAT:这个目标只适用于nat表的POSTROUTING链。改写封包来源IP为某特定IP或IP范围,可以指定port对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting),它包含选项: --to-source <ipaddr>[-ipaddr][:port-port] 可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则如果未指定端口范围,源端口中512以下的(端口)会被安置为其他的512以下的端口;512到1024之间的端口会被安置为1024以下的,其他端口会被安置为1024或以上。如果可能,端口不会被修改。 --to-destiontion<ipaddr>[-ipaddr][:port-port] 可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,目标端口不会被修改。 范例如下:iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

  • DNAT: 改写封包目的地IP为某特定IP或IP范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。 范例如下:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

  • MIRROR: 镜射封包,也就是将来源IP与目的地IP对调后,将封包送回,并只适用于INPUT、FORWARD和OUTPUT链,以及只调用它们的用户自定义链。

  • QUEUE: 中断过滤程序,将封包放入队列,交给其它程序处理。通过自行开发的处理程序,可以进行其它应用,例如:计算连接费用等。

  • RETURN: 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。

  • MARK: 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续匹配其它规则,只适用于mangle表。范例如下iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

  • TOS: 用来设置IP包的首部八位tos。只能用于mangle表。
    --set-tos tos 你可以使用一个数值型的TOS值,或者用iptables -j TOS -h来查看有效TOS名列表;

常见攻击方式

刺探和扫描

刺探是企图连接到一个单独的服务端口或获得该端口的响应.扫描是到一个不同服务端口的集合的一系列的刺探

拒绝服务攻击

  1. TCP SYN洪水攻击消耗你的系统资源直到不可能再接受入站的TCP连接为止。这个攻击结合了IP源地址欺骗,同时还利用了连接时进行的基本TCP三次握手协议,解决方法:一、对源地址进行过滤;二、启用内核的SYN cookie模块,当资源紧张时可释放队列。用命令echo 1 > /proc/sys/net/ipv4/tcp_syncookies来完成
  2. ping洪水攻击和ping of Death(现在不常用)
  3. UDP洪水攻击
  4. 碎片炸弹
  5. 缓冲区溢出 主要通过重写系统的数据区域或运行时堆栈(是在函数调用进程中所使用的一种暂存空间)来使系统或服务器崩溃
  6. ICMP重定向炸弹 告诉目标系统改变其内存中的路由表以选用更短的路径
  7. 拒绝服务攻击和其他系统资源 如:系统被迫向错误日志文件中写入大量的消息,那么你的文件系统将溢出