第六篇 构建一个独立的防火墙.docx

上传人:b****5 文档编号:4170401 上传时间:2022-11-28 格式:DOCX 页数:35 大小:43.05KB
下载 相关 举报
第六篇 构建一个独立的防火墙.docx_第1页
第1页 / 共35页
第六篇 构建一个独立的防火墙.docx_第2页
第2页 / 共35页
第六篇 构建一个独立的防火墙.docx_第3页
第3页 / 共35页
第六篇 构建一个独立的防火墙.docx_第4页
第4页 / 共35页
第六篇 构建一个独立的防火墙.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

第六篇 构建一个独立的防火墙.docx

《第六篇 构建一个独立的防火墙.docx》由会员分享,可在线阅读,更多相关《第六篇 构建一个独立的防火墙.docx(35页珍藏版)》请在冰豆网上搜索。

第六篇 构建一个独立的防火墙.docx

第六篇构建一个独立的防火墙

CIW课程之

用LINUXAS构建和安装一个独立的防火墙

 

防火墙架设前的知识点补充

防火墙支持状态过滤。

状态主要有以下四种:

NEW说明这个包是我们看到的第一个包。

意思就是,这是conntrack(内核包跟踪)模块看到的某个连接第一个包,它即将被匹配了。

比如,我们看到一个SYN包,是我们所留意的连接的第一个包,如UDP包,就要匹配它

ESTABLISHED在两个方向上的数据传输。

即只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。

ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答就认为是此状态。

RELATED是个比较麻烦的状态。

当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。

换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。

这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。

ftp是个很好的例子,FTP-data连接就是和FTP-control有关的一个RELATED

INVALID说明数据包不能被识别属于哪个连接或没有任何状态。

有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。

一般地,我们DROP这个状态的任何东西。

本章所建立的防火墙是基于“禁止一切”的默认策略的。

按照默认的情况,所有的网络数据流都被禁止,服务作为策略的例外来单独启用。

 

对于单系统的家庭或是小型商业用户配置,假设大多用户都使用一个单独的计算机来连接Internet,或用单个防火墙来保护一个小型的专用的局域网。

之所以这样假设是因为这样的站点一般不会去花更多资金来扩展原有系统结构以构建更高级的防火墙。

“最小安全”并不是“不安全”,这种“最小保护”防火墙只是比拥有较多机器的更复杂的防火墙稍差一些。

安全性是一种可利用的资源与逐渐减少的回报之间的均衡。

如果要求更高的安全性,付出更多的投入,不一定能在效益上有相应倍数的提高。

日后我们会介绍更多的安全配置,以提供保护较为复杂的局域网的附加内部安全性,也提供比单系统防火墙更安全的服务器配置。

作为防火墙的管理程序,iptables为输入和输出规则链建立单独的数据包过滤规则以组成防火墙。

定义防火墙规则的一个重要方面就是规则的定义顺序。

数据包过滤规则以它们被定义的顺序存储在内核的输入、输出或转发规则链中。

单个规则被插入到链的开头或添加到链的结尾。

本章例子中的所有规则都是添加到链的结尾的

本章所有过滤器的例子中使用的是数字服务端口号而不是它们的符号名称,如在/etc/services中列出的那样。

iptables支持符号化的服务端口名称,之所以不使用符号名称而使用数字是因为在Linux的不同版本中符号名称不太统一

 

本章将会用到一个名为rc.firewall的脚本,这个脚本的位置依赖于Linux调用该脚本的方式而不同。

例如,在RedHat,或SUSE系统中,此脚本位于/etc/rc.d目录;但在Debian中,它位于/etc/init.d目录。

鉴于用到的shell语法可能不同,在例子中会用Bourne(sh)或BourneAgain(bash)shell的语法来编写。

脚本应该以“shebang”开头来调用shell作为脚本的解释程序。

脚本中的第一行如下:

#!

/bin/sh

 

定制还是购买Linux内核

 

