9.1 认识防火墙
只要能够分析与过滤进出我们管理之网域的封包数据, 就可以称为防火墙。
- 硬件防火墙
- 由厂商设计好的主机硬件, 这部硬件防火墙内的操作系统主要以提供封包数据的过滤机制为主,并将其他不必要的功能拿掉。因为单纯作为防火墙功能而已, 因此封包过滤的效率较佳
- 软件防火墙
- 软件防火墙本身就是在保护系统网络安全的一套软件(或称为机制),例如 Netfilter 与 TCP Wrappers 都可以称为软件防火墙。
9.1.2 为何需要防火墙
作用
防火墙最大的功能就是帮助你『限制某些服务的存取来源』
举例:
- 你可以限制文件传输服务 (FTP) 只在子域内的主机才能够使用,而不对整个 Internet 开放;
- 你可以限制整部 Linux 主机仅可以接受客户端的 WWW 要求,其他的服务都关闭;
- 你还可以限制整部主机仅能主动对外联机。
防火墙最重要的任务就是在规划出:
- 切割被信任(如子域)与不被信任(如 Internet)的网段;
- 划分出可提供 Internet 的服务与必须受保护的服务;
- 分析出可接受与不可接受的封包状态;
防火墙种类
- Netfilter (封包过滤机制)
- 分析进入主机的网络封包,将封包的表头数据捉出来进行分析,以决定该联机为放行或抵挡的机制
- 由于这种方式可以直接分析封包表头数据,所以包括硬件地址(MAC), 软件地址 (IP), TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,因此用途非常的广泛
- TCP Wrappers (程序控管)
- 这种机制主要是分析谁对某程序进行存取,然后透过规则去分析该服务器程序谁能够联机、谁不能联机。
- 举例来说,我们知道 FTP可以启动在非正规的 port 21 进行监听,当你透过 Linux 内建的 TCP wrappers限制 FTP 时, 那么你只要知道 FTP 的软件名称 (vsftpd) ,然后对他作限制,则不管 FTP 启动在哪个端口,都会被该规则管理的
- Proxy (代理服务器)
- 其实代理服务器是一种网络服务,它可以『代理』用户的需求,而代为前往服务器取得相关的资料。
9.1.4 防火墙的一般网络布线示意
单一网域,仅有一个路由器
优点:
- 因为内外网域已经分开,所以安全维护在内部可以开放的权限较大!
- 安全机制的设定可以针对 Linux 防火墙主机来维护即可!
- 对外只看的到 Linux 防火墙主机,所以对于内部可以达到有效的安全防护!
内部网络包含安全性更高的子网,需内部防火墙切开子网:
在防火墙的后面架设网络服务器主机
因为四部主机在 Internet 上面看到的 IP 都相同,但是事实上却是四部不同的主机, 而当有攻击者想要入侵你的 FTP 主机好了,他使用各种分析方法去进攻的主机,其实是『防火墙』那一部, 攻击者想要攻击你内部的主机,除非他能够成功的搞定你的防火墙,否则就很难入侵你的内部主机呢
由于主机放置在两部防火墙中间,内部网络如果发生状况时 (例如某些使用者不良操作导致中毒啊、 被社交工程攻陷导致内部主机被绑架啊等等的) ,是不会影响到网络服务器的正常运作的。 这种方式适用在比较大型的企业当中,因为对这些企业来说,网络主机能否提供正常稳定的服务是很重要的
9.1.5 防火墙的使用限制
Linux 的 Netfilter 机制的主要分析工作
- 拒绝让 Internet 的封包进入主机的某些端口号
- 例如:你的 port 21 这个 FTP 相关的端口,若只想要开放给内部网络的话,那么当 Internet 来的封包想要进入你的 port 21 时,就可以将该数据封包丢掉!因为我们可以分析的到该封包表头的端口口号码
- 拒绝让某些来源 IP 的封包进入
- 例如你已经发现某个 IP 主要都是来自攻击行为的主机,那么只要来自该 IP 的数据封包,就将他丢弃!这样也可以达到基础的安全呦
- 拒绝让带有某些特殊旗标 (flag) 的封包进入
- 最常拒绝的就是带有 SYN 的主动联机的旗标了!只要一经发现,嘿嘿!你就可以将该封包丢弃呀
- 分析硬件地址 (MAC) 来决定联机与否
- MAC 是焊在网络卡上面的,所以你只要分析到该使用者所使用的 MAC 之后,可以利用防火墙将该 MAC 锁住
防火墙不是万能
举例:
- 防火墙并不能很有效的抵挡病毒或木马程序
- www服务主机,必须要允许www封包通过,若此时www服务器软件有漏洞,或者本身向你要求www服务的该封包就是病毒在侦测你的系统。这时防火墙可是一点办法也没有
- 防火墙对于来自内部LAN的攻击较无承受力
- 防火墙对于内部的规则设定通常比较少,所以容易造成内部员工对于网路误用;
主机实地上网前:
- 关闭几个不安全的服务
- 升级几个可能有问题的套件
- 架设好最起码的安全防护---防火墙
9.2 TCP Wrappers
TCP wrappers 是透过客户端想要链接的程序文件名,然后分析客户端的 IP ,看看是否需要放行;
那么哪些程序支持 TCP wrappers 的功能?这个TCP wrappers 又该如何设定?
9.2.1 哪些服务有支持
TCP wrappers 就是透过 /etc/hosts.allow, /etc/hosts.deny 这两个宝贝蛋来管理的一个类似防火墙的机制,
但并非所有的软件都可以透过这两个档案来控管,只有底下的软件才能够透过这两个档案来管理防火墙规则,分别是:
- 由 super daemon (xinetd) 所管理的服务;
- 经由 xinetd 管理的服务还好理解,就是配置文件在 /etc/xinetd.d/ 里面的服务就是 xinetd 所管理的啊!
- 有支援 libwrap.so 模块的服务。
那什么是有支持libwrap.so模块。
例:
请查出你的系统有没有安装 xinetd ,若没有请安装。安装完毕后,请查询
xinetd 管理的服务有哪些?
[root@www ~]# yum install xinetd Setting up Install Process Package 2:xinetd-2.3.14-29.el6.x86_64 already installed and latest version Nothing to do # 画面中显示,已经是最新的 xinetd !所以,已经有安装啰! # 接下来找出 xinetd 所管理的服务群!
[root@www ~]# chkconfig xinetd on <==要先让 xinetd on 后才能看到底 下的 [root@www ~]# chkconfig --list ....(前面省略).... xinetd based services: chargen-dgram: off chargen-stream: off ....(中间省略).... rsync: off <==下一小节的范例就用这玩意儿来解释 tcpmux-server: off telnet: on 上述结果最终输出的部分就是 xinetd 所管理的服务群啰!上述的服务之防火墙简 易设定,都可以透过 TCP wrappers 来管理的
例题:请问, rsyslogd, sshd, xinetd, httpd (若该服务不存在,请自行安装软件),这四个程序有没有支持 tcp wrappers 的抵挡功能?
答:由于支持 tcp wrappers 的服务必定包含 libwrap 这一个动态函式库,因此可以使用 ldd 来观察该服务即可。简单的使用方式为: [root@www ~]# ldd $(which rsyslogd sshd xinetd httpd) # 这个方式可以将所有的动态函式库取出来查阅,不过需要眼睛搜寻。 # 可以透过底下的方式来处理更快! [root@www ~]# for name in rsyslogd sshd xinetd httpd; do echo $name; \ > ldd $(which $name) | grep libwrap; done rsyslogd sshd libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fb41d3c9000) xinetd libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f6314821000) httpd上述的结果中,在该档名档下有出现 libwrap 的,代表有找到该函式库,才有支持tcp wrappers。所以, sshd, xinetd 有支持,
但是 rsyslogd, httpd 这两支程序则不支持。也就是说, httpd 与 rsyslogd 不能够使用 /etc/hosts.{allow|deny}来进行防火墙
9.2.2 /etc/hosts.{allow|deny} 的设定方式
比较规则
- 先以 /etc/hosts.allow 为优先比对,该规则符合就予以放行;
- 再以 /etc/hosts.deny 比对,规则符合就予以抵挡;
- 若不在这两个档案内,亦即规则都不符合,最终则予以放行。
9.3 Linux的分包过滤软件:iptables
9.3.1 不同Linux核心版本的防火墙软件
不过,不同核心版本所使用的防火墙软件是不一样的!因为核心支持的防火墙是逐渐演进而来的!
- Version 2.0:使用 ipfwadm 这个防火墙机制;
- Version 2.2:使用的是 ipchains 这个防火墙机制;
- Version 2.4 与 2.6 :主要是使用 iptables 这个防火墙机制,不过在某些早期的 Version 2.4 版本的 distributions 当中,亦同时支持 ipchains (编译成为模块),好让用户仍然可以使用来自 2.2 版的 ipchains 的防火墙规划。
因为不同的核心使用的防火墙机制不同,且支持的软件指令与语法也不相同,所以在 Linux 上头设定属于你自己的防火墙规则时,要注意啊,先用 uname -r 追踪一下你的核心版本再说!如果你是安装 2004 年以后推出的 distributions ,那就不需要担心了,因为这些 distributions 几乎都使用 kernel 2.6 版的核心。
9.3.2 封包进入流程:规则顺序的重要性
比对与分析顺序是很重要的
例子:
假设我预先定义 10 条防火墙规则好了,那么当 Internet 来了一个封包想要进入我的主机, 那么防火墙是如何分析这个封包的呢?
上图中主要的目的在告知你:『规则是有顺序的』
如果所有的规则,此时就会透过预设动作 (封包政策, Policy) 来决定这个封包的去向。
9.3.3 iptables的表格(table)与链(chain)
刚刚图 9.3-1 的规则内容仅只是图 9.3-2 内的某个 chain 而已! 而预设的情况下,咱们 Linux 的 iptables 至少就有三个表,
包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。 更有甚者,我们还可以自定义额外的链;
- filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的table;与以下链对应
- INPUT: 主要与想要进入我们 Linux 本机的封包有关;
- OUTPUT:主要与我们 Linux 本机所要送出的封包有关;
- FORWARD:这个咚咚与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与下列 nat table 相关性较高。
- nat (地址转换): 是 Network Address Translation 的缩写, 这个table主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与Linux 主机后的局域网络内计算机较有相关;与以下链对应
- PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
- POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
- OUTPUT:与发送出去的封包有关
- mangle (破坏者):这个table主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环境当中,较少使用 mangle 这个表格。
所以说,如果你的 Linux 是作为 www 服务,那么要开放客户端对你的 www 要求有响应, 就得要处理 filter 的 INPUT 链; 而如果你的 Linux 是作为局域网络的路由器,那么就得要分析 nat 的各个链以及 filter 的 FORWARD 链才行。也就是说, 其实各个表格的链结之间是有关系的,
table与chain简单的关系可以由下图这么看:
我们的 iptables 可以控制三种封包的流向:
- 封包进入 Linux 主机使用资源 (路径 A):
- 在路由判断后确定是向 Linux主机要求数据的封包,主要就会透过 filter 的 INPUT 链来进行控管;
- 封包经由 Linux 主机的转递,没有使用主机资源,而是向后端主机流动 (路径 B):
- 在路由判断之前进行封包表头的修订作业后,发现到封包主要是要透过防火墙而去后端,此时封包就会透过路径 B 来跑动。 也就是说,该封包的目标并非我们的 Linux 本机。主要经过的链是 filter 的 FORWARD 以及 nat 的POSTROUTING, PREROUTING。
- 封包由 Linux 本机发送出去 (路径 C):
- 例如响应客户端的要求,或者是Linux 本机主动送出的封包,都是透过路径 C 来跑的。先是透过路由判断, 决定了输出
由于 mangle 这个表格很少被使用,如果将图 9.3-3 的 mangle 拿掉的话,那就容易看的多了:
透过图 9.3-4 你就可以更轻松的了解到,事实上与本机最有关的其实是 filter这个表格内的 INPUT 与 OUTPUT 这两条链,
- 如果你的 iptables 只是用来保护 Linux主机本身的话,那 nat 的规则根本就不需要理他,直接设定为开放即可;
- 如果你的防火墙事实上是用来管制 LAN 内的其他主机的话,那么你就必须要再针对 filter 的 FORWARD 这条链,
- 还有 nat 的 PREROUTING, POSTROUTING 以及OUTPUT 进行额外的规则订定才行。
iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。
iptables中表和链的对应关系如下:
9.3.4 本机的iptables语法
注意: 防火墙的设定主要使用的就是 iptables 这个指令而已
iptables 至少有三个预设的 table (filter, nat, mangle),较常用的是本机的 filter 表格, 这也是默认表格啦。 另一个则是后端主机的 nat 表格,至于 mangle 较少使用 由于不同的 table 他们的链不一样,导致使用的指令语法或多或少都有点差异。
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 <==第 4 条规则 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with <==第 5 条规则 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』进行限制?
范例一的INPUT的5条规则依据输出结果说明:
- ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED<==第 1 条规则
- 只要是封包状态为 RELATED,ESTABLISHED 就予以接受
- ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第 2 条规则
- 只要封包协议是 icmp 类型的,就予以放行
- ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 <==第 3 条规则
- 无论任何来源 (0.0.0.0/0) 且要去任何目标的封包,不论任何封包格式(prot 为 all),通通都接受
- ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 <==第 4 条规则
- 只要是传给 port 22 的主动式联机 tcp 封包就接受
- REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with <==第 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适配卡进来的封包! 这样看就清楚多了
清除规则
[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 的设定为准
政策用法:
[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 而又尚未有任何规则,所以上面的输出结果显示: # 所有的封包都无法进入你的主机!是不通的防火墙设定! (网络联机是双向 的)
9.3.4-3 规则设定
[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 成为受信任的装置,亦即进出 lo 的封包都予以接受
[root@www ~]# iptables -A INPUT -i lo -j ACCEPT
上面并没有列出 -s, -d 等等的规则,这表示:不论封包来自何处或去到哪里,只要是来自 lo 这个界面,就予以接受!
这个观念挺重要的,就是『没有指定的项目,则表示该项目完全接受』
范例二:只要是来自内网的 (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
范例四:记录某个端口
[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 只要有封包来自 192.168.2.200 这个 IP时, 那么该封包的相关信息就会被写入到核心讯息,亦即是 /var/log/messages 这个档案当中
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
范例三:只要来自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
iptables针对tcp特殊封包,
如主动联机SYN标志的封包处理:
范例一:将来自任何地方来源 port 1:1023 的主动联机到本机端的 1:1023 联机丢弃
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP
9.3.4-5 iptables 外挂模块: mac 与 state
状态模块来分析 『这个想要进入的封包是否为刚刚我发出去的响应?』
如果是刚刚我发出去的响应,那么就可以予以接受放行;
用法:
[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 就会主动分析出该封包是否为响应状态,若是的话,就直接予以接受
呵呵! 这样一来你就不需要针对响应的封包来撰写个别的防火墙规则了!这真是太棒了
范例二:针对局域网络内的 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 啦!
9.3.4-6 ICMP 封包规则的比对:针对是否响应 ping 来设计
ICMP 的类型相当的多,而且很多 ICMP 封包的类型都是为了要用来进行网络检测用的!所以最好不要将所有的 ICMP 封包都丢弃!如果不是做为路由器的主机时,通常我们会把 ICMP type 8 (echo request) 拿掉而已,让远程主机不知道我们是否存在,也不会接受 ping 的响应就是了;
用法:
[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
9.3.4-7 超阳春客户端防火墙设计与防火墙规则储存
站在客户端且不提供网络服务的 Linux 本机角色时, 你应该要如何设计你的防火墙呢?
- 规则归零:清除所有已经存在的规则 (iptables -F...)
- 预设政策:除了 INPUT 这个自定义链设为 DROP 外,其他为预设 ACCEPT;
- 信任本机:由于 lo 对本机来说是相当重要的,因此 lo 必须设定为信任装置;
- 回应封包:让本机主动向外要求而响应的封包可以进入本机(ESTABLISHED,RELATED)
- 信任用户:这是非必要的,如果你想要让区网的来源可用你的主机资源时
这次修改的各种设定想要在下次开机还保存,那就得要进行『 /etc/init.d/iptables save 』这个指令加参数;
9.3.5 IPv4 的核心管理功能: /proc/sys/net/ipv4/*
除了 iptables 这个防火墙软件之外,其实咱们 Linux kernel 2.6 提供很多核心预设的攻击抵挡机制喔! 由于是核心的网络功能,所以相关的设定数据都是放置在/proc/sys/net/ipv4/ 这个目录当中。 至于该目录下各个档案的详细资料,可以参考核心的说明文件
/proc/sys/net/ipv4/tcp_syncookies:DOS攻击防御
阻断式服务 (DoS) 攻击法当中的一种方式,就是利用TCP 封包的 SYN 三向交握原理所达成的, 这种方式称为 SYN Flooding。
SYN Cookie 时,主机在发送 SYN/ACK 确认封包前,会要求 Client 端在短时间内回复一个序号,这个序号包含许多原本 SYN 封包内的信息,包括 IP、port 等
若 Client 端可以回复正确的序号,那么主机就确定该封包为可信的,因此会发送 SYN/ACK 封包,否则就不理会此一封包