linux下iptables防火墙详解

  1. Linux网络防火墙基础知识

    工作在主机或网络的边缘,对于进出的数据报文按照事先定义好的规则中的匹配标准进行检查,并做出对应的处理办法的机制称作防火墙。

 IP报文首部:主要包含源IP,目标IP

 TCP报文首部:主要包含源端口,目标端口,标志位SYN,ACK,RST,FIN

匹配标准解释:

 IP: 源IP,目标IP

 TCP: 源端口,目标端口         

 TCP三次握手三个阶段表示:     

   第一阶段:  SYN=1,FIN=0,RST=0,ACK=0;  

   第二阶段: SYN=1,ACK=1,FIN=0,RST=0; 

   第三阶段: ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)

 UDP: 源端口,目标端口 

 ICMP:icmp-type  0 表示echo-reply, 8 表示echo-request

2.Iptables防火墙分为四个表五个链

 四个表:filter,nat,mangle,row

 五个链:PREROUTING,INPUT,FORWORD,OUTPUT,POSTROUTING

 filter(过滤表):可应用于此3个规则链INPUT,OUTPUT,FORWARD

 nat(地址转换表):可应用于此3个规则链PREROUTING,OUTPUT,POSTROUTING

 mangle(拆开/修改/封装等表):可应用于此5个规则链,如下:                               PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

 raw(与mangle相反保留数据报文源有格式):可应用于此2个规则链PREROUTING,OUTPUT

 注意:iptabels :可以使用自定链,但只在被调用时才能发挥作用

          可以删除自定义的空链,但默认链无法删除

          每个规则链都有两个内置的计数器:被匹配的报文个数和被匹配的报文大小之和

3.iptables命令:

 格式:  iptables [-t 表] 命令 链 [num] 匹配标准 -j 处理办法

3.1.匹配标准:分为通用匹配和扩展匹配,而扩展匹配又分为隐含扩展和显式扩展

(1).通用匹配:

  -s, --src: 指定源地址

  -d, --dst:指定目标地址

  -p {tcp|udp|icmp}:指定协议

  -i 网络接口: 指定数据报文流入的接口

  -o 网络接口: 指定数据报文流出的接口

(2).扩展匹配:

 (2.1).隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp}

 -p tcp

   --sport PORT[-PORT]: 源端口

   --dport PORT[-PORT]: 目标端口

   --tcp-flags mask comp: 只检查mask指定的标志位(逗号分隔),comp列表中出现的标记位必须为                   1,comp中没出现,而mask中出现的,必须为0;例如:

        --tcp-flags SYN,FIN,ACK,RST SYN = --syn

   --syn

 -p icmp  --icmp-type  [0: echo-reply  8: echo-request]

 -p udp  --sport 或 --dport

 (2.2).显式扩展: 必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能

     格式:-m 扩展 指定扩展类型 其他选项值

   (2.2.1).状态扩展: -m state 结合ip_conntrack追踪会话的状态

     NEW: 新连接请求

     ESTABLISHED:已建立的连接

     INVALID:非法连接

     RELATED:相关联的

    例如: -m state --state NEW,ESTABLISHED -j ACCEPT

   (2.2.2).离散的多端口匹配扩展:-m multiport

   --source-ports      #将多个不连续源端口写在一条iptables语句中

   --destination-ports  #将多个不连续目标端口写在一条iptables语句中

    --ports将多个不连续端口(含源端口和目标端口)写在一条iptables语句中

    例如:-m multiport --destination-ports 21,22,80 -j ACCEPT

   (2.2.3).连续的IP地址范围扩展:-m iprange

    --src-range

    --dst-range

    例如: -m iprange --src-range 1.1.1.2-1.1.1.9 --dport 22  -j ACCEPT

iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    (2.2.4).连接数限制:-m connlimit

     ! --connlimit-above n :通常客户端达到连接数上限n拒绝,取反小于n才放行

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j ACCEPT

    (2.2.5).单位时间响应限制:-m limit

         --limit RATE: 每个单位时间内响应的平均个数

         --limit-burst n :首次第一批响应个数

      例如:-m limit --limit 5/miniute --limit-burst 10

    (2.2.6).匹配字符串限制:-m string

     --algo {bm|kmp}

     --string "STRING"

    例如:-m string --algo kmp --sting "abcd" -j REJECT

iptables -I OUTPUT -d 1.1.1.19 -m string --algo kmp --sting "abcd" -j REJECT

条件取反:!  例如:-s ! 172.16.1.1,表示匹配除172.16.1.1外所有源IP地址

3.2.命令

