前言:公司网关为一台linux服务器,文中均为实例! 一、概述 1、Linux的防火墙体系工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙。 2、种类:netfilter和ipt
前言:公司网关为一台linux服务器,文中均为实例!
一、概述
1、Linux的防火墙体系工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙。
2、种类:netfilter和iptables通常都可以用来指Linux防火墙,但二者区别如下:
Netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”的防火墙功能体系,使用较少。 Iptables:指的是管理Linux防火墙的命令工具,程序通常位于/sbin/iptables,由用户直接使用,属于“用户态”的防火墙功能体系,通常使用的就是这个。
3、规则表(见图1.1)
Filter表:包含三个规则链:INPUT、FORWARD、OUTPUT Filter表主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包。 Filter表对应的内核模块为iptable_filter。
Nat表:包含三个规则链:PREROUTING、POSRTOUING、OUTPUT Nat表主要用于修改数据包的IP地址,端口号等信息。 Nat表对应的内核模块为iptable_nat
Mangle表:包含五个规则链:、PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD Mangle表主要用于修改数据包的TOS、TTL、以及为数据包设置Mark标记,以实现Qos调整及策略路由等应用。 Mangle表对应的内核模块为iptable_mangle
Raw表:包含两条规则链:OUTPUT、PREROUTING Raw表是iptables新增加的表,主要用于决定数据包是否被状态跟踪机制处理。 Raw表对应的内核模块为iptable_raw
4、规则链
INPUT链:当接收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。 OUTPUT链:当防火墙向外发送数据包(出站)时,应用此链中的规则。 FORWARD链:当接受到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链接中的规则。 PREROUTING链:在对数据包作路由现在之前,应用此链中的规则。 POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则。 注:其中INPUT、OUTPUT链更多应用在访问本机的进出数据的安全控制中,而FORWARD、PREROUTING、POSTROUING更多应用在当使用linux做网关的时候。
二、工作原理
首先我们需要了解当使用iptables作网关时,数据包的主要途径。
Iptables的大体结构如下图1.2所示,这个图是数据包流经iptables的路径图。
假如数据包A流经这个网关,首先进入PREROUTING链,顺序匹配这里的规则(包括默认规则);从这里开始需要分支:
如果这个数据包A是发给LOCALHOST本机的(也就是网关本身),那么数据包A的下一站是INPUT链,同样顺序匹配这里的规则(包括默认规则),然后进去LOCALHOST本地进程进行处理这个数据包A;处理完成后需要回应数据包A,LOCALHOST发出的数据包B第一站是OUTPUT,然后进入POSTROUTING,从而离开网关服务器。
如果这个数据包A不是发给LOC ALHOST,那么数据包A的下一站是FORWARD,顺序匹配这里的规则;然后数据包A的下一站是POSTROUTING,从而数据包A离开网关服务器; 在这个过程中,数据包A每次经过一个链,都会顺序匹配这个链的规则,所以数据在每一个链中都有可能被丢掉。
三、管理设置iptables
1、基本语法
Iptables [-t 表命] 命令选项 [链名] [匹配条件] [-j 动作] 表名、链名用于指定iptables命令所操作的表和链,没有指定的话,默认使用filter表; 命令选项用于指定管理iptables规则的方式,比如插入,删除,增加,查看; 条件匹配用于指定对符合什么样条件的数据包进行处理; 动作指的就是对数据包的动作,如转发、丢弃、拒绝。
2、命令选项
-A 在指定链的末尾添加一条新的规则 -D 删除指定链中的某一条规则,按规则序号或内容确定要删除的规则 -I 在指定链中插入一条新的规则,若未指定插入位置,则默认在链的开头插入 -R 修改、替换指定链中的某一条规则,按规则序号或内容确定要替换的规则 -L 列出指定链中所有的规则进行查看,未指定链名,则列出表中所有的链 -F 清空指定链中的的所有规则,未指定链名,则清空表中所有链的规则 -N 新建一条用户自己定义的规则链 -X 删除指定表中用户自定义的规则链 -P 设置指定链的默认策略 -n 使用数字形式显示输出结果 -v 查看规则烈表示显示详细的信息 -V 查看iptables命令工具的版本信息 -h 查看命令帮助信息
四、网关实例
1、如下图1.3,client-a的ip地址为192.168.150.10/24,网关为192.168.150.254和client-b址为 192.168.150.254/24,网关gw的第二块网卡eth1的ip地址为192.168.20.254/24, client-a需要通过网关gw访问client-b,做法如下:
打开linux系统的路由转发开关
[root@extmail ~]# cat /proc/sys/net/ipv4/ip_forward 0 [root@extmail ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@extmail ~]# cat /proc/sys/net/ipv4/ip_forward 1 [root@extmail ~]#sysctl -p
我们在client-a上测试一下,如下图1.4所示,
然后我们在client-b上进行抓包看看,如下图1.5
通过ping和抓包证明,只要在网关上开启路由转发之后,两个不同网段就可以相互通信了。
2、当linux作为网关的时候,nat也是较常用到的,实例如下:
现在公司网络大部分都是通过nat上网的,所谓nat,简单来讲就是将私网地址转换成公网地址,从而使用户能够访问Internet,大大节省了公网IP。
测试:环境如图1.3相同,我们把client-a所有出去的包的源地址都转换成网关的外网地址,也就是192.168.20.254,在网关上执行如下命令:
[root@extmail ~]# iptables -t nat -A POSTROUTING -s 192.168.150.0/24 -j SNAT --to \192.168.20.254
查看下Iptables的状态如图1.6
Iptables 网关上设置之后,我们在用client-a ping client-b ,网络依旧是畅通的图1.7
并且我们在client-b上抓包,如图1.8
尽管client-a(192.168.150.10)一直在ping client-b ,但是我们在client-b上并没有抓到任何client-a的数据包。我们抓下client-b上icmp的数据包如图1.9
我们看到所有的ping的数据包都是来自192.168.20.254了,这就是nat,准确的说是snat,实现了对源地址的转换,对外只是一个IP,既保护了内网,又节约了IP。
五、结论
使用Linux结合Iptables作为网关时,实际上就相当于一台单臂路由器,把各个网络节点打通,在根据不同的需求写入不同的策略,既方便又安全。