最好不要在防火墙运行XWindow,进一步说,最好不要安装。

因为一般这个软件没有太多用处,而且曾被用做攻击服务器的途径。

有人需要从成百上千英里以外的某地方控制一台Linux计算机,和他们一样,我也要从很远的地方启动防火墙脚本,在这种情况下,最好做两项准备:

首先,将防火墙脚本开始的一个或几个执行动作的默认策略定为接受,这样做是为了调试脚本,而不是规则语法即是如此。

在脚本被调试正确后,再将策略改回为丢弃策略。

其次非常重要的一点是,在从远程执行防火墙脚本时,最好设置corn作业,使防火墙可以在不久后的某一时间停止下来。

这样可以有效地允许你启用防火墙并进行一些测试,并且,当存在错误设置的(或者丢失的)规则时,不至于将你锁在计算机外面而无法返回与计算机的连接。

临时客串知识点:

Linux技巧:

用cron和at调度作业

系统管理员需要在系统负载低的午夜运行作业,或者需要每天或每月运行作业,同时又不愿意牺牲睡眠时间或假期。

调度任务的其他原因包括自动执行日常任务或者确保每次都以相同的方式处理任务。

本文帮助您使用cron和at功能调度作业定期运行或在指定的时间运行一次。

以一定的时间间隔运行作业

以一定的时间间隔运行作业需要使用cron设施进行管理,它由crond守护进程和一组表(描述执行哪些操作和采用什么样的频率)组成。

这个守护进程每分钟唤醒一次,并通过检查crontab判断需要做什么。

用户使用crontab命令管理crontab。

crond守护进程常常是在系统启动时由init进程启动的。

为了简单,假设希望定期运行清单1所示的命令。

这个命令实际上只报告日期和时间,其他什么事都不做,但是它可以说明如何使用crontab设置cron作业,而且还可以通过输出看到作业运行的时间。

设置crontab条目需要一个包含转义的shell元字符的字符串,所以适合于简单的命令和参数。

在这个示例中,将从脚本/home/ian/mycrontab.sh运行echo命令,这个脚本不需要参数。

这可以减少处理转义字符的工作。

创建crontab

使用crontab命令和-e(表示“edit”)选项创建crontab。

这会打开vi编辑器,除非在EDITOR或VISUAL环境变量中指定了另一种编辑器。

每个crontab条目包含六个字段:

1.分钟

2.小时

3.日

4.月

5.星期

6.由sh执行的字符串

分钟和小时的范围分别是0-59和0-12,日和月的范围分别是1-31和1-12。

星期的范围是0-6,0表示星期日。

星期也可以指定为sun、mon、tue等等。

第6个字段包含前5个字段之后的所有内容,它是要传递给sh的字符串。

百分号(%)将转换为空行,所以如果要使用%或其他任何特殊字符,就要在前面加上反斜线(\)。

第一个%之前的一行传递给shell,这个%之后的所有行都作为标准输入传递。

各个与时间相关的字段可以指定一个单独的值、值的范围(比如0-10或sun-wed)或者以逗号分隔的单独值和范围列表。

清单2给出一个crontab条目示例。

在这个示例中,我们的命令在7月的每个星期五和星期六晚上10点到午夜之间的第0、20、40分钟(每20分钟)执行。

crontab存储在哪里?

用crontab命令创建的crontab存储在/etc/spool/cron下面的一个子目录中,这个子目录与创建crontab的用户同名,所以上面的crontab存储在/etc/spool/cron/ian中。

 

在指定的时间运行作业

有时候,需要只运行作业一次而不是定期运行。

为此,应该使用at命令。

要运行的命令是从-f选项指定的文件读取的,-v选项显示运行作业的时间

例如:

[ian@lyrebird~]$at-fmycrontest.sh10pmtomorrow

job14atSunJul822:

00:

002007

[ian@lyrebird~]$at-fmycrontest.sh2:

00tuesday

job15atTueJul1002:

00:

002007

