iptable详解(2)

先来看张图
在这里插入图片描述
透过图 9.3-4 你就可以更轻松的了解到,事实上与本机最有关的其实是 filter 这个表格内的 INPUT 与 OUTPUT 这两条链,如果你的 iptables 只是用来保护 Linux 主机本身的话,那 nat 的规则根本就不需要理他,直接设定为开放即可。

不过,如果你的防火墙事实上是用来管制 LAN 内的其他主机的话,那么你就必须要再针对 filter 的 FORWARD 这条链,还有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 进行额外的规则订定才行。 nat 表格的使用需要很清晰的路由概念才能够设定的好,建议新手先不要碰!最多就是先玩一玩最阳春的 nat 功能『IP 分享器的功能』就好了! _!这部份我们在本章的最后一小节会介绍的啦!

9.3.4 本机的 iptables 语法

理论上,当你安装好 Linux 之后,系统应该会主动的帮你启动一个默认的防火墙规则, 不过这个默认防火墙可能不是我们想要的模式,因此我们需要额外进行一些修订的行为。不过,在开始进行底下的练习之前 鸟哥这里有个很重要的事情要告知一下。因为 iptables 的指令会将网络封包进行过滤及抵挡的动作,所以,请不要在远程主机上进行防火墙的练习,因为你很有可能一不小心将自己关在家门外! 尽量在本机前面登入 tty1-tty6 终端机进行练习,否则常常会发生悲剧啊!鸟哥以前刚刚在玩 iptables 时,就常常因为不小心规则设定错误,导致常常要请远程的朋友帮忙重新启动…

刚刚提到咱们的 iptables 至少有三个预设的 table (filter, nat, mangle),较常用的是本机的 filter 表格, 这也是默认表格啦。另一个则是后端主机的 nat 表格,至于 mangle 较少使用,所以这个章节我们并不会讨论 mangle。 由于不同的 table 他们的链不一样,导致使用的指令语法或多或少都有点差异。 在这个小节当中,我们主要将针对 filter 这个默认表格的三条链来做介绍。底下就来玩一玩吧!
iptables防火软件安装
1、安装iptable iptable-service
#先检查是否安装了iptables
service iptables status
#安装iptables
yum install -y iptables
#升级iptables(安装的最新版本则不需要)
yum update iptables
#安装iptables-services
yum install iptables-services

2、禁用/停止自带的firewalld服务
#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld

|Tips:

防火墙的设定主要使用的就是 iptables 这个指令而已。而防火墙是系统管理员的主要任务之一, 且对于系统的影响相当的大,因此『只能让 root 使用 iptables 』,不论是设定还是观察防火墙规则喔!

9.3.4-1 规则的观察与清除

如果你在安装的时候选择没有防火墙的话,那么 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

在上表中,每一个 Chain 就是前面提到的每个链啰~ Chain 那一行里面括号的 policy 就是预设的政策, 那底下的 target, prot 代表什么呢?

  • target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外尚有 DROP (丢弃) 的项目!
  • prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;
  • opt:额外的选项说明
  • source :代表此规则是针对哪个『来源 IP』进行限制?
  • destination :代表此规则是针对哪个『目标 IP』进行限制?

在输出结果中,第一个范例因为没有加上 -t 的选项,所以默认就是 filter 这个表格内的 INPUT, OUTPUT, FORWARD 三条链的规则啰。若针对单机来说,INPUT 与 FORWARD 算是比较重要的管制防火墙链, 所以你可以发现最后一条规则的政策是 REJECT (拒绝) 喔!虽然 INPUT 与 FORWARD 的政策是放行 (ACCEPT), 不过在最后一条规则就已经将全部的封包都拒绝了!

