1.基础概念。
防火墙,其实说白了讲,用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。
对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。
2.Iptables 基础知识
1)规则 – 用于确定要匹配的封包和目标的标准,或用于确定如何处理这些封包的操作。
2)链 – 规则列表,将按顺序检查,第一个匹配生效。
3)策略 – 如果在内置链中没有规则匹配,将执行的默认操作, ACCEPT 或 DROP 。
4)表 – 用于特定目的的链集合: filter 用于阻止通信, nat 用于修改封包的目标或表面源。
3.目标(当封包匹配规则时,要采用的操作)
1)ACCEPT (接受) – 封包通过链
2)DROP (丢弃) – 封包被丢弃,如同其从未出现
3)REJECT (拒绝) - 封包被拒,并且防火墙发送错误消息(默认情况下是 ICMP 端口不可到达息)
4)LOG (记录) - 关于封包的信息记录到系统日志;继续检查链中的下一项规则
4.Netfilter 的表和链
4.1链
PREROUTING:在进行路由选择前处理数据包
INPUT:处理入站的数据包
OUTPUT:处理出站的数据包
FORWARD:处理转发的数据包
POSTROUTING:在进行路由选择后处理数据包
4.2表
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源、目标IP地址或端口
filter表:确定是否放行该数据包(过滤)
规则表的先后顺序:raw→mangle→nat→filter
4.3规则链的先后顺序:
入站顺序:PREROUTING→INPUT
出站顺序:OUTPUT→POSTROUTING
转发顺序:PREROUTING→FORWARD→POSTROUTING
4.4还有三点注意事项:
1).没有指定规则表则默认指filter表。
2).不指定规则链则指表内所有的规则链。
3).在规则链中匹配规则时会依次检查,匹配即停止(LOG规则例外),若没匹配项则按链的默认状态处理。
5.iptables 命令
1)iptables 用于设置或查看内核内存中的规则。
iptables 选项 定义
-F 从链中删除所有规则
-vnL --line-numbers 在数字模式下,完整地列出所有规则
-A CHAIN <rule> -j <target> 将规则添加到链的末尾
-I CHAIN # <rule> -j <target> 将规则作为规则 # 插入链;如果没有 # ,则作为第一个规则
-D CHAIN # 将规则 #从链中删除
-P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
示例:
# iptables -vnL --line-numbers
# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
# iptables -I INPUT 1 -s 192.168.0.233 -j REJECT
# iptables -D INPUT 1
# iptables -F INPUT 清空
/etc/init.d/iptables save 将修改后的策略保存到/etc/sysconfig/iptables
2)自定义链名
iptables -N redhat:添加自定义链名
iptables -D redhat 1:删除自定义链下的策略
iptables -X redhat:删除自定义链
iptables -A INPUT -s !192.168.0.4 -p tcp --dport 23 -j REJECT:只有4可以连接
2)规则(匹配标准)语法
iptables 规则包括匹配标准,可以与在封包中找到的标题信息进行比较。
概念 指令
源IP 或网络 -s 192.168.0.0/24
目标IP 或网络 -d 10.0.0.1
UDP/TCP 和端口 -p udp --sport 68 --dport 67
ICMP 和类型 -p icmp --icmp-type echo-reply
入站网络接口 -i eth0
出站网络接口 -o eth0
连接跟踪 -m state --state ESTABLISHED,RELATED
示例:
# iptables -A FORWARD -s 192.0.2.0/24 -d 10.0.0.1 -j DROP
# iptables -A FORWARD -p udp --sport 68 --dport 67 -j ACCEPT
# iptables -A FORWARD -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
连接跟踪存储关于之前看到的通信消息,以做出匹配决定。允许连接后,信息放置在连接跟踪表中,直至超时、连接关闭或看到更多匹配的通信(重要计时器)。尽管这需要更多的内核内存,但是好处在于可以简化规则设计。
状态 定义
NEW 封包开始新通信,将规则添加到连接跟踪表
ESTABLISHED 与连接跟踪表中的规则匹配的任一封包
RELATED 在某种程度上与 ESTABLISHED 通信“相关”的通信 ;如 FTP 等协议
INVALID 无法确定的封包;通常,这些封包应被拒绝或丢弃
注意:
为使 RELATED 规则起作用,您可能需要在 /etc/sysconfig/iptables-config 中启用相应的程序模块。
运行 iptables 命令更改内存中的 netfilter 内核模块规则,但如果重新引导,则不会持续。
运行 service iptables save 将采用内存中的当前规则,并将其写入 /etc/sysconfig/iptables 。
示例:
# modprobe nf_conntrack_ftp
# modprobe nf_conntrack_tftp
# iptables -F
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -m state --state NEW -p tcp --dport 69 -j ACCEPT
# iptables -A INPUT -m state --state NEW,INVALID -j DROP
注意:如果不加载相应的内核模块,那么跟踪状态将不法生效。
6.永久生效:
1. 编辑文件: /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp nf_conntrack_tftp"
2. 保存策略:
# service iptables save
3. 开机自启:
# chkconfig iptables on
注意:在实际环境中更推荐把所有策略保存到自定义脚本中,并把脚本加入 /etc/rc.local 实现开机自启。
7.完整配置
# 1.删除现有规则 iptables -F # 2.配置默认链策略 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # 3.允许远程主机进行SSH连接 iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 4.允许本地主机进行SSH连接 iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 5.允许HTTP请求 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
总结
Iptables是一个非常重要的工具,它是每一个防火墙上几乎必备的设置,也是我们在做大型网络的时候,为了很多原因而必须要设置的。学好Iptables,可以让我们对整个网络的结构有一个比较深刻的了解,同时,我们还能够将内核空间中数据的走向以及linux的安全给掌握的非常透彻。我们在学习的时候,尽量能结合着各种各样的项目,实验来完成,这样对你加深iptables的配置,以及各种技巧有非常大的帮助。
本文转自willis_sun 51CTO博客,原文链接:http://blog.51cto.com/willis/1854212,如需转载请自行联系原作者