[ian@lyrebird~]$at-fmycrontest.sh2:

00july11

job16atWedJul1102:

00:

002007

[ian@lyrebird~]$at-fmycrontest.sh2:

00nextweek

job17atSatJul1402:

00:

002007

 

可以管理cron和at作业。

使用crontab命令和-l选项列出crontab,使用atq命令显示用at命令加入队列中的作业

[ian@lyrebird~]$crontab-l

0,20,4022-23*7fri-sat/home/ian/mycrontest.sh

[ian@lyrebird~]$atq

16WedJul1102:

00:

002007aian

17SatJul1402:

00:

002007aian

14SunJul822:

00:

002007aian

15TueJul1002:

00:

002007aian

 

可以使用cron命令和-r选项删除所有调度的cron作业

[ian@lyrebird~]$crontab-l

0,20,4022-23*7fri-sat/home/ian/mycrontest.sh

[ian@lyrebird~]$crontab-r

[ian@lyrebird~]$crontab-l

nocrontabforian

用atq和atrm显示并删除作业

[ian@lyrebird~]$atq

16WedJul1102:

00:

002007aian

17SatJul1402:

00:

002007aian

14SunJul822:

00:

002007aian

15TueJul1002:

00:

002007aian

[ian@lyrebird~]$atrm161415

[ian@lyrebird~]$atq

17SatJul1402:

00:

002007aian

 

以上是关于作业调度的知识点补充。

如果有了以上的CRON我们就不会把自己锁在外面了。

例如,在调试防火墙脚本时,可以创建一个corn作业,每两分钟停止防火墙一次,这样可以安全地运行防火墙脚本并可以知道是否已锁定SSH会话。

如果已经锁定,只需要等待防火墙脚本再运行几分钟,等待防火墙自行关闭,然后就可以去修订脚本继续运行了。

本节课防火墙示例中使用的符号常量

如果为经常使用的名字或地址定义了符号常量,防火墙的脚本就极易读懂和维护。

下面的常量或者是本章例子中用到的,或者是在网络标准中定义的通用常量。

在下面的例子中,也是以“shebang”行作为开头。

#!

/bin/bash

IPT="/sbin/iptables"#LocationofiptablesonyoursystemINTERNET="ethO"#Internet-connectedinterfaceLOOPBACK_INTERFACE="1o"#howeveryoursystemnamesitIPADDR="my.ip.address"#yourIPaddressMY_ISP="my.isp.address.range"#ISPserver&NOCaddressrangeSUBNET_BASE="work"#Yoursubnet'snetworkaddressSUBNET_BROADCAST="my.subnet.bcast"#Yoursubnet'sbroadcastaddressLOOPBACK="127.0.O.O/8"#reservedloopbackaddressrangeCLASS_A="IO.O.O.O/8"#classAprivatenetworksCLASS_B="172.16.O.O/12"#classBprivatenetworksCLASS_C="192.168.0.0/16"#classCprivatenetworksCLASS_D_MULTICAST="224.0.O.O/4"#classDmulticastaddressesCLASS_E_RESERVED_NET="240.0.O.O/5"#classEreservedaddressesBROADCAST_SRC="O.O.O.O"#broadcastsourceaddressBROADCAST_DEST="255.255.255.255"#broadcastdestinationaddressPRIVPORTS="0:

1023"#well-known,privilegedportrangeUNPRIVPORTS="1024:

65535"#unprivilegedportrange

 

删除预先存在的规则

定义一组过滤规则时,首先要做的事情就是从规则链中清除任何已经存在的规则。

否则任何新定义的规则将加到已有的规则之后。

那么,数据包在到达链上新定义的点之前,很容易与一个先前存在的规则匹配。

删除规则也叫做刷新规则链,当没有参数直接针对特定的链时,下面的命令一次性刷新所有链上的规则:

$IPT–F

$IPT-tnat–F

$IPT-tmangle-F

规则链变为空,但所有用户自定义规则链仍存在,刷新链并不影响当时处于有效的默认策略的状态。

