iptables 防火墙策略 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

防火墙是指在内部网和外网之间,专业网和公共网之间的界面上构造的保护屏障,使 INTERNET INTERNET 之间建立一个安全网关,从而保护内部网络免受非法***,防火墙主要由服务访问规则,验证工具,包过滤和应用网关 4 个部分。

现在有两种功能的防火墙:

包过滤防火墙,该防火墙工作网络层,在 linux 系统下包过滤是内建于 linux 内核路由功能至上的防火墙类型,具体的讲它针对每一个数据报的报头,按照包过滤规则进行判断,与规则相匹配的包浆依照路由信息继续转发,否则就丢弃。数据包过滤是通过对数据包的 IP 头和 TCP 头或 UDP 头的检查来实现的。

代理防火墙,也叫应用层的网关防火墙( Application Gateway )这种防火墙通过一种代理( Proxy )技术参与到一个 TCP 连接的全过程。从内部发出的数据包经过这样的防火墙处理后,就好像是源于防火墙外部网卡一样,从而可以达到隐藏内部网结构的作用。可以改变数据包的 ip 信息。

 

代理防火墙非常安全但是效率较低,所以现在一般把上述两种防火墙一起使用。主机发送信息,先经过包过滤防火墙,检查成功后在把包发给网关防火墙,若不成功直接将包丢弃。

 

典型的防火墙设置有两种网卡:一个流入,一个流出。 iptables 读取流入和流出数据包的报头,将它们与设定规则相比较,将可接受的数据包从一个网卡转发至另一个网卡,对被拒绝的数据包,可以丢弃或按照所定义的方式来处理。

现在我们学习使用 iptables 命令

Neitfiler Framework/iptables

Neitfiler Framework 是网络控制框架, iptables 是规则,防火墙布过滤数据,依靠规则过滤, iptables 放在防火墙上二者结合使用。

iptables 命令的格式是

#iptables –t table COMMAND  Chains[num]  match condition  –j action

-t table 先指定表 (注:若不指定默认为 filter 过滤表); command chains 再指定链与相应的参数; match conditions 做命令匹配条件; -j cation 指定动作(可以不指)

 

首先我们要理解 iptables 的五个内置默认键;即五个链,

1.INPUT  进入过滤点

2.OUTPUT  出去过滤点

3.FORWARD  转发过滤点,

4.PREROUTING  路由前过滤点,
5.POSTROUTING    路由后过滤点,
 

table:表(功能)

1.          filter 过滤功能   (可以经过 INPUT, FORWARD, OUTPUT

2.          nat 端口地址转换 SNAT 源地址转换; DNAT 目的地址转换)

nat 和路由一样都做地址转换,但是 nat 改变源地址,路由不改变。(可以经过 OUTPUT, PREROUTING, POSTROUTING

3.                   mangle 改变数据特征,与路由没有关系,优先级高,当有多个功能表时,优先 ( 全部点都能经过 )

4.                   raw

下面开始匹配规则

匹配规则可以分为通用匹配和扩展匹配,扩展匹配又可以分为隐式扩展和显示扩展

1.     通用匹配

-p 指定协议   -P { tcp udp icmp}

-s 匹配原地址

-d 匹配目的地址

-i   指定数据包从哪个网卡接口进来的 若是防火墙多网卡指定 in_interface

-o 指定数据包通过哪个网卡接口出去

2 .扩展匹配

1 隐含扩展

基于 tcp

--dport 匹配目标端口

--sport 匹配源端口

--tcp-flags 标示位

--syn  = --tcp-flags SYN,RST,ACK,FIN,SYN

基于 udp

--dport

--sport

基于 icmp –icmp-type

8 ping 请求 echo-request

0 响应 echo-reply

3 目标不可达 destination unreachable

2 显示扩展   -m

-m state –state

-m multiport –limit

-m string –string 字符串匹配

-j

DROP 丢弃

REJECT 明确拒绝

ACCEPT 允许通过

SNAT 源地址转换 –j SNAT –to-source IP

DNAT 目的地址转换   -j DNAT –to-dest IP

LOG 记入日志

MASQERADE 地址伪装

 

Rules 对规则管理

-A 添加一条新规则 在链的尾部追加

-I n 插入一条新规则,如不指明行数默认为插入第一行,指明行数为插入为第几行

-R n 修改第 n 条规则

-D n 删除第 n 也可不指行数指明特征与动作

 

Chains 对链的管理

-F 清空一条链 若不指明链则默认为把表中的链全部清空

-P 默认处理动作,默认策略

-N 用户自定义生成一条新的规则链

-X 删除用户自定义的空链

-E 把用户自定的名字重命名

-Z  清零 zero

 

Show 查看 iptables 规则

-L 查看某条链中的所有规则

 -L 有子命令: –n 不做名称解析; –v 显示详细信息; –x 不做单位换算,直接显示精确值; –line-numbers 给规则编号

#iptables –t filter –nvL –line-numbers

-S 打印指定链中的规则

 

下面我们做几个小实验 练习一下 iptables 命令

1.          现有主机 192.168.0.71 不允许 192.168.0.40ping 本机

[root@station71 ~]# iptables -t filter -A INPUT -s 192.168.0.40 -d 192.168.0.71 -p icmp --icmp-type 8 -j DROP

指定表为过滤表,在目的地址 INPUT      DROP 掉源主机 0.40 向目的主机的 0.71 发出的 ping

测验一下

[root@station40 ~]# ping 192.168.0.71

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /> PING 192.168.0.71 (192.168.0.71) 56(84) bytes of data.

[root@station71 ~]# ping 192.168.0.40

PING 192.168.0.40 (192.168.0.40) 56(84) bytes of data.

64 bytes from 192.168.0.40: icmp_seq=1 ttl=64 time=1.80 ms

该规则也可以写为

[root@station71 ~]# iptables -A OUTPUT -s 192.168.0.71 -d 192.168.0.40 -p icmp --icmp-type 0 -j DROP

不允许本机响应 0.40 主机,响应数据出去当然在 OUTPUT 处过滤(因为默认表是 filter ,若表为 filter 时,则可不指明)

2 现在让 0.71 也不能 ping 0.40

[root@station71 ~]# iptables -A OUTPUT -s 192.168.0.71 -d 192.168.0.40 -p icmp --icmp-type 8 -j REJECT

验证 ping 0.40

From 192.168.0.71 icmp_seq=1 Destination Port Unreachable

From 192.168.0.71 icmp_seq=1 Destination Port Unreachable

From 192.168.0.71 icmp_seq=1 Destination Port Unreachable

From 192.168.0.71 icmp_seq=1 Destination Port Unreachable

 

--- 192.168.0.40 ping statistics ---

0 packets transmitted, 0 received, +14651 errors

当然该规则也可以写成

[root@station71 ~]# iptables -A INPUT -s 192.168.0.40 -d 192.168.0.71 -p icmp --icmp-type 0 -j REJECT

2 不允许 0.40ssh 访问本机 0.71 ssh 22 端口)