不过这个指令的观察只是作个格式化的查阅,要详细解释每个规则会比较不容易解析。举例来说, 我们将 INPUT 的 5 条规则依据输出结果来说明一下,结果会变成:

  1. 只要是封包状态为 RELATED,ESTABLISHED 就予以接受
  2. 只要封包协议是 icmp 类型的,就予以放行
  3. 无论任何来源 (0.0.0.0/0) 且要去任何目标的封包,不论任何封包格式 (prot 为 all),通通都接受
  4. 只要是传给 port 22 的主动式联机 tcp 封包就接受
  5. 全部的封包信息通通拒绝

最有趣的应该是第 3 条规则了,怎么会所有的封包信息都予以接受?如果都接受的话,那么后续的规则根本就不会有用嘛! 其实那条规则是仅针对每部主机都有的内部循环测试网络 (lo) 接口啦!如果没有列出接口,那么我们就很容易搞错啰~ 所以,近来鸟哥都建议使用 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]          <==冒号开头的指的是链,三条内建的链
:FORWARD ACCEPT [0:0]        <==三条内建链的政策都是 ACCEPT 啰!
:OUTPUT ACCEPT [680:100461]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT <==针对 INPUT 的规则
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT  <==这条很重要!针对本机内部接口开放!
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited <==针对 FORWARD 的规则
COMMIT
# Completed on Fri Jul 22 15:51:52 2011

由上面的输出来看,有底线且内容含有 lo 的那条规则当中,『 -i lo 』指的就是由 lo 适配卡进来的封包! 这样看就清楚多了!因为有写到接口的关系啊!不像之前的 iptables -L -n 嘛!这样了解乎! 不过,既然这个规则不是我们想要的,那该如何修改规则呢?鸟哥建议,先删除规则再慢慢建立各个需要的规则! 那如何清除规则?这样做就对了:

[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) , 所以如果你不是在本机下达这三行指令时,很可能你会被自己挡在家门外 (若 INPUT 设定为 DROP 时)!要小心啊!

一般来说,我们在重新定义防火墙的时候,都会先将规则给他清除掉。还记得我们前面谈到的, 防火墙的『规则顺序』是有特殊意义的,所以啰, 当然先清除掉规则,然后一条一条来设定会比较容易一点啦。底下就来谈谈定义预设政策吧!

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
[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 而又尚未有任何规则,所以上面的输出结果显示:
# 所有的封包都无法进入你的主机!是不通的防火墙设定!(网络联机是双向的)

看到输出的结果了吧?INPUT 被修改了设定喔!其他的 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)

iptables 的基本参数就如同上面所示的,仅只谈到 IP 、网域与装置等等的信息, 至于 TCP, UDP 封包特有的埠口 (port number) 与状态 (如 SYN 旗标) 则在下小节才会谈到。 好,先让我们来看看最基础的几个规则,例如开放 lo 这个本机的接口以及某个 IP 来源吧!

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

仔细看上面并没有列出 -s, -d 等等的规则,这表示:不论封包来自何处或去到哪里,只要是来自 lo 这个界面,就予以接受!这个观念挺重要的,就是『没有指定的项目,则表示该项目完全接受』的意思! 例如这个案例当中,关于 -s, -d…等等的参数没有规定时,就代表不论什么值都会被接受啰。

这就是所谓的信任装置啦!假如你的主机有两张以太网络卡,其中一张是对内部的网域,假设该网卡的代号为 eth1 好了, 如果内部网域是可信任的,那么该网卡的进出封包就通通会被接受,那你就能够用:『iptables -A INPUT -i eth1 -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 来源,可视为信任主机或者是不信任的恶意来源喔!

[root@www ~]# iptables-save
# Generated by iptables-save v1.4.7 on Fri Jul 22 16:00:43 2011
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:1724]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.100.0/24 -i eth1 -j ACCEPT
-A INPUT -s 192.168.100.10/32 -i eth1 -j ACCEPT
-A INPUT -s 192.168.100.230/32 -i eth1 -j DROP
COMMIT
# Completed on Fri Jul 22 16:00:43 2011

