Linux 下的(防火墙)iptables

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

[root@balichlinux ~]# service iptables start ……………………………启动iptables .

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

[root@balichlinux ~]#

2)、关闭iptables: service iptables stop

[root@balichlinux ~]# service iptables stop ………………………………关闭iptables

iptables:将链设置为政策 ACCEPT:filter                    [确定]

iptables:清除防火墙规则:                                 [确定]

iptables:正在卸载模块:                                   [确定]

[root@balichlinux ~]#

3)、重启iptables:service iptables restart

[root@balichlinux ~]# service iptables restart ……………………………………… 重启iptables

iptables:将链设置为政策 ACCEPT:filter                    [确定]

iptables:清除防火墙规则:                                 [确定]

iptables:正在卸载模块:                                   [确定]

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

[root@balichlinux ~]#

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

[root@balichlinux ~]# service iptables status …………………………………查看iptables 状态

表格: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@balichlinux ~]#

5)、保存iptables 配置:

[root@balichlinux ~]# service iptables save ……………………………………保存iptables 配置

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

[root@balichlinux ~]#

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

[root@balichlinux ~]# iptables –F  ……………………清空iptables

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

root@balichlinux ~]# iptables -nvL

Chain 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

[root@balichlinux ~]#

参数-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 参数

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

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

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

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

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

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

[root@balichlinux ~]# iptables -D INPUT 7 ………………………………………删除第7条规则。

[root@balichlinux ~]# iptables -nvL

Chain 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

[root@balichlinux ~]#

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

[root@balichlinux ~]# iptables -R INPUT 1 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

[root@balichlinux ~]#

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

[root@balichlinux ~]# iptables -P INPUT DROP ………………设置INPUT链默认策略为DROP

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

[root@balichlinux ~]# iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

[root@balichlinux ~]# 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 …………………

[root@balichlinux ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP

[root@balichlinux ~]# iptables -nvL

Chain 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

[root@balichlinux ~]# iptables -t nat -nvL

Chain 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

[root@balichlinux ~]#

假设现在有网卡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  使其生效。

配置转发:

[root@balichlinux ~]# iptables -t nat -A POSTROUTING -s 192.168.171.0/24 -o eth1 -j MASQUERADE

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

本文转自 巴利奇 51CTO博客,原文链接:http://blog.51cto.com/balich/1745244

上一篇:ISA防火墙在中小型企业中的综合应用(下)
下一篇:linux防火墙简介