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


上一篇:Centos 6让SVN提交文件自动更新到nginx的WEB目录


下一篇:自动安装linux