[root@station40 ~]# ssh root@192.168.0.71

root@192.168.0.71's password:

Last login: Fri Feb 26 16:25:29 2010

[root@station71 ~]#

现在写一个规则

[root@station71 ~]# iptables -A INPUT -s 192.168.0.40 -d 192.168.0.71 -p tcp --dport 22 -j DROP

再次登录就发现不 ssh0.71

3 要求只让 0. 段内的主机 ssh 连接 0.71 主机, 0.71 主机也有且只能能 ssh0 网段内的任一主机

先清空下 iptables 规则,定义规则 0 网段可以访问 71 主机

 

[root@station71 ~]# iptables -F

[root@station71 ~]# iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.71 -p tcp --dport 22 -j ACCEPT

定义规则 0.71 可以通过本机 22 端口 ssh0.0 网段内的任一主机 ( 注意端口为源端口 )

 [root@station71 ~]# iptables -A OUTPUT -s 192.168.0.71 -d 192.168.0.0/24 -p tcp --sport 22  -j ACCEPT

iptables –L 一下会看到链 INPUT ,FORWARD,OUTPUT 后都有( policy ACCEPT )它表示若是找不到匹配规则,则默认为 ACCEPT ,所以我们还要对 0 网段以外的网段做拒绝规则,忘了没有 -P 是修改规则的默认策略

[root@station71 ~]# iptables -t filter -P INPUT DROP

[root@station71 ~]# iptables -t filter -P OUTPUT DROP

[root@station71 ~]# iptables -t filter -P FORWARD DROP

但是大家发现没有上述策略中 71 主机就不能 ping 通自己了

所以我们再给它加两天规则

[root@station71 ~]# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

[root@station71 ~]# iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

现在大家想一个问题,我们把 PORWARD 也该为了默认 DROP ,但是现在为什么不给 PORWARD 也做一个类似上面两个的策略呢?对了,因为 PORWARD    数据转发过滤点, ping 命令过滤就不经过这一过滤点   。测验一下吧

4 现在有一个防火墙的外网网关像外部声称有 web 服务器,实际没有当有外网主机访问 web 服务器时,它就做转发到内网 web 服务器上现在我们写下这个地址转换

 

 
这是外网访问内网是做目的地址转换

用三台虚拟机一台模拟内网,一台模拟外网,一台加一块网卡模拟防火墙

在防火墙主机上配置路由

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

sysctl –p  执行命令使路由生效

cat /proc/sys/net/ipv4/ip_forward

1                   出现 1 为配置正确

让外网和内网的主机分别指向其相对的防火墙网卡

[root@station10~]#iptables -t nat -A PREROUTING -s 192.168.10.0/24 -d 192.168.10.10 -p tcp --dport 80 -j DNAT --to-dest 192.168.100.101 现在条件改变,若是外网存在 web 服务器,现在想内网主机访问外网服务器

[root@station10~]#iptables -t nat -A POSTOUTING -s 192.168.100.0/24 -d 192.168.10.0/24 -p tcp --sport 80 -j SNAT --to-source 192.168.10.10