第九章、防火墙与 NAT 服务器

9.1 认识防火墙

防火墙又可以分为硬件防火墙与本机的软件防火墙

硬件防火墙是由厂商设计好的主机硬件, 这部硬件防火墙内的操作系统主要以提供封包数据的过滤机制为主,并将其他不必要的功能拿掉。因为单纯作为防火墙功能而已, 因此封包过滤的效率较佳。

软件防火墙本身就是在保护系统网络安全的一套软件(或称为机制),例如 Netfilter 与 TCP Wrappers 都可以称为软件防火墙。

9.1.2 为何需要防火墙

防火墙最大的功能就是帮助你『限制某些服务的存取来源』!

举例来说:
(1)你可以限制文件传输服务 (FTP) 只在子域内的主机才能够使用,而不对整个 Internet 开放;

(2)你可以限制整部 Linux 主机仅可以接受客户端的 WWW 要求,其他的服务都关闭;

(3)你还可以限制整部主机仅能主动对外联机。反过来说,若有客户端对我们主机发送主动联机的封包状态 (TCP 封包的 SYN flag) 就予以抵挡等等。这些就是最主要的防火墙功能了!

所以鸟哥认为,防火墙最重要的任务就是在规划出:

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

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

基本上,依据防火墙管理的范围,我们可以将防火墙区分为网域型单一主机型的控管。

单一主机型的控管方面, 主要的防火墙有封包过滤型的 Netfilter依据服务软件程序作为分析的 TCP Wrappers 两种。

区域型的防火墙而言, 由于此类防火墙都是当作路由器角色,因此防火墙类型主要则有封包过滤的 Netfilter 与利用==代理服务器 (proxy server)==进行存取代理的方式了。

Netfilter (封包过滤机制)

所谓的封包过滤,亦即是分析进入主机的网络封包,将封包的表头数据捉出来进行分析,以决定该联机为放行或抵挡的机制由于这种方式可以直接分析封包表头数据,所以包括硬件地址(MAC), 软件地址 (IP), TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,因此用途非常的广泛。(其实主要分析的是OSI 七层协议的 2, 3, 4 层啦)

在 Linux 上面我们使用核心内建的 Netfilter 这个机制,而 Netfilter 提供了iptables这个软件来作为防火墙封包过滤的指令。由于 Netfilter 是核心
内建的功能,因此他的效率非常的高! 非常适合于一般小型环境的设定呢!Netfilter 利用一些封包过滤的规则设定,来定义出什么资料可以接收, 什么资料需要剔除,以达到保护主机的目的喔!

TCP Wrappers (程序控管)

另一种抵挡封包进入的方法,为透过服务器程序的外挂 (tcpd) 来处置的!与封包过滤不同的是, 这种机制主要是分析谁对某程序进行存取,然后透过规则去分析该服务器程序谁能够联机、谁不能联机。 由于主要是透过分析服务器程序来控管,因此与启动的埠口无关,只与程序的名称有关。 举例来说,我们知道 FTP可以启动在非正规的 port 21 进行监听,当你透过 Linux 内建的 TCP wrappers限制 FTP 时, 那么你只要知道 FTP 的软件名称 (vsftpd) ,然后对他作限制,则不管 FTP 启动在哪个埠口,都会被该规则管理的

Proxy (代理服务器)

其实代理服务器是一种网络服务,它可以『代理』用户的需求,而代为前往服务器取得相关的资料。就有点像底下这个图示吧:
在这里插入图片描述
以上图为例,当 Client 端想要前往 Internet 取得 Google 的数据时,他取得数据的流程是这样的:

  1. client 会向 proxy server 要求数据,请 proxy 帮忙处理;
  2. proxy 可以分析使用者的 IP 来源是否合法?使用者想要去的Google 服务器是否合法? 如果这个 client 的要求都合法的话,那么proxy 就会主动的帮忙 client 前往 Google 取得资料;
  3. Google 所回传的数据是传给 proxy server 的喔,所以 Google 服
    务器上面看到的是 proxy server 的 IP 啰;
  4. 最后 proxy 将 Google 回传的数据送给 client。

9.1.4 防火墙的一般网络布线示意

单一网域,仅有一个路由器:

内部网络包含安全性更高的子网,需内部防火墙切开子网:

