iptables是基于Linux kernel的防火墙软件,出现在kernel 2.6及以后的版本中。


1 封包进入流程:规则顺序的重要性


iptables 是利用封包过滤的机制,所以他会分析封包的表头数据。根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃。当一个网络封包要进入到主机之前,会先经由NetFilter 进行检查,那就是iptables 的规则了。检查通过则接受 (ACCEPT) 进入本机取得资源,如果检查不通过,则可能予以丢弃(DROP)! 如果这个封包并不符合Rule 1 的比对,那就会进入Rule 2 的比对了!如此一个一个规则去进行比对。


2 iptables的表格(table)和链(chain)


Linux 的iptables 至少有三个表格,包括管理本机进出的filter 、管理后端主机 (防火墙内部的其他计算机)的nat 、管理特殊旗标使用的mangle (较少使用) ,还可以自定义额外的链。

每个表格与其中链的用途分别是这样的:

filter (过滤器):主要跟进入Linux 本机的封包有关,这个是预设的table

   INPUT:主要与想要进入我们Linux 本机的封包有关;

   OUTPUT:主要与我们Linux 本机所要送出的封包有关;

   FORWARD:与Linux 本机比较没有关系,他可以转递封包到后端的计算机中,与下列nat table 相关性较高。


nat (地址转换):是Network Address Translation 的缩写,这个表格主要在进行来源与目的之IP 或port 的转换,与Linux 本机较无关,主要与Linux主机后的局域网络内计算机较有相关。

   PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)

   POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)

   OUTPUT:与发送出去的封包有关


mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关,早期仅有PREROUTING 及OUTPUT 链,不过从kernel 2.4.18 之后加入了INPUT 及FORWARD链。较少使用。


3 本机的iptables语法:默认的filter


3.1 查看规则


查看默认的filter规则:

iptables -L -n:

Chain INPUT (policy ACCEPT)          <==针对INPUT链,预设为接受

target     prot opt source              destination     <==说明栏

ACCEPT     all  --  anywhere            anywhere          state RELATED,ESTABLISHED   <==第一条规则

ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0   <==第2 条规则

ACCEPT all -- 0.0.0.0/00.0.0.0/0<==第3 条规则

ACCEPT     tcp  --  anywhere            anywhere            state NEW tcp dpt:ssh   <==依次类推

...

REJECT     all  --  anywhere            anywhere            reject-with icmp-host-prohibited


Chain FORWARD (policyACCEPT)<==针对FORWARD链,默认为接受

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)           <==针对OUTPUT链,默认为接受

target     prot opt source              destination



列出nat table三条链的规则:iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)

target     prot opt source              destination        


Chain POSTROUTING (policy ACCEPT)

target     prot opt source              destination        


Chain OUTPUT (policy ACCEPT)

target     prot opt source


target:代表进行的动作,ACCEPT 是放行,而REJECT 则是拒绝,此外,还有DROP (丢弃)的项目!

prot:代表使用的封包协议,主要有tcp, udp 及icmp 三种封包格式;

opt:额外的选项说明

source :代表此规则是针对哪个『来源IP』进行限制

destination :代表此规则是针对哪个『目标IP』进行限制


针对单机来说,INPUT与FORWARD 算是比较重要的管制防火墙链,所以最后一条规则的政策是REJECT (拒绝)。虽然INPUT 与FORWARD 的政策是放行(ACCEPT), 不过在最后一条规则就已经将全部的封包都拒绝了。


filter的INPUT的5条规则依据输出结果的说明:

1. 只要是封包状态为RELATED,ESTABLISHED 就予以接受

2. 只要封包协议是icmp 类型的,就予以放行

3. 无论任何来源(0.0.0.0/0) 且要去任何目标的封包,不论任何封包格式(prot 为all),通通都接受,仅针对每部主机都有的内部循环测试网络 (lo) 接口

4. 只要是传给port 22 的主动式联机tcp 封包就接受

5. 全部的封包信息通通拒绝


3.2 iptables-save查看完整的非规格化输出的防火墙规则


# Generated by iptables-save v1.4.7 onThu Dec 12 17:45:36 2013

*nat

:PREROUTING ACCEPT [281424:128898218]

:POSTROUTING ACCEPT [341:22936]

:OUTPUT ACCEPT [341:22936]

COMMIT

# Completed on Thu Dec 12 17:45:36 2013

# Generated by iptables-save v1.4.7 onThu Dec 12 17:45:36 2013

*filter                         <==星号开头的指的是表格,这里为filter

:INPUT ACCEPT [0:0]        <==冒号开头的指的是链,三条内建的链

:FORWARD ACCEPT [0:0]                     <==三条内建链的政策都是ACCEPT

:OUTPUT ACCEPT [14792:6996050]

-A INPUT -m state --stateRELATED,ESTABLISHED -j ACCEPT <==针对INPUT 的规则

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT        <==针对本机内部接口开放,“-i lo” 指的就是l适配卡进来的封包