这就是最单纯简单的防火墙规则的设定与观察方式。不过,在上面的案例中,其实你也发现到有两条规则可能有问题~ 那就是上面的特殊字体圈起来的规则顺序。明明已经放行了 192.168.100.0/24 了,所以那个 192.168.100.230 的规则就不可能会被用到!这就是有问题的防火墙设定啊!了解乎?那该怎办?就重打啊!@_@! 那如果你想要记录某个规则的纪录怎么办?可以这样做:

[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 这个动作仅在进行记录而已,并不会影响到这个封包的其他规则比对的。 好了,接下来我们分别来看看 TCP,UDP 以及 ICMP 封包的其他规则比对吧!

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 埠口范围:限制目标的端口号码。

事实上就是多了那个 --sport 及 --dport 这两个玩意儿,重点在那个 port 上面啦! 不过你得要特别注意,因为仅有 tcp 与 udp 封包具有埠口,因此你想要使用 --dport, --sport 时,得要加上 -p tcp 或 -p udp 的参数才会成功喔!底下让我们来进行几个小测试:

范例:想要联机进入本机 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

瞧!你可以利用 UDP 与 TCP 协议所拥有的端口号码来进行某些服务的开放或关闭喔!你还可以综合处理呢!例如:只要来自 192.168.1.0/24 的 1024:65535 埠口的封包,且想要联机到本机的 ssh port 就予以抵挡,可以这样做:

[root@www ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 \
> --sport 1024:65534 --dport ssh -j DROP

如果忘记加上 -p tcp 就使用了 --dport 时,会发生啥问题呢?

[root@www ~]# iptables -A INPUT -i eth0 --dport 21 -j DROP
iptables v1.4.7: unknown option `--dport'
Try `iptables -h' or 'iptables --help' for more information.

你应该会觉得很奇怪,怎么『 --dport 』会是未知的参数 (arg) 呢?这是因为你没有加上 -p tcp 或 -p ud 的缘故啊!很重要喔!

除了埠口之外,在 TCP 还有特殊的旗标啊!最常见的就是那个主动联机的 SYN 旗标了。 我们在 iptables 里面还支持『 --syn 』的处理方式,我们以底下的例子来说明好了:

范例:将来自任何地方来源 port 1:1023 的主动联机到本机端的 1:1023 联机丢弃
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --sport 1:1023 \
> --dport 1:1023 --syn -j DROP

一般来说,client 端启用的 port 都是大于 1024 以上的埠口,而 server 端则是启用小于 1023 以下的埠口在监听的。所以我们可以让来自远程的小于 1023 以下的端口数据的主动联机都给他丢弃! 但不适用在 FTP 的主动联机中!这部份我们未来在二十一章的 FTP 服务器再来谈吧!

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

在 kernel 2.2 以前使用 ipchains 管理防火墙时,通常会让系统管理员相当头痛!因为 ipchains 没有所谓的封包状态模块,因此我们必须要针对封包的进、出方向进行管控。举例来说,如果你想要联机到远程主机的 port 22 时,你必须要针对两条规则来设定:

本机端的 1024:65535 到远程的 port 22 必须要放行 (OUTPUT 链);
远程主机 port 22 到本机的 1024:65535 必须放行 (INPUT 链);
这会很麻烦!因为如果你要联机到 10 部主机的 port 22 时,假设 OUTPUT 为预设开启 (ACCEPT), 你依旧需要填写十行规则,让那十部远程主机的 port 22 可以联机到你的本地端主机上。 那如果开启全部的 port 22 呢?又担心某些恶意主机会主动以 port 22 联机到你的机器上! 同样的道理,如果你要让本地端主机可以连到外部的 port 80 (WWW 服务),那就更不得了~ 这就是网络联机是双向的一个很重要的概念!

好在我们的 iptables 免除了这个困扰!他可以透过一个状态模块来分析 『这个想要进入的封包是否为刚刚我发出去的响应?』 如果是刚刚我发出去的响应,那么就可以予以接受放行!哇!真棒!这样就不用管远程主机是否联机进来的问题了! 那如何达到呢?看看底下的语法:

[root@www ~]# iptables -A INPUT [-m state] [--state 状态]
选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
     state :状态模块
     mac   :网络卡硬件地址 (hardware address)
--state :一些封包的状态,主要有:
     INVALID    :无效的封包,例如数据破损的封包状态
     ESTABLISHED:已经联机成功的联机状态;
     NEW        :想要新建立联机的封包状态;
     RELATED    :这个最常用!表示这个封包是与我们主机发送出去的封包有关

范例:只要已建立或相关封包就予以通过,只要是不合法封包就丢弃
[root@www ~]# iptables -A INPUT -m state \
> --state RELATED,ESTABLISHED -j ACCEPT
[root@www ~]# iptables -A INPUT -m state --state INVALID -j DROP

如此一来,我们的 iptables 就会主动分析出该封包是否为响应状态,若是的话,就直接予以接受。呵呵! 这样一来你就不需要针对响应的封包来撰写个别的防火墙规则了!这真是太棒了!底下我们继续谈一下 iptables 的另一个外挂, 那就是针对网卡来进行放行与防御:

范例:针对局域网络内的 aa:bb:cc:dd:ee:ff 主机开放其联机
[root@www ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff \
> -j ACCEPT
选项与参数:
--mac-source :就是来源主机的 MAC 啦!

如果你的区网当中有某些网络高手,老是可以透过修改 IP 去尝试透过路由器往外跑,那你该怎么办? 难道将整个区网拒绝?并不需要的,你可以透过之前谈到的 ARP 相关概念,去捉到那部主机的 MAC ,然后透过上头的这个机制, 将该主机整个 DROP 掉即可。不管他改了什么 IP ,除非他知道你是用网卡的 MAC 来管理,否则他就是出不去啦!了解乎?

|Tips:

其实 MAC 也是可以伪装的,可以透过某些软件来修改网卡的 MAC。不过,这里我们是假设 MAC 是无法修改的情况来说明的。 此外,MAC 是不能跨路由的,因此上述的案例中才特别说明是在区网内,而不是指 Internet 外部的来源唷!

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

在第二章 ICMP 协议当中我们知道 ICMP 的类型相当的多,而且很多 ICMP 封包的类型都是为了要用来进行网络检测用的!所以最好不要将所有的 ICMP 封包都丢弃!如果不是做为路由器的主机时,通常我们会把 ICMP type 8 (echo request) 拿掉而已,让远程主机不知道我们是否存在,也不会接受 ping 的响应就是了。ICMP 封包格式的处理是这样的:

[root@www ~]# iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
选项与参数:
--icmp-type :后面必须要接 ICMP 的封包类型,也可以使用代号,
              例如 8  代表 echo request 的意思。

范例:让 0,3,4,11,12,14,16,18 的 ICMP type 可以进入本机:
[root@www ~]# vi somefile
#!/bin/bash
icmp_type="0 3 4 11 12 14 16 18"
for typeicmp in $icmp_type
do
   iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
done

[root@www ~]# sh  somefile

这样就能够开放部分的 ICMP 封包格式进入本机进行网络检测的工作了!不过,如果你的主机是作为区网的路由器, 那么建议 icmp 封包还是要通通放行才好!这是因为客户端检测网络时,常常会使用 ping 来测试到路由器的线路是否畅通之故呦! 所以不要将路由器的 icmp 关掉,会有状况啦!

9.3.4-7 超阳春客户端防火墙设计与防火墙规则储存

经过上述的本机 iptables 语法分析后,接下来我们来想想,如果站在客户端且不提供网络服务的 Linux 本机角色时, 你应该要如何设计你的防火墙呢?老实说,你只要分析过 CentOS 默认的防火墙规则就会知道了,理论上, 应该要有的规则如下:

  1. 规则归零:清除所有已经存在的规则 (iptables -F…)
  2. 预设政策:除了 INPUT 这个自定义链设为 DROP 外,其他为预设 ACCEPT;
  3. 信任本机:由于 lo 对本机来说是相当重要的,因此 lo 必须设定为信任装置;
  4. 回应封包:让本机主动向外要求而响应的封包可以进入本机 (ESTABLISHED,RELATED)
  5. 信任用户:这是非必要的,如果你想要让区网的来源可用你的主机资源时

这就是最最阳春的防火墙,你可以透过第二步骤抵挡所有远程的来源封包,而透过第四步骤让你要求的远程主机响应封包可以进入, 加上让本机的 lo 这个内部循环装置可以放行,嘿嘿!一部 client 专用的防火墙规则就 OK 了!你可以在某个 script 上面这样做即可:

[root@www ~]# vim bin/firewall.sh
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH

# 1. 清除规则
iptables -F
iptables -X
iptables -Z

# 2. 设定政策
iptables -P   INPUT DROP
iptables -P  OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# 3~5. 制订各项规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT

# 6. 写入防火墙规则配置文件
/etc/init.d/iptables save

[root@www ~]# sh bin/firewall.sh
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

其实防火墙也是一个服务,你可以透过『chkconfig --list iptables』去察看就知道了。 因此,你这次修改的各种设定想要在下次开机还保存,那就得要进行『 /etc/init.d/iptables save 』这个指令加参数。 因此,鸟哥现在都是将储存的动作写入这个 firewall.sh 脚本中,比较单纯些啰!现在,你的 Linux 主机已经有相当的保护了, 只是如果想要作为服务器,或者是作为路由器,那就得要自行加上某些自定义的规则啰。

9.3.5 IPv4 的核心管理功能: /proc/sys/net/ipv4/*

除了 iptables 这个防火墙软件之外,其实咱们 Linux kernel 2.6 提供很多核心预设的攻击抵挡机制喔! 由于是核心的网络功能,所以相关的设定数据都是放置在 /proc/sys/net/ipv4/ 这个目录当中。 至于该目录下各个档案的详细资料,可以参考核心的说明文件 (你得要先安装 kernel-doc 软件):

/usr/share/doc/kernel-doc-2.6.32/Documentation/networking/ip-sysctl.txt
鸟哥这里也放一份备份:
http:/linux.vbird.org/linux_server/0250simple_firewall/ip-sysctl.txt
有兴趣的话应该要自行去查一查比较好的喔!我们底下就拿几个简单的档案来作说明吧!

9.4 单机防火墙的一个实例

介绍了这么多的防火墙语法与相关的注意事项后,终于要来架设防火墙了。鸟哥还是比较偏好使用脚本来撰写防火墙, 然后透过最终的 /etc/init.d/iptables save 来将结果储存到 /etc/sysconfig/iptables 去! 而且此一特色还可以用在呼叫其他的 scripts ,可以让防火墙规则具有较为灵活的使用方式。 好了,那就来谈谈如何设定咱们的防火墙规则吧!

9.4.1 规则草拟

鸟哥底下介绍的这个防火墙,其实可以用来作为路由器上的防火墙,也可以用来作为本机的防火墙。 假设硬件联机如同下图所示, Linux 主机本身也是内部 LAN 的路由器!亦即是一个简单的 IP 分享器的功能啦!依据第三章的图 3.2-1 假设鸟哥网络接口有底下这些:

外部网络使用 eth0 (如果是拨接,有可能是 ppp0,请针对你的环境来设定);
内部网络使用 eth1 ,且内部使用 192.168.100.0/24 这个 Class ;
主机默认开放的服务有 WWW, SSH, https 等等;

由于希望将信任网域 (LAN) 与不信任网域 (Internet) 整个分开的完整一点, 所以希望你可以在 Linux 上面安装两块以上的实体网卡,将两块网卡接在不同的网域,这样可以避免很多问题。 至于最重要的防火墙政策是:『关闭所有的联机,仅开放特定的服务』模式。 而且假设内部使用者已经受过良好的训练,因此在 filter table 的三条链个预设政策是:
INPUT 为 DROP
OUTPUT 及 FORWARD 为 ACCEPT
鸟哥底下预计提供的防火墙流程是这样的

原则上,内部 LAN 主机与主机本身的开放度很高,因为 Output 与 Forward 是完全开放不理的!对于小家庭的主机是可以接受的,因为我们内部的计算机数量不多,而且人员都是熟悉的, 所以不需要特别加以控管!但是:『在大企业的内部,这样的规划是很不合格的, 因为你不能保证内部所有的人都可以按照你的规定来使用 Network !』也就是说『家贼难防』呀! 因此,那样的环境连 Output 与 Forward 都需要特别加以管理才行

9.4.2 实际设定

事实上,我们在设定防火墙的时候,不太可能会一个一个指令的输入,通常是利用 shell scripts 来帮我们达成这样的功能吶!底下是利用上面的流程图所规划出来的防火墙脚本,你可以参考看看, 但是你需要将环境修改成适合你自己的环境才行喔!此外,为了未来修改维护的方便,鸟哥将整个 script 拆成三部分,分别是:

iptables.rule:设定最基本的规则,包括清除防火墙规则、加载模块、设定服务可接受等;
iptables.deny:设定抵挡某些恶意主机的进入;
iptables.allow:设定允许某些自定义的后门来源主机!
鸟哥个人习惯是将这个脚本放置到 /usr/local/virus/iptables 目录下,你也可以自行放置到自己习惯的位置去。 那底下就来瞧瞧这支脚本是怎么写的吧!

root@www ~]# mkdir -p /usr/local/virus/iptables
[root@www ~]# cd /usr/local/virus/iptables
[root@www iptables]# vim iptables.rule
#!/bin/bash

# 请先输入您的相关参数,不要输入错误了!
  EXTIF="eth0"             # 这个是可以连上 Public IP 的网络接口
  INIF="eth1"              # 内部 LAN 的连接接口;若无则写成 INIF=""
  INNET="192.168.100.0/24" # 若无内部网域接口,请填写成 INNET=""
  export EXTIF INIF INNET

# 第一部份,针对本机的防火墙设定!##########################################
# 1. 先设定好核心的网络功能:
  echo "1" > /proc/sys/net/ipv4/tcp_syncookies
  echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
  for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do
        echo "1" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,\
send_redirects}; do
        echo "0" > $i
  done

# 2. 清除规则、设定默认政策及开放 lo 与相关的设定值
  PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
  iptables -F
  iptables -X
  iptables -Z
  iptables -P INPUT   DROP
  iptables -P OUTPUT  ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -A INPUT -i lo -j ACCEPT
  iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 3. 启动额外的防火墙 script 模块
  if [ -f /usr/local/virus/iptables/iptables.deny ]; then
        sh /usr/local/virus/iptables/iptables.deny
  fi
  if [ -f /usr/local/virus/iptables/iptables.allow ]; then
        sh /usr/local/virus/iptables/iptables.allow
  fi
  if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
        sh /usr/local/virus/httpd-err/iptables.http
  fi

# 4. 允许某些类型的 ICMP 封包进入
  AICMP="0 3 3/4 4 11 12 14 16 18"
  for tyicmp in $AICMP
  do
    iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
  done

# 5. 允许某些服务的进入,请依照你自己的环境开启
# iptables -A INPUT -p TCP -i $EXTIF --dport  21 --sport 1024:65534 -j ACCEPT # FTP
# iptables -A INPUT -p TCP -i $EXTIF --dport  22 --sport 1024:65534 -j ACCEPT # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport  25 --sport 1024:65534 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --dport  53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport  53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport  80 --sport 1024:65534 -j ACCEPT # WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS


# 第二部份,针对后端主机的防火墙设定!###############################
# 1. 先加载一些有用的模块
  modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack 
ip_conntrack_ftp ip_conntrack_irc"
  for mod in $modules
  do
      testmod=`lsmod | grep "^${mod} " | awk '{print $1}'`
      if [ "$testmod" == "" ]; then
            modprobe $mod
      fi
  done

# 2. 清除 NAT table 的规则吧!
  iptables -F -t nat
  iptables -X -t nat
  iptables -Z -t nat
  iptables -t nat -P PREROUTING  ACCEPT
  iptables -t nat -P POSTROUTING ACCEPT
  iptables -t nat -P OUTPUT      ACCEPT

# 3. 若有内部接口的存在 (双网卡) 开放成为路由器,且为 IP 分享器!
  if [ "$INIF" != "" ]; then
    iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" > /proc/sys/net/ipv4/ip_forward
    if [ "$INNET" != "" ]; then
        for innet in $INNET
        do
            iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
        done
    fi
  fi
  # 如果你的 MSN 一直无法联机,或者是某些网站 OK 某些网站不 OK,
  # 可能是 MTU 的问题,那你可以将底下这一行给他取消批注来启动 MTU 限制范围
  # iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss \
  #          --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

# 4. NAT 服务器后端的 LAN 内对外之服务器设定
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 \
#          -j DNAT --to-destination 192.168.1.210:80 # WWW

# 5. 特殊的功能,包括 Windows 远程桌面所产生的规则,假设桌面主机为 1.2.3.4
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4  --dport 6000 \
#          -j DNAT --to-destination 192.168.100.10
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4  --sport 3389 \
#          -j DNAT --to-destination 192.168.100.20

# 6. 最终将这些功能储存下来吧!
  /etc/init.d/iptables save

特别留意上面程序代码的特殊字体部分,基本上,你只要修改一下最上方的接口部分, 应该就能够运作这个防火墙了。不过因为每个人的环境都不相同, 因此你在设定完成后,依旧需要测试一下才行喔!不然,出了问题不要怪我啊!… 再来看一下关于 iptables.allow 的内容是如何?假如我要让一个 140.116.44.0/24 这个网域的所有主机来源可以进入我的主机的话,那么这个档案的内容可以写成这样:

[root@www iptables]# vim iptables.allow
#!/bin/bash
# 底下则填写你允许进入本机的其他网域或主机啊!
  iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT

# 底下则是关于抵挡的档案设定法!
[root@www iptables]# vim iptables.deny
#!/bin/bash
# 底下填写的是『你要抵挡的那个咚咚!』
  iptables -A INPUT -i $EXTIF -s 140.116.44.254 -j DROP

[root@www iptables]# chmod 700 iptables.*

将这三个档案的权限设定为 700 且只属于 root 的权限后,就能够直接执行 iptables.rule 啰! 不过要注意的是,在上面的案例当中,鸟哥预设将所有的服务的通道都是关闭的! 所以你必须要到本机防火墙的第 5 步骤处将一些批注符号 (#) 解开才行。 同样的,如果有其他更多的 port 想要开启时,一样需要增加额外的规则才行喔!

不过,还是如同前面我们所说的,这个 firewall 仅能提供基本的安全防护,其他的相关问题还需要再测试测试呢! 此外,如果你希望一开机就自动执行这个 script 的话,请将这个档案的完整档名写入 /etc/rc.d/rc.local 当中,有点像底下这样:

[root@www ~]# vim /etc/rc.d/rc.local
....(其他省略)....
# 1. Firewall
/usr/local/virus/iptables/iptables.rule

事实上,这个脚本的最底下已经加入写入防火墙默认规则文件的功能,所以你只要执行一次,就拥有最正确的规则了! 上述的 rc.local 仅是预防万一而已。 _!上述三个档案请你不要在 Windows 系统上面编辑后才传送到 Linux 上运作,因为 Windows 系统的断行字符问题,将可能导致该档案无法执行。建议你直接到底下去下载,传送到 Linux 后可以利用 dos2unix 指令去转换断行字符!就不会有问题!

http://linux.vbird.org/download/index.php?action=detail&fileid=43
这就是一个最简单、阳春的防火墙。同时,这个防火墙还可以具有最阳春的 IP 分享器的功能呢! 也就是在 iptables.rule 这个档案当中的第二部分了。 这部分我们在下一节会再继续介绍的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值