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 �Ct table COMMAND Chains[num] match condition �Cj 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 �Cicmp-type
8 ping
请求
echo-request
0
响应
echo-reply
3
目标不可达
destination unreachable
2
显示扩展
-m
-m state �Cstate
-m multiport �Climit
-m string �Cstring
字符串匹配
-j
DROP
丢弃
REJECT
明确拒绝
ACCEPT
允许通过
SNAT
源地址转换
�Cj SNAT �Cto-source IP
DNAT
目的地址转换
-j DNAT �Cto-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
有子命令:
�Cn
不做名称解析;
�Cv
显示详细信息;
�Cx
不做单位换算,直接显示精确值;
�Cline-numbers
给规则编号
#iptables �Ct filter �CnvL �Cline-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
也不能
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
端口)
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 �CL
一下会看到链
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 �Cp
执行命令使路由生效
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