在防火墙的后面架设网络服务器主机

9.1.5 防火墙的使用限制

9.2 TCP Wrappers

9.2.1 哪些服务有支持

9.2.2 /etc/hosts.{allow|deny} 的设定方式

9.3 Linux 的封包过滤软件:iptables

9.3.1 不同 Linux 核心版本的防火墙软件

9.3.2 封包进入流程:规则顺序的重要性!

9.3.3 iptables 的表格 (table) 与链 (chain)

事实上,那个图 9.3-1 所列出的规则仅是 iptables 众多表格当中的一个链(chain) 而已。 什么是链呢?这得由 iptables 的名称说起。为什么称为 ip"tables"呢? 因为这个防火墙软件里面有多个表格 (table) ,每个表格都定义出自己的默认政策与规则, 且每个表格的用途都不相同。我们可以使用底下这张图来稍微了解一下:

预设的情况下,咱们 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 这个表格。

所以说,如果你的 Linux 是作为 www 服务,那么要开放客户端对你的 www 要求
有响应,就得要处理 filter 的 INPUT 链; 而如果你的 Linux 是作为局域网络的路
由器,那么就得要分析 nat 的各个链以及 filter 的 FORWARD 链才行。也就是说, 其
实各个表格的链结之间是有关系的!

9.3.4 本机的 iptables 语法

9.3.4-1 规则的观察与清除

[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
target prot opt source destination <==说明栏
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED <==1 条规则
范例:列出 nat table 三条链的规则
[root@www ~]# iptables -t nat -L -n
  • target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,
    尚有 DROP (丢弃) 的项目!
  • prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;
  • opt:额外的选项说明
  • source :代表此规则是针对哪个『来源 IP』进行限制?
  • destination :代表此规则是针对哪个『目标 IP』进行限制?

如果没有列出接口,那么我们就很容易搞错啰~ 所以,近来鸟哥都建议使用 iptables-save 这个指令来观察防火墙规则啦!因为iptables-save 会列出完整的防火墙规则,只是并没有规格化输出而已。

[root@www ~]# iptables-save [-t table]
选项与参数:
-t :可以仅针对某些表格来输出,例如仅针对 nat 或 filter 等等
[root@www ~]# iptables-save
# Generated by iptables-save v1.4.7 on Fri Jul 22 15:51:52 2011
*filter	<==星号开头的指的是表格,这里为 filter
:INPUT ACCEPT [0:0]	<==冒号开头的指的是链,三条内建的链

那如何清除规则?这样做就对了:

[root@www ~]# iptables [-t tables] [-FXZ]
选项与参数:
-F :清除所有的已订定的规则;
-X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables );
-Z :将所有的 chain 的计数与流量统计都归零
范例:清除本机防火墙 (filter) 的所有规则
[root@www ~]# iptables -F
[root@www ~]# iptables -X
[root@www ~]# iptables -Z

由于这三个指令会将本机防火墙的所有规则都清除,但却不会改变预设政策 (policy)

9.3.4-2 定义预设政策 (policy)

清除规则之后,再接下来就是要设定规则的政策啦!还记得政策指的是什么吗?

『 当你的封包不在你设定的规则之内时,则该封包的通过与否,是以 Policy 的设定
为准』

在本机方面的预设政策中,假设你对于内部的使用者有信心的话, 那么 filter内的 INPUT 链方面可以定义的比较严格一点,而 FORWARD 与 OUTPUT 则可以订定的松一些!通常鸟哥都是将 INPUT 的 policy 定义为 DROP 啦,其他两个则定义为 ACCEPT。至于 nat table 则暂时先不理会他。