管理规则

 -A:附加一条规则,添加在链的尾部

 -I CHAIN [num]: 插入一条规则,插入为对应CHAIN上的第num条;

 -D CHAIN [num]: 删除指定链中的第num条规则;

 -R CHAIN [num]: 替换指定的规则;

例如:iptables -D INPUT 2 #删除INPUT链中第2条规则

管理链:

 -F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链

 -P CHAIN: 设定指定链的默认策略;

 -N:自定义一个新的空链

 -X: 删除一个自定义的空链

 -Z:清除指定链中所有规则的计数器;

 -E: 重命名自定义的链;

例如:iptables -P INPUT DROP #将INPUT链默认策略为拒绝

查看类:

 -L: 显示指定表中的规则;

 -n: 以数字格式显示主机地址和端口号;

 -v: 显示链及规则的详细信息,或用-vv,-vvv

 -x: 显示计数器的精确值

 --line-numbers: 显示规则号码

例如:iptables -L -n #查看当前INPUT链中现有规则

3.3.处理办法: -j (TARGET)

 ACCEPT:放行

 DROP:丢弃

 REJECT:拒绝,弹回信息

 DNAT:目标地址转换,常应用于PREROUTING

 SNAT: 源地址转换, 常应用于POSTROUTING

 REDIRECT:端口重定向

 MASQUERADE:地址伪装,常应用于ADSL拨号等动态获取IP场景

 MARK:打标记

 RETURN:新增链返回主链处理

 CHAIN:主链调用新增链

 LOG:日志

   --log-prefix "STRING"

例如:iptables -I INPUT -d 1.1.1.19 -p icmp  -j LOG --log-prefix "firewall log--"

4.iptables不是服务,但有服务脚本,主要作用在于管理保存的规则

# service iptables save  并保存在此文件中:/etc/sysconfig/iptables

 service iptables stop  清除并移除iptables相关模块

 service iptatbles start 加载iptables相关模块

# iptables-save > /etc/sysconfig/iptables.bak

# iptables-restore < /etc/sysconfig/iptables.bak

装载及移除iptables/netfilter相关的内核模块;

iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack


5.仅允许1.1.1.0/24网段上能ssh访问1.1.1.19主机,请在1.1.1.19linux主机上写出对应iptables

 iptables -t filter -A INPUT -s 1.1.1.0/24 -d 1.1.1.19 -p tcp --dport 22 -j ACCEPT

 iptables -t filter -A OUTPUT -s 1.1.1.19 -d 1.1.1.0/24 -p tcp --sport 22 -j ACCEPT

 iptables -P INPUT DROP

 iptables -P OUTPUT DROP

 iptables -P FORWORD DROP    

6.允许所有客户端访问1.1.1.19网站服务器,请在1.1.1.19linux主机上写出对应iptables

 iptables -t filter -A INPUT -d 1.1.1.19 -p tcp --dport 80 -j ACCEPT

 iptables -t filter -A OUTPUT -s 1.1.1.19 -p tcp --sport 80 -j ACCEPT

 iptables -P INPUT DROP

 iptables -P OUTPUT DROP

 iptables -P FORWORD DROP 

7.允许1.1.1.19能够ping通所有主机,但其他主机不能ping1.1.1.19

 iptables -A OUTPUT -s 1.1.1.19 -p icmp --icmp-type 8 -j ACCEPT

 iptables -A INPUT -d 1.1.1.19 -p icmp --icmp-type 0 -f ACCEPT

 注意:0代表echo-reply响应报文,8代表echo-request请求报文

    -t fliter没有写,iptables命令默认不写就是指filter表

    默认策略确认是拒绝,否则测试不到效果,拒绝策略如上已给出

8.通过状态扩展,追踪连接方式,允许所有主机能ssh访问1.1.1.19服务器,但服务器不能ssh连出去

iptables -L -n  #查看现有的iptables filter表现有规则

iptables -F    #清空iptables filter表所有规则

iptables -A INPUT -d 1.1.1.19 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

iptables -P OUTPUT DROP

9.通过状态扩展,追踪连接方式,允许所有主机能访问1.1.1.19服务器网站,但服务器不能上网

iptables -A INPUT -d 1.1.1.19 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

iptstate #查看系统tcp/udp/icmp等连接状态命令

10.通过状态扩展,追踪连接方式,允许所有主机能PING通1.1.1.19服务器,但服务器不能PING出去

iptables -A INPUT -d 1.1.1.19 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT

11.将OUTPUT链中都是ESTABLISHED规则条目.精减汇总成一个条目

iptables -L -n --line-numbles  #查看现有规则

Chain OUTPUT (policy DROP)

num  target    prot opt source       destination         

1    ACCEPT   tcp  --  1.1.1.19    0.0.0.0/0  tcp spt:22 state ESTABLISHED 

2    ACCEPT   tcp  --  1.1.1.19    0.0.0.0/0  tcp spt:80 state ESTABLISHED 

3    ACCEPT   icmp --  1.1.1.19     0.0.0.0/0  icmp type 0 state ESTABLISHED 

iptables -I OUTPUT -s 1.1.1.19 -m state --state ESTABLISHED -j ACCEPT

再删除原有3条OUTPUT规则

iptables -D OUTPUT 4

iptables -D OUTPUT 3

iptables -D OUTPUT 2

iptables -L -n #查看现有OUTPUT规则,只剩一条刚插入的汇总规则

12.通过状态扩展,追踪连接方式,允许所有主机能连到1.1.1.19 FTP服务器

 首先加载iptables ftp模块,即vim /etc/sysconfig/iptables-config

 添加如下一行:IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

 service iptables save 

 service iptables restart

iptables -I INPUT -d 1.1.1.19 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -d 1.1.1.19 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -m state --state ESTABLISHED,RELATED -j ACCEPT

13.允许1.1.1.0内客户端通过1.1.1.19 DNS服务器解析

解析内网主机:

iptables -A INPUT -s 1.1.1.0/24 -d 1.1.1.19 -p udp --dport 53 -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -d 1.1.1.0/24 -p udp --sport 53 -j ACCEPT

通过根迭代解析外部DNS上网:

iptables -A INPUT -d 1.1.1.19 -p udp --sport 53 -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -p udp --dport 53 -j ACCEPT

14.将INTPUT链中都是多个不连续的端口规则条目.精减汇总成一个条目

iptables -L -n --line-numbles  #查看现有规则

Chain INPUT (policy DROP)

num  target   prot opt source     destination         

1    ACCEPT   all  -- 0.0.0.0/0   1.1.1.19   state RELATED,ESTABLISHED 

2    ACCEPT   tcp  -- 0.0.0.0/0   1.1.1.19   tcp dpt:22 state NEW,ESTABLISHE

3    ACCEPT   tcp  -- 0.0.0.0/0   1.1.1.19   tcp dpt:80 state NEW,ESTABLISHED 

4    ACCEPT   tcp  -- 0.0.0.0/0   1.1.1.19   tcp dpt:21 state NEW,ESTABLISHED 

wKioL1dWvPiD_sKZAAI_ezi9XRQ387.jpg-wh_50

iptables -I INPUT 2 -d 1.1.1.19 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT

iptables -D INPUT 3

iptables -D INPUT 3

iptables -D INPUT 3

iptables -L -n --line-numbles  #再查看现有规则

wKioL1dWv8-TwyNrAAGxBIRP5r0684.jpg-wh_50


15.自定义一条链Deny_in,拒绝接收ping广播包,拒绝tcp标志位全为1和全为零,最后返回INPUT链,并让INPUT链调用Deny_in链,继续处理

iptables -N Deny_in

iptables -A Deny_in -d 255.255.255.255 -p icmp -j DROP

iptables -A Deny_in -d 172.16.255.255 -p icmp -j DROP

iptables -A Deny_in -p tcp ! --syn -m state --state NEW -j DROP

iptables -A Deny_in -p tcp --tcp-flags ALL ALL -j DROP

iptables -A Deny_in -p tcp --tcp-flags ALL NONE -j DROP

iptables -A Deny_in -d 1.1.1.19 -j RETURN 

iptables -I INPUT -j Deny_in

16.利用iptables的recent模块来抵御DOS***,

 利用connlimit模块将单IP的并发设置为10;可以根据实际情况增大该值;

 利用recent和state模块限制单IP在120s内只能与本机建立3个新连接。否则会被限制2分钟,

  2分钟后才能恢复访问连接。

iptables -I INPUT 2 -p tcp --dport 22 -m connlimit --connlimit-above 10 -j DROP

iptables -I INPUT 3 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT 4 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 120 --hitcount 3 --name SSH -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 120 --hitcount 3 -j LOG --log-prefix "SSH Attack"  #记录日志

 说明:上面第二句是记录访问tcp 22端口的新连接,记录名称为SSH

        --set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

    上面第三句是指SSH记录中的IP,120s内发起超过3次连接则拒绝此IP的连接。

        --update 是指每次建立连接都更新列表;

        --seconds必须与--rcheck或者--update同时使用

        --hitcount必须与--rcheck或者--update同时使用

17.利用SNAT技术:linux防火墙主机有两块网卡,内网卡IP为192.168.1.1,外网卡公网地址为         202.98.7.10,让192.168.1.0/24所有客户端上网,实现源地址静态转换

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.98.7.10

 注意要开启ip_forward路由功能,回包目标地址转换将会是自动进行,无需人工干预

