认识防火墙

防火墙为透过指定一些顺序的规则,并管制进入到我们网域内的主机数据包的一种机制,更广义的来说,只要能够分析与过滤进出我们管理之网域的封包数据,就可以称为防火墙
所以鸟哥认为,防火墙最重要的任务就是在规划出:

  • 切割被信任(如子域)与不被信任(如 Internet)的网段;
  • 划分出可提供 Internet 的服务与必须受保护的服务;
  • 分析出可接受与不可接受的封包状态;

    Linux系统上防火墙的主要类别

    根据管理的范围,可以将防火墙区分为网域型与单一主机型的控管。
  1. 网域型,此类防火墙都是当做路由器的角色,因此类型主要则有封包过滤的Netfilter与利用代理服务器(proxy server)进行存取代理的方式。
  2. 单一主机型,主要的有包过滤型的Netfilter与依据服务软件程序作为分析的TVP Wrappers两种。
  3. Netfilter(封包过滤机制)
    所谓的封包过滤,即分析进入主机的网络封包,将封包的表头数据捉出来进行分析,已决定该联机行是放行还是抵挡。由于这种方式可以直接分析封包表头数据,所以包括硬件地址(MAC), 软件地址 (IP), TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,因此用途非常的广泛。
    在Linux中我们使用核心内建的Netfilter这个机制,而Netfilter提供了iptables这个软件作为封包过滤的指令。由于是核心内建的功能,因此他的效率非常的高。
  4. TCP Wrappers(程序控管)
    该方法是通过服务器的程序的外挂(tcpd)来处理的,这种机制主要是分析谁对某程序进行存取,然后透过规则去分析该服务器程序能否联机。由于是通过分析服务器程序来控管的,因此与启动的端口无关,只与程序的名称有关
  5. Proxy(代理服务器)当用户client想取得服务器的数据时,他的流程是这样的:
    1. client会向Proxy server要求数据,请Proxy帮忙处理
    2. Proxy可以分析使用者的IP来源是否合法,取得的数据是否合法,如果合法的话,会帮助client取得数据
    3. Server所回传的数据则给Proxy Server
    4. 最后Proxy server将数据回传给client
  6. 这样做的好处是client甚至不需要有public IP,当有人攻击client时,必须先攻破Proxy server

    TCP Wrappers

    该防火墙主要通过两个文件来设定

  7. /etc/hosts.allow/etc/hosts.deny

    1. <service(program_name)> : <IP, domain, hostname>
    2. <服务 (亦即程序名称)> : <IP 或领域 或主机名>
    3. # 上头的 > < 是不存在于配置文件中的喔!

    而改规则的顺序为:

  8. 先以allow为优先对比,符合该规则就予以放行

  9. 再以deny对比,符合规则予以抵挡
  10. 若都不在,即都不符合,最终予以放行

    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语法

    规则的观察与清除

    1. [root@www ~]# iptables [-t tables] [-L] [-nv]
    2. 选项与参数:
    3. -t :后面接 table ,例如 nat filter ,若省略此项目,则使用默认的 filter
    4. -L :列出目前的 table 的规则
    5. -n :不进行 IP HOSTNAME 的反查,显示讯息的速度会快很多!
    6. -v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
    7. 范例:列出 filter table 三条链的规则
    8. [root@www ~]# iptables -L -n
    9. Chain INPUT (policy ACCEPT) <==针对 INPUT 链,且预设政策为可接受
    10. target prot opt source destination <==说明栏
    11. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED <==第 1 条规则
    12. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第 2 条规则
    13. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 <==第 3 条规则
    14. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 <==以下类推
    15. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
    16. Chain FORWARD (policy ACCEPT) <==针对 FORWARD 链,且预设政策为可接受
    17. target prot opt source destination
    18. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
    19. Chain OUTPUT (policy ACCEPT) <==针对 OUTPUT 链,且预设政策为可接受
    20. target prot opt source destination
    21. 范例:列出 nat table 三条链的规则
    22. [root@www ~]# iptables -t nat -L -n
    23. Chain PREROUTING (policy ACCEPT)
    24. target prot opt source destination
    25. Chain POSTROUTING (policy ACCEPT)
    26. target prot opt source destination
    27. Chain OUTPUT (policy ACCEPT)
    28. target prot opt source destination

    定义预设政策

    1. [root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
    2. 选项与参数: -P :定义政策( Policy )。注意,这个 P 为大写啊!
    3. ACCEPT :该封包可接受
    4. DROP :该封包直接丢弃,不会让 client 端知道为何被丢弃。
    5. 范例:将本机的 INPUT 设定为 DROP ,其他设定为 ACCEPT
    6. [root@www ~]# iptables -P INPUT DROP
    7. [root@www ~]# iptables -P OUTPUT ACCEPT
    8. [root@www ~]# iptables -P FORWARD ACCEPT
    9. [root@www ~]# iptables-save
    10. # Generated by iptables-save v1.4.7 on Fri Jul 22 15:56:34 2011 *filter
    11. :INPUT DROP [0:0]
    12. :FORWARD ACCEPT [0:0]
    13. :OUTPUT ACCEPT [0:0]
    14. COMMIT
    15. # Completed on Fri Jul 22 15:56:34 2011
    16. # 由于 INPUT 设定为 DROP 而又尚未有任何规则,所以上面的输出结果显示:
    17. # 所有的封包都无法进入你的主机!是不通的防火墙设定!(网络联机是双向的
    1. # iptables -A INPUT -p TCP -i eth0 --dport 21 --sport 1024:65534 -j ACCEPT # FTP
    2. # iptables -A INPUT -p TCP -i eth0 --dport 22 --sport 1024:65534 -j ACCEPT # SSH
    3. # iptables -A INPUT -p TCP -i eth0 --dport 25 --sport 1024:65534 -j ACCEPT # SMTP
    4. # iptables -A INPUT -p UDP -i eth0 --dport 53 --sport 1024:65534 -j ACCEPT # DNS
    5. # iptables -A INPUT -p TCP -i eth0 --dport 53 --sport 1024:65534 -j ACCEPT # DNS
    6. # iptables -A INPUT -p TCP -i eth0 --dport 80 --sport 1024:65534 -j ACCEPT # WWW
    7. # iptables -A INPUT -p TCP -i eth0 --dport 110 --sport 1024:65534 -j ACCEPT # POP3
    8. # iptables -A INPUT -p TCP -i eth0 --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS