Linux上的常用的包过滤防火墙叫netfilter,是集成在内核上的,是使用iptables命令对它进行配置管理。
防火墙在做信息包过滤的时候,遵循一套规则,这些规则是存放在专用的信息过滤表中,而这些表都集成在Linux的内核中。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
1、iptables的结构

iptables  >> Tables(表) >>Chins(链) >>Rules(规则)。

iptables有3张表,分别是Filter表:过滤数据包,默认表;NAT表:网络地址转换(Network Address Translation);Mangle表:修改数据包,改变包头中内容(TTL, TOS,  MARK )。
1)、Filter表:过滤数据包,默认表,有INPUT链、OUTPUT链、FORWARD链。
(1)INPUT   链:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤)
(2)OUTPUT 链:过滤所有本机产生的数据包(对源地址得数据包的过滤)
(3)FORWARD链:过滤所有路过本机的数据包(源地址和目标地址都不是本机的数据包)
2)、NAT表:网络地址转换(Network Address Translation),有PREROUTING链、OUTPUT链和POSTROUTING链。
(1)PREROUTING链 :数据包到达防火墙时改变包的目的地址
(2)OUTPUT链:改变本地产生数据包的目标地址
(3)POSTROUTING链:在数据包离开防火墙时改变数据包的源地址
3)、Mangle表:修改数据包,改变包头中内容(TTL, TOS,  MARK )
(1)PREROUTING  链:数据包进入防火墙后,路由判断之前改变数据包
(2)POSTROUTING链:数据包确定了目标地址后,即路由判断前改变数据包
(3)OUTPUT链:在数据包被确定目的地址前改变数据包
(4)INPUT链:在数据包进入本机后,应用程序接受之前改变数据包
(5)FORWARD链:第一次路由判断之后,最后一次路由判断前改变数据包
IPTABLES中数据包和4种被跟踪连接的4种不同状态。
(1)NEW : 该包想要开始一个连接(重新连接或将连接重定向)
(2)RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。
--icmp-type  0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的
(3)ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。
2、iptables基本操作:
1)、启动iptables: service iptables start

# service iptables startiptables:应用防火墙规则:                                 [确定]

2)、关闭iptables: service iptables stop 

# service iptables stopiptables:将链设置为政策 ACCEPT:filter                    [确定]iptables:清除防火墙规则:                                 [确定]iptables:正在卸载模块:                                   [确定]

3)、重启iptables:service iptables restart

# service iptables restart iptables:将链设置为政策 ACCEPT:filter                    [确定]iptables:清除防火墙规则:                                 [确定]iptables:正在卸载模块:                                   [确定]iptables:应用防火墙规则:                                 [确定]

4)、查看iptables 状态:service iptables restart

# service iptables status 表格:filterChain 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

5)、保存iptables 配置:service iptables save

# service iptables saveiptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [确定]

6)、iptables服务配置文件:

/etc/sysconfig/iptables-config

7)、iptables规则保存文件:

/etc/sysconfig/iptables

3、iptables的命令及命令实例
1)、命令格式:

iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]

(1)、表名:filter(默认表)、nat、mangle。
(2)、常用的命令选项:

选项名                   功能及特点-A                在指定链的末尾添加(--append)一条新的规则-D                删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则-I                在指定链中插入(--insert)一条新的规则,默认在链的开头插入-R                修改、替换(--replace)指定链中的一条规则,按规则序号或内容确定-L                列出(--list)指定链中的所有的规则进行查看,默认列出表中所有链的内容-F                清空(--flush)指定链中的所有规则,默认清空表中所有链的内容-N                新建(--new-chain)一条用户自己定义的规则链-X                删除指定表中用户自定义的规则链(--delete-chain)-P                设置指定链的默认策略(--policy)-n                用数字形式(--numeric)显示输出结果,若显示主机的 IP地址而不是主机名-P                设置指定链的默认策略(--policy)-Z                清零计数器, 将所有的 chain 的计数与流量统计都归零-v                查看规则列表时显示详细(--verbose)的信息-V                查看iptables命令工具的版本(--Version)信息-h                查看命令帮助信息(--help)--line-number        查看规则列表时,同时显示规则在链中的顺序号

(3)、链名,这里默认用的表是filter,filter有3条链:

INPUT链 – 处理来自外部的数据。 OUTPUT链 – 处理向外发送的数据。 FORWARD链 – 将数据转发到本机的其他网卡设备上。

(4)、条件匹配:
条件匹配分为基本匹配和扩展匹配,拓展匹配又分为隐式扩展和显示扩展。
a)、基本匹配包括:

参数                             说明-p                        指定规则协议,如tcp, udp,icmp等,可以使用all来指定所有协议-s                        指定数据包的源地址参数,可以使IP地址、网络地址、主机名-d                        指定目的地址-i                        输入接口-o                        输出接口

b)、隐式扩展

扩展条件        需包含        扩展项               说明-m tcp         -p tcp         --sport             源端口                               --doprt              目标端口                              --tcp-flages        (SYN,ACK,RST,FIN,SYN)                              --syn                第一次握手                              -m udp         -p upd          --sport             源端口                               --dport             目标端口                               -m icmp          -p icmp        --icmp-type         8:echo-request 0:recho-reply

c)、常用显示扩展