下一步是删除所有用户自定义规则链,下面的命令可以删除它们:

$IPT-X

$IPT-tnat-X

$IPT-tmangle-X

停止防火墙

$IPT–PINPUTACCEPT

$IPT--policyOUTPUTACCEPT

$IPT--policyFORWARDACCEPT

$IPT-tnat--policyPREROUTINGACCEPT

$IPT-tnat--policyOUTPUTACCEPT

$IFT-tnat--policyPOSTROUTINGACCEPT

$IPT-tmangle--policyPREROUTINGACCEPT

$IPT-tmangle--policyOUTPUTACCEPT

下面就可以容易地停止防火墙了,将下面代码置于上面代码之后,当你使用参数“stop”时,脚本会直接而干净地重置默认策略并将防火墙完全停止:

if["$1"="stop"];then

echo"Firewallcompletelystopped!

WARNING:

THISHOSTHASNOFIREWALLRUNNING."exit0

fi

 

启动回环接口

本地服务依赖于回环网络接口。

系统启动之后,系统的默认策略是接受所有的数据包,清除所有预先存在的规则链对此也没有任何影响。

但是,当防火墙被重新初始化时并且先前使用了默认禁止策略,丢弃策略在此时也将依然有效。

在没有任何接受规则的情况下,回环接口是不能被访问的。

$IPT-AINPUT-ilo-jACCEPT

$IPT-AOUTPUT-olo-jACCEPT

重置默认策略

使用丢弃默认策略时,除非定义规则为明确允许或拒绝一个匹配的数据包,否则数据包将被丢弃。

我们想要的是,自动丢弃我们不想要的入站数据包且并不通知远方的发送者,拒绝出站数据包并向内部发送者返回一个ICMP错误消息。

对用终端用户来说,其不同之处举例来讲,如果有人在远程站点试图连接你的Web服务器,他的浏览器会挂起,直到系统返回TCP超时状态,但他未得到你的站点或Web服务器是否存在的指示。

另一方面,如果你试图连接一个远程Web服务器,你的浏览器会立即收到一个错误通知,指示这个操作是不允许的:

$IPT--policyINPUTDROP

$IPT--policyOUTPUTDROP

$IPT--policyFORWARDDROP

这样,结合上面的设置除了本地回环业务流外的其他网络业务流都会被阻塞。

如果防火墙主机只有一个网络接口,转发(FORWARD)策略当然是没有必要的。

定义转发策略是为以后做准备的,这样,最好加入下面的代码:

$IPT-tnat--policyPREROUTINGDROP

$IPT-tnat--policyOUTPUTDROP

$IPT-tnat--policyPOSTROUTINGDROP

$IPT-tmangle--policyPREROUTINGDROP

$IPT-tmangle--policyOUTPUTDROP

默认策略规则和最先匹配规则为准默认策略看起来似乎是最先匹配规则为准的例外。

默认策略命令不依赖于其位置,它们本身不是规则。

一个规则链的默认策略是指,一个数据包与规则链上的规则都做了比较却未找到匹配之后所采用的策略。

默认策略用于定义默认的数据包处理方式,它相对规则来说需要首先在脚本中定义。

假设策略命令在脚本最后执行,此时如果防火墙脚本包含一个语法错误导致它过早地退出,那么接受一切的默认策略将生效。

拒绝扫描

排在最前面的状态标记列表列出的是必须进行检测的位,除了那些位以外,第二张状态标记列表列出了必须在检测中设为匹配的位。

$IPT-AINPUT-munclean-jDROP

$IPT-AINPUT–ptcp--tcp-flagsALLNONE-jDROP#Allofthebitsarecleared

 

$IPT-AINPUT-ptcp--tcp-flagsSYN,FINSYN,FIN-jDROP#SYNandFINarebothset

#SYNandRSTarebothset