18.利用MASQUERADE技术,如果是ADSL拨号上网,linux防火墙主机有两块网卡,内网卡IP为192.168.1.1,外   网卡公网地址为动态获取,让192.168.1.0/24所有客户端上网,实现源地址动态转换

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE #下面一条指令功能一样

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

 注意:如果是ADSL拨号上网,需安装rp-pppoe拨号软件

19.Forward转发功能:让内网1.1.1.0/24所有客户端能访问外部网站,但外网不能访问内网客户端

iptables -A FORWARD -s 1.1.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT

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

iptables -P FORWARD DROP

20.Forward转发功能:让内网1.1.1.0/24所有客户端能PING通外部,但外网不能PING内部

iptables -A FORWARD -s 1.1.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

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

iptables -P FORWARD DROP

21.Forward转发功能:让内网1.1.1.0/24所有客户端能连接外部FTP,但外网不能FTP内部

iptables -A FORWARD -s 1.1.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT

iptables -A FORWARD -m state --state RELATED ESTABLISHED -j ACCEPT

iptables -P FORWARD DROP
注意:加载iptables ftp模块,即vim /etc/sysconfig/iptables-config

   添加如下一行:IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

22.利用DNAT技术:linux防火墙主机有两块网卡,内网卡IP为1.1.1.1,外网卡公网地址为202.98.7.10,让外网可访问内访问1.1.1.18网站,实现目标地址转换

iptables -t nat -A PREROUTING -d 202.98.7.10 -p tcp -dport 80 -j DNAT --to-destination 1.1.1.18

23.利用DNAT技术:linux防火墙主机有两块网卡,内网卡IP为1.1.1.1,外网卡公网地址为202.98.7.10,让外网可访问内访问1.1.1.18:8080网站,实现目标地址转换

iptables -t nat -A PREROUTING -d 202.98.7.10 -p tcp -dport 80 -j DNAT --to-destination 1.1.1.18:8080

24.Forward转发功能:拒绝转发含有非法字样如"abcd"字符串内容信息

iptables -A FORWARD -m string --algo kmp --string "abcd" -j DROP

25.利用iptables技术根据协议协议特征码禁止内网客户端使用qq,skype,msn,迅雷等七层协议软件

要想使用七层协议,必须使linux系统达到以下条件

 25.1.给内核打补丁,并重新编译内核

 25.2.给iptables源码打补丁,并重新编译iptables

 25.3.安装l7proto,七层协议

 下载:内核:linux-2.6.28.10.tar.gz,网络过滤器:netfilter-layer7-v2.22.tar.gz以及

     协议特征码:l7-protocols-2009-05-28

首先给内核打补丁,并重新编译内核

# tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src

# tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src

# cd /usr/src

# ln –s  linux-2.6.28.10  linux

# cd /usr/src/linux/

# patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch 

# cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config

# make  menuconfig

主要编译选项:

Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration

<M>  Netfilter connection tracking support 

<M>  “layer7” match support

<M>  “string” match support

<M>  “time”  match support

<M>  “iprange”  match support

<M>  “connlimit”  match support

<M>  “state”  match support

<M>  “conntrack”  connection  match support

<M>  “mac”  address  match support

<M>   "multiport" Multiple port match support


Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration

<M> IPv4 connection tracking support (required for NAT)

<M>   Full NAT

<M>     MASQUERADE target support                                                                                   

<M>     NETMAP target support                                                                               

<M>     REDIRECT target support 



# make 

# make modules_install

# make install



给iptables源码打补丁,并重新编译iptables

# cp /etc/init.d/iptables ~/iptables

# cp /etc/sysconfig/iptables-config ~/

# rpm  -e  iptables-ipv6  iptables  iptstate  --nodeps

# tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src

# cd /usr/src/iptables-1.4.6

cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*      ./extensions/

# ./configure  --prefix=/usr  --with-ksource=/usr/src/linux

# make

# make install

安装七层协议特征码:

# tar zxvf l7-protocols-2009-05-28.tar.gz

# cd l7-protocols-2009-05-28

# make install


# mv ~/iptables  /etc/rc.d/init.d/

注意:编译的iptables的二进制文件与rpm包安装的路径有所不同,如需运行iptables脚本服务,必须修改对应的脚本文件里的命令路径

# service iptables start


七层协议相关iptables命令格式:

iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action] 

禁止内网192.168.1.0/24通过202.100.8.66外网口登入qq

iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.100.8.66

iptables -I FORWARD -s 192.168.1.0/24 -m layer7 --l7proto qq -j DROP

25.4.限制客户端上网时间段iptables命令

iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 08:00:00-12:00:00 -j DROP

iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 14:00:00-17:00:00 -j DROP