扩展条件        扩展项                     说明-m state        --state        用于实现连接状态检测 NEW,ESTABLISHED,RELATED,INVALID-m multiport      --source-port            多个源端口                --destination-port        多个目的端口                --port                    源和目的端口                -m limit        --limit        速率(如5/minute  表示每分钟5个数据包)                --limit-burst        峰值速率(如100 最大不能超过100个数据包)                -m iprange        --src-range ip-ip         源ip范围                --dst-range ip-ip          目的ip范围                -m mac          -mac-source             Mac地址限制-m string        --algo [bm|bkp]        匹配算法                 --string “Pattern”        要匹配的字符串                   -m recent        --name           设定列表名称,默认为DEFAULT                  --rsoure         源地址,此为默认                  --rdest         目的地址                  --set            添加源地址的包到列表中                  --update        每次建立连接都更新列表                   --rcheck        检查地址是否在列表中                   --seconds        指定时间内,必须与—rcheck或—update同时使用                  --hitcount        命中次数,必须与—rcheck或-- update同时使用                   --remove           在列表中删除相应地址

(5)、目标值 –j 
数据包控制的方式包括以下几种:

ACCEPT:允许数据包通过。 DROP:直接丢弃数据包,不给出任何回应信息。 REJECT:拒绝数据包通过,必须时会给数据发送端一个响应信息。 LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。 QUEUE:防火墙将数据包移交到用户空间 RETURN:防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)

常用命令实例:
1)、删除iptables 所有的规则:iptables –F

# iptables –F

2)、查看iptables 的规则:iptables –nvL

# iptables -nvLChain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination             7   488 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED     0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0               0     0 ACCEPT     all  --  lo     *       0.0.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     0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination             0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 6 packets, 712 bytes)pkts bytes target     prot opt in     out     source               destination

参数-nvL,n表示不用主机名或者域名查看,v表示查看详细的信息,L表示查看。这是常用的选项。

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)这表示INPUT链,默认策略(policy)是 接受、允许的,0 packets,表示匹配到有多少数据包; 0 bytes表示匹配到有多少数据量。pkts bytes target     prot opt in     out     source               destination         这一行分别表示:匹配的数据包、匹配的数据量、目标值(ACCEPT/DORP/REJUCE)、端口号、选项、INPUT接口(网卡)、OUTPUT接口(网卡)、源地址、目的地址。

3)、增加一条规则都最后使用 –A 参数

# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT

-A参数是把规则增加到现有规则的最后面,这里是开放80端口的web服务,假如前面有一条规则默认是拒绝了所有的连接,那么我们增加的这条规则是不能生效执行的。

4)、插入一条规则到第一行,使用-I 参数

# iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT

我们用-I 参数把规则插入到第一行,防火墙最先匹配到的规则就是它,符合规则就按照目标值执行。

5)、指定删除一条规则,用-D参数,后跟序号,先用iptables -nvL --line-numbers查看序号

# iptables -D INPUT 7# iptables -nvLChain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination             7   994 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80   438 33144 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED     0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0               0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0               2   852 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22    37  2762 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination             0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 4 packets, 432 bytes)pkts bytes target     prot opt in     out     source               destination

  

6)、修改一条规则,使用-R参数。

# iptables -R INPUT 1 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

7)、修改默认策略,使用-P 参数。

# iptables -P INPUT DROP

8)、运行远程主机进行SSH连接,使用INPUT和OUTPUT。

# iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT# iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT

这里用到INPUT链和OUTPUT链,这里涉及到TCP/IP的三次握手,建立连接的过程。

9)、拒绝ICMP包回响。使用  -p icmp --icmp-type 8

# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
# iptables -nvLChain INPUT (policy DROP 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination             4   240 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8    18  5091 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 state NEW,ESTABLISHED 1352  104K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED     1    60 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0               0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0               2   852 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22   286 24021 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited     0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22 state NEW,ESTABLISHED Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination             0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 12 packets, 964 bytes)pkts bytes target     prot opt in     out     source               destination         0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            0.0.0.0/0           tcp dpt:22 state ESTABLISHED

可以通过iptables –nvL查看iptables里面的规则,在pkts 和bytes已经匹配到了拒绝的数据包。

10)、一些常用的命令:

iptables –nvL:查看所有的规则iptables -F :清除所有的已订定的规则;iptables -X :清除所有使用者 "自定义" 的 chain (应该说的是 tables );iptables -Z :将所有的 chain 的计数与流量统计都归零(pkts 和bytes下面的数字)iptables-save:查看防火墙的所有规则service iptables save 保存iptables 规则。文件保存到/etc/sysconfig/iptables

配置一个NAT表的防火墙
查看本机关于NAT的设置情况: iptable –t nat –nvL

# iptables -t nat -nvLChain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination         Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination

假设现在有网卡eth0和eth1,其中eth0的ip为192.168.171.128,eth1 的ip 为202.96.128.22,eth1已经连接到了互联网,eth0和另外一台设备192.168.171.100是互通的,但是没有连接到互联网。现在需要用iptables的nat 功能连接互联网。
配置nat表用到了POSTROUTING链,更改数据包的源地址和源端口为能够连接到互联网的地址和端口。
1)、打开转发功能
修改 /etc/sysctl.conf文件文件内的net.ipvr.ip_forward=0这一行修改为net.ipvr.ip_forward=1.
可以使用vim 编辑处理,也 可以这样处理:

echo "1" > /proc/sys/net/ipv4/ip_forward

如果是编辑/etc/sysctl.conf文件修改,使用如下命令执行生效

sysctl -p /etc/sysctl.conf

配置转发:

# iptables -t nat -A POSTROUTING -s 192.168.171.0/24 -o eth1 -j MASQUERADE

-t 后面接的nat表,-A 是增加到POSTROUTING 链上的规则,-s 表示来源的地址,-O 表示 出口的网卡接口,-j 表示执行的动作,这里是隐藏,伪装的意思。