认识防火墙
防火墙为透过指定一些顺序的规则,并管制进入到我们网域内的主机数据包的一种机制,更广义的来说,只要能够分析与过滤进出我们管理之网域的封包数据,就可以称为防火墙
所以鸟哥认为,防火墙最重要的任务就是在规划出:
- 切割被信任(如子域)与不被信任(如 Internet)的网段;
- 划分出可提供 Internet 的服务与必须受保护的服务;
- 分析出可接受与不可接受的封包状态;
Linux系统上防火墙的主要类别
根据管理的范围,可以将防火墙区分为网域型与单一主机型的控管。
- 网域型,此类防火墙都是当做路由器的角色,因此类型主要则有封包过滤的Netfilter与利用代理服务器(proxy server)进行存取代理的方式。
- 单一主机型,主要的有包过滤型的Netfilter与依据服务软件程序作为分析的TVP Wrappers两种。
- Netfilter(封包过滤机制)
所谓的封包过滤,即分析进入主机的网络封包,将封包的表头数据捉出来进行分析,已决定该联机行是放行还是抵挡。由于这种方式可以直接分析封包表头数据,所以包括硬件地址(MAC), 软件地址 (IP), TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,因此用途非常的广泛。
在Linux中我们使用核心内建的Netfilter这个机制,而Netfilter提供了iptables这个软件作为封包过滤的指令。由于是核心内建的功能,因此他的效率非常的高。 - TCP Wrappers(程序控管)
该方法是通过服务器的程序的外挂(tcpd)来处理的,这种机制主要是分析谁对某程序进行存取,然后透过规则去分析该服务器程序能否联机。由于是通过分析服务器程序来控管的,因此与启动的端口无关,只与程序的名称有关 - Proxy(代理服务器)当用户client想取得服务器的数据时,他的流程是这样的:
- client会向Proxy server要求数据,请Proxy帮忙处理
- Proxy可以分析使用者的IP来源是否合法,取得的数据是否合法,如果合法的话,会帮助client取得数据
- Server所回传的数据则给Proxy Server
- 最后Proxy server将数据回传给client
这样做的好处是client甚至不需要有public IP,当有人攻击client时,必须先攻破Proxy server
TCP Wrappers
该防火墙主要通过两个文件来设定
/etc/hosts.allow
和/etc/hosts.deny
<service(program_name)> : <IP, domain, hostname>
<服务 (亦即程序名称)> : <IP 或领域 或主机名>
# 上头的 > < 是不存在于配置文件中的喔!
而改规则的顺序为:
先以allow为优先对比,符合该规则就予以放行
- 再以deny对比,符合规则予以抵挡
- 若都不在,即都不符合,最终予以放行
Linux 封包过滤软件:iptables
不同Linux核心版本的防火墙软件
- Version2.0:使用ipfwadm
- Version2.2:使用ipchains
Version2.4,2.6:使用iptables这个防火墙机制
规则顺序
根据封包的分析资料 “比对” 你预先定义的规则内容, 若封包数据与规则内容相同则进行相应的动作,否则就继续下一条规则的比对。当一个数据包若符合第一条规则Rule01则此时这个网络封包就会进行Action 1的动作,而不会理会后续的Rule2,Rule3….
因此规则顺序十分重要iptables的表格(table)与链(chain)
iptables之所以为table,是因为其拥有很多的chain,而一条chain代表针对某个情况的一列规则。在预设的情况下, Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用)。
filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table 喔!
- INPUT:主要与想要进入我们 Linux 本机的封包有关;
- OUTPUT:主要与我们 Linux 本机所要送出的封包有关;
- FORWARD:这个咚咚与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与下列 nat table 相关性较高。
- nat (地址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关。
- PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
- POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
- OUTPUT:与发送出去的封包有关
- mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环境当中,较少使用 mangle 这个表格。
本机的iptables语法
规则的观察与清除
[root@www ~]# iptables [-t tables] [-L] [-nv]
选项与参数:
-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L :列出目前的 table 的规则
-n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
范例:列出 filter table 三条链的规则
[root@www ~]# iptables -L -n
Chain INPUT (policy ACCEPT) <==针对 INPUT 链,且预设政策为可接受
target prot opt source destination <==说明栏
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED <==第 1 条规则
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第 2 条规则
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 <==第 3 条规则
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 <==以下类推
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT) <==针对 FORWARD 链,且预设政策为可接受
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) <==针对 OUTPUT 链,且预设政策为可接受
target prot opt source destination
范例:列出 nat table 三条链的规则
[root@www ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
定义预设政策
。[root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
选项与参数: -P :定义政策( Policy )。注意,这个 P 为大写啊!
ACCEPT :该封包可接受
DROP :该封包直接丢弃,不会让 client 端知道为何被丢弃。
范例:将本机的 INPUT 设定为 DROP ,其他设定为 ACCEPT
[root@www ~]# iptables -P INPUT DROP
[root@www ~]# iptables -P OUTPUT ACCEPT
[root@www ~]# iptables -P FORWARD ACCEPT
[root@www ~]# iptables-save
# Generated by iptables-save v1.4.7 on Fri Jul 22 15:56:34 2011 *filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Fri Jul 22 15:56:34 2011
# 由于 INPUT 设定为 DROP 而又尚未有任何规则,所以上面的输出结果显示:
# 所有的封包都无法进入你的主机!是不通的防火墙设定!(网络联机是双向的
# iptables -A INPUT -p TCP -i eth0 --dport 21 --sport 1024:65534 -j ACCEPT # FTP
# iptables -A INPUT -p TCP -i eth0 --dport 22 --sport 1024:65534 -j ACCEPT # SSH
# iptables -A INPUT -p TCP -i eth0 --dport 25 --sport 1024:65534 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i eth0 --dport 53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i eth0 --dport 53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i eth0 --dport 80 --sport 1024:65534 -j ACCEPT # WWW
# iptables -A INPUT -p TCP -i eth0 --dport 110 --sport 1024:65534 -j ACCEPT # POP3
# iptables -A INPUT -p TCP -i eth0 --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS