iptables防火墙策略
防火墙是指在内部网和外网之间,专业网和公共网之间的界面上构造的保护屏障,使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
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 也不能ping0.40
[root@station71 ~]# iptables -A OUTPUT -s 192.168.0.71 -d 192.168.0.40 -p icmp --icmp-type 8 -j REJECT
验证ping0.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.71ssh 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