[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

其他的 nat table 三条链的预设政策设定也是一样的方式,例如:『 iptables -t nat -P PREROUTING ACCEPT 』就设定了nat table 的 PREROUTING 链为可接受的意思!

9.3.4-3 封包的基础比对:IP, 网域及接口装置

开始来进行防火墙规则的封包比对设定吧!既然是因特网,那么我们就由最基础的
IP, 网域及埠口,亦即是 OSI 的第三层谈起,再来谈谈装置 (网络卡) 的限制等等。
这一小节与下一小节的语法你一定要记住,因为这是最基础的比对语法喔!

[root@www ~]# iptables [-AI 链名] [-io 网络接口] [-p 协议] \
> [-s 来源 IP/网域] [-d 目标 IP/网域] -j [ACCEPT|DROP|REJECT|LOG]
选项与参数:
-AI 链名:针对某的链进行规则的 "插入""累加"

-A :新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,使用 -A 就可以加上第五条规则!
-I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。

例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号

链 :有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关,请看底下。
-io 网络接口:设定封包进出的接口规范
-i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合;
-o :封包所传出的那个网络接口,需与 OUTPUT 链配合;
-p 协定:设定此规则适用于哪种封包格式
主要的封包格式有: tcp, udp, icmp 及 all 。
-s 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括
网域,例如:IP :192.168.0.100
网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
若规范为『不许』时,则加上 ! 即可,例如:
-s ! 192.168.100.0/24 表示不许 192.168.100.0/24 之封包来源;
-d 目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域。
-j :后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)

范例:设定 lo 成为受信任的装置,亦即进出 lo 的封包都予以接受
[root@www ~]# iptables -A INPUT -i lo -j ACCEPT

范例:只要是来自内网的 (192.168.100.0/24) 的封包通通接受
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT
# 由于是内网就接受,因此也可以称之为『信任网域』啰。

范例:只要是来自 192.168.100.10 就接受,但 192.168.100.230 这个恶意来源就丢弃
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP
# 针对单一 IP 来源,可视为信任主机或者是不信任的恶意来源喔!z

那如果你想要记录某个规则的纪录怎么办?可以这样做:

[root@www ~]# iptables -A INPUT -s 192.168.2.200 -j LOG
[root@www ~]# iptables -L -n
target prot opt source	destination
LOG	all -- 192.168.2.200 0.0.0.0/0	LOG flags 0 level 4

看到输出结果的最左边,会出现的是 LOG 喔!只要有封包来自 192.168.2.200 这个 IP
时, 那么该封包的相关信息就会被写入到核心讯息,亦即是 /var/log/messages 这个
档案当中。 然后该封包会继续进行后续的规则比对。所以说, LOG 这个动作仅在进行
记录而已,并不会影响到这个封包的其他规则比对的。

9.3.4-4 TCP, UDP 的规则比对:针对埠口设定

在谈到 TCP 与 UDP 时,比较特殊的就是那个埠口 (port),在 TCP 方面则另外有所谓的联机封包状态, 包括最常见的 SYN 主动联机的封包格式。那么如何针对这两种封包格式进行防火墙规则的设定呢?你可以这样看:

[root@www ~]# iptables [-AI 链] [-io 网络接口] [-p tcp,udp] \
> [-s 来源 IP/网域] [--sport 埠口范围] \
> [-d 目标 IP/网域] [--dport 埠口范围] -j [ACCEPT|DROP|REJECT]
选项与参数:
--sport 埠口范围:限制来源的端口口号码,端口口号码可以是连续的,例如 1024:65535
--dport 埠口范围:限制目标的端口口号码。

范例:想要联机进入本机 port 21 的封包都抵挡掉:
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP

范例:想连到我这部主机的网芳 (upd port 137,138 tcp port 139,445) 就
放行
[root@www ~]# iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT

9.3.4-5 iptables 外挂模块:mac 与 state

9.3.4-6 ICMP 封包规则的比对:针对是否响应 ping 来设计

9.5 NAT 服务器的设定

9.5.1 什么是 NAT? SNAT? DNAT?

NAT 服务器的重点就在于上面流程的第 1,4 步骤,也就是 NAT table 的两条重要的链:PREROUTING 与 POSTROUTING。 那这两条链有什么重要的功能呢?重点在于修改
IP 嘛!但是这两条链修改的 IP 是不一样的! POSTROUTING 在修改来源 IP,
PREROUTING 则在修改目标 IP。 由于修改的 IP 不一样,所以就称为来源 NAT
(Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。

来源 NAT, SNAT:修改封包表头的『来源』项目

目标 NAT, DNAT:修改封包表头的『目标』项目

9.5.2 最阳春 NAT 服务器: IP 分享功能

9.5.3 iptables 的额外核心模块功能

9.5.4 在防火墙后端之网络服务器 DNAT 设定

Guess you like

Origin blog.csdn.net/qq_52835624/article/details/120999475