-A INPUT -p tcp -m state --state NEW -mtcp --dport 22 -j ACCEPT

...

-A INPUT -j REJECT --reject-withicmp-host-prohibited

-A FORWARD -j REJECT --reject-withicmp-host-prohibited    <==针对FORWARD 的规则

COMMIT

# Completed on Thu Dec 12 17:45:36 2013


3.3 清除规则


清除本机防火墙(filter) 的所有规则:

iptables -F                 #清除所有的已订定的规则

iptables -X                 #杀掉所有使用者"自定义"的chain (应该说的是tables )

iptables -Z                 #将所有的chain 的计数与流量统计都归零

ps:这三个指令会将本机防火墙的所有规则都清除,但却不会改变预设政策(policy)


3.4 定义规则:清除完所有规则,就可以一条一条来设定规则


3.4.1定义预设政策policy


当你的封包不在你设定的规则之内时,则该封包的通过与否,是以Policy 的设定为准。

若对于内部的使用者有信心的话,那么filter 内的INPUT 链方面可以定义的比较严格一点,FORWARD 与OUTPUT则可以订定的轻松一些。将本机的INPUT 设定为DROP ,其他设定为ACCEPT :

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT


3.4.2 封包的基础比对:IP,网域,接口装置


设定lo 成为受信任的装置,亦即进出lo 的封包都予以接受:

iptables -A INPUT -i lo -j ACCEPT  

注解:没有列出-s,-d等等的规则,表示:不论封包来自何处或去到哪里,只要是来自lo 这个界面,就予以接受,所谓的信任装置。假如你的主机有两张以太网络卡,其中一张是对内部的网域,假设该网卡的代号为eth1 好了,如果内部网域是可信任的,那么该网卡的进出封包就通通会被接受,那你就能够用:”iptables -A INPUT -i eth1 -j ACCEPT“来将该装置设定为信任装置。不过,下达这个指令前要特别注意,因为这样等于该网卡没有任何防备了:

iptables -A INPUT -i eth1 -s 172.18.218.0/24 -j ACCEPT


记录某个规则:-j LOG

iptables -A INPUT -s 192.168.2.200 -j LOG

只要有封包来自192.168.2.200 这个IP 时,那么该封包的相关信息就会被写入到/var/log/messages


3.4.3 TCP, UDP 的规则比对:针对端口设定


--sport 端口范围:限制来源的端口口号码,端口口号码可以是连续的,例如1024:65535

--dport 端口口范围:限制目标的端口口号码。

联机进入本机port 21 的封包都抵挡掉:

iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP


--syn标志:将来自任何地方来源port 1:1023 的主动联机到本机端的1:1023 联机丢弃:

ptables -A INPUT -i eth0 -p tcp --sport1:1023 --dport 1:1023 –syn -j DROP

一般来说,client端启用的port 都是大于1024 以上的埠口,而server 端则是启用小于 1023 以下的埠口在监听的。所以我们可以让来自远程的小于 1023以下的端口口数据的主动联机都给他丢弃。不适用于ftp联机。


3.4.4 iptables 外挂模块:mac与state


iptables -A INPUT [-m state] [--state状态]:

-m:一些iptables的外挂模块,包括state,mac等。

--state :一些封包的状态,INVALID ,ESTABLISHED,NEW,RELATED(表示这个封包是与我们主机发送出去的封包有关)

只要已建立或相关封包就予以通过,只要是不合法封包就丢弃:

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

iptables -A INPUT -m state --state INVALID -j DROP


针对网卡来进行放行与防御:

针对局域网络内的aa:bb:cc:dd:ee:ff 主机开放其联机:

iptables -A INPUT -m mac --mac -source aa:bb:cc:dd:ee:ff -j ACCEPT

ps:通过ARP获取主机的mac地址,然后可以通过上述规则来将该主机DROP掉。无论其如何更改IP,除非他知道你是用网卡的mac来管理,否则无法透过修改IP而逃离到路由器外面。mac是不能跨路由。


3.4.5 ICMP封包规则的比对:针对是否响应ping来设计


很多ICMP 封包的类型都是为了要用来进行网络检测用的!所以最好不要将所有的ICMP 封包都丢弃!

iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT

--icmp-type :后面必须要接ICMP 的封包类型,也可以使用代号,例如8 代表echo request 的意思。

让0,3,4,11,12,14,16,18 的ICMP type 可以进入本机:

vim script_icmp:

#!/bin/bash

icmp_type="0 3 4 11 12 14 16 18"

for typeicmp in $icmp_type

do

   iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT

done

sh  script_icmp

这样能够开放部分的ICMP 封包格式进入本机进行网络检测的工作。如果主机作为区网的路由器,那么建议所有的ICMP封包都应该能通过。这是因为客户端检测网络时,常常会使用ping 来测试到路由器的线路是否畅通之故:-A INPUT -p icmp -j ACCEPT

                                                                                                                   ——Rango Chen