$IPT-AINPUT-ptcp--tcp-flagsSYN,RSTSYN,RST-jDROP#FINandRSTarebothset$IPT-AINPUT-ptcp--tcp-flagsFIN,RSTFIN,RST-jDROP#FINistheonlybitset,withouttheexpectedaccompanyingACK

$IPT-AINPUT-ptcp--tcp-flagsACK,FINFIN-jDROP

$1PT-AINPUT-ptop--top-flagsACK,PSHPSH-jDROP#PSHistheonlybitset,withouttheexpectedaccompanyingACK

$1PT-AINPUT-ptcp--tcp-flagsACK,URGURG-jDROP#URGistheonlybitset,withouttheexpectedaccompanyingACK

 

利用连接状态绕过规则检测

因为状态模块相对一些Linux防火墙来说会需要更多的内存,所以本章的防火墙示例,将会提供有状态模块和没有状态模块两种选择。

使用状态模块可以让正在进行的交换在正常操作的情况下绕过标准防火墙规则。

但是,如果一个连接的状态表中某项发生循环或超时,就必须转而使用标准的规则。

防火墙静态和动态规则

资源限制的可测性和状态表超时要求同时使用动态和静态规则。

这种限制成为了大型商业防火墙的一个卖点。

限制的可测性问题主要是因为,一个大型的防火墙往往需要处理50,000~100,000个同时的连接,这样就有大量的状态要处理。

系统资源有时被用尽,这样连接就无法建立起来,这时就需要放弃新的连接或是让软件退回到无状态模式。

还有一个就是超时问题,连接状态并不能永远保持。

一些慢速或静止态的连接的状态信息有时会被清除掉,这样可以为更活跃的连接留出更多的空间。

当一个相关的新的数据包又传来时,状态信息将被重新建立。

同时,在传输栈查询连接信息并通知状态模块此数据包确实是已经存在的一个数据交换连接的一部分时,数据包的网络流又回到无状态模式下。

if["$CONNECTION_TRACKING"="1"];then

$IPT-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT

$IPT-AOUTPUT-mstate--stateESTABLISHED,RELATED-jACCEPT

#Usingthestatemodulealone,INVALIDwillbreakprotocolsthatuse

#bi-directionalconnectionsormultipleconnectionsorexchanges,

#unlessanALGisprovidedfortheprotocol.Atthistime,FTPand

#IRCaretheonlyprotocolswithALGsupport.

$IPT-AINPUT-mstate--stateINVALID-jLOG\

--log-prefix"INVALIDinput:

"

$IPT-AINPUT-mstate--stateINVALID-jDROP

$IPT-AOUTPUT-mstate--stateINVALID-jLOG\

--log-prefix"INVALIDoutput:

"

$IPT-AOUTPUT-mstate--stateINVALID-jDROP

fi

 

源地址欺骗及其他不合法地址

在众多的源地址欺骗中,你可以确定识别出的一种欺骗,那就是它伪装成了你的IP地址。

下面的规则可以丢弃那些声称是来自你的机器的入站数据包:

$IPT-AINPUT-i$INTERNET-s$IPADDR-jDROP

正如第1章和第2章中介绍的那样,A、B、C类地址范围中都有一些私有IP地址专门留给局域网使用。

这些地址不会在Internet中使用,路由器也不会使用这些私有地址去路由数据包。

然而事实上,有些路由器确实会转发含私有源地址的数据包。

另外,如果和你同在一个ISP子网(即与你在路由器的同一侧)中的某些人向外发送了带有私有地址的数据包,即使路由器没有转发,这些数据包你也可以看到。

如果你的NAT或代理设置不当,和你在同一局域网下的机器也会泄漏私有地址。

下面三个规则不允许以任何A、B或C类私有网络地址为源地址的数据包入站。

在一个公用网络中,这样的数据包不允许出现:

$IPT-AINPUT-i$INTERNET-s$CLASS_A-jDROP

$IPT-AINPUT-i$1NTERNET-s$CLASS_B-jDROP

$IPT-AINPUT-i$INTERNET

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1