分类:
2011-02-25 07:47:10
1. 序言 防火墙基本上是为了预防别人来存取你的网络,进而管制网络上资料的进出,防火墙一端连接外部的网络(经由真实的IP),另一端则连接内部的网络(虚拟的IP),将你内部的网络与外部的网络给隔离开,防火墙成了进入你内部网络的唯一通道,因此任何进出的资料都要经过防火墙,再经由防火墙来决定是否能够通行,因此对于安全性更多加了一份保障。 另外在本文中也介绍两个重量级的软件,方便监看网络流量和过往的网络封包,这也应是防火墙中的功能之一。 2. 防火墙的种类 2.1 封包过滤器 封包过滤器的功能为取得每一个数据包,根据设定的规则去进行过滤,看是否允许数据包的传送或是拒绝封包,数据包过滤器存在于网络层,而且不会影响到数据包中的资料。在 RedHat Linux 中有一个 ipchains的 套件(6.0以上已内含),可以经由它来做数据包过滤器。 2.2 代理服务器(Proxy firewalls) 代理服务器又常被称为应用程序网关,允许通过防火墙间接进入互连网。 3. 开始架设防火墙 网络位址转换 NAT(Netword Address Translation) 由于互连网的发展愈来愈蓬勃,电脑的数量也跟著急遽增加,导致目前 IP 不足,一 IP 难求的现象,所以解决之道要使用虚拟的 IP,相信虚拟 IP 必会成为未来的趋势。网络上保留了特定 IP 供给私人虚拟网络使用,在真实的网络上将不会找到这三组 IP,这些虚拟 IP 位址为: Class A 10.0.0.0 ~ 10.255.255.255Class B 172.16.0.0 ~ 172.31.255.255 Class C 192.168.0.0 ~ 192.168.255.255 3.1 查看网络卡状态 首先必须要有两张网络卡介面,一张对外(使用真实 IP)eth1,一张对内(使用虚拟 IP)eth0,执行 ifconfig -a会出现网络卡的设定值,看是否两张网络卡都有抓到。 在这里要注意的是,可能你抓到的是 eth0 和 eth1的设定值是相反的,也就是说 eth0 对应到的是真实的 IP、eth1 对应到的是虚拟 IP,以笔者的实作,如果是这样的话,必须要做修改,否且网络会连不出去,在下面会提到。 有可能在装好系统开机时,可能会卡在开机时的画面,可能是这样子的话,建议拿掉一张网络卡重开机,设定完之后再插上。 ifconfig -A | more查看目前所启动的网络卡界面,目前为全设好的状态 3.2 配置文件/etc/sysconfig/network 若只有有一张网卡,那我们就直接手动安装另一张网卡,首先切换目录到 /etc/sysconfig 中,有一个档案 network,其内容为: 其中的 FORWARD_IPV4 要设为 yes,才可以去启动 IP 伪装转换 3.3 /etc/sysconfig/network-scripts/ifcfg-eth1 接著到 /etc/sysconfig/network-scripts 目录中,会有下列档案 目前我们要注意的是 ifcfg-eth0、ifcfg-eth1 这两个档案,在你安装完之后它只有 ifcfg-eth0 这个档案,并没有 ifcfg-eth1。首先将 ifcfg-eth0 复制成 ifcfg-eth1,执行 cp ifcfg-eth0 ifcfg-eth1其中 ifcfg-eth1 为对外网络卡的设定档,依自己的设备去修改,其内容为: 第一行指定网络卡的界面为:eth1第三行指定广播位址为:192.192.73.255 第四行指定IP位址为:192.192.73.35 第五行指定网络遮罩为:255.255.255.0 第六行指定网络号码为:192.192.73.0 第七行指定是否在开机后去启动网络卡界面 3.4 配置文件/etc/sysconfig/network-scripts/ifcfg-eth0 在这我们直接修改设定档 ifcfg-eth0,做为内部虚拟的网络卡介面,其内容为: 第一行指定网络卡的界面为:eth0第三行指定广播位址为:192.168.1.255 第四行指定IP位址为:192.168.1.1 第五行指定网络遮罩为:255.255.255.0 第六行指定网络号码为:192.168.1.0 第七行指定是否在开机后去启动网络卡界面 在这我们指定的内部网络,其中网络号码为 192.168.1.0,广播号为 192.168.1.255 所以真正可用的虚拟 ip 位址为 192.168.1.1 ~ 192.168.1.254。 3.5 启动网卡
3.6 设定路由表 当上述的配置文件设定完、启动之后,我们必须替这两个网络去建立 route(路由)。 route的命令为: route add -net network address netmask device
真实网段路由的设法: route add -net 192.192.73.0 netmask 255.255.255.0 gw 192.192.73.1虚拟网段路由的设法: route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1其路由表为: route -n这样子就安装好了两张网络卡,eth1 就做为对外部的网络卡(真实的 IP),eth0 做为对内部的网络卡(虚拟 IP)。 3.7 测试 以 eth1 做为对内的网络介面,其虚拟 IP 位址为 192.168.1.0 ~ 192.168.1.255,因为其第一个为网络号码,最后一个为广播号,所以可用的虚拟 IP 为 192.168.0.1 ~ 192.168.255.254,我们将闸道器(gateway)设为 192.168.0.1、子网络遮罩设为 255.255.255.0,将 192.168.1.2 ~ 192.168.1.254 之间的 IP 分配给内部的机器,之后内部的机器就可以互相通讯(‘ping’),但对于要连出去,还需要一个步骤,那就是使用一支程序,ipchains 来达成这个目的。先针对上述的问题,如果要让内部的机器连接到外部的网络,可先执行: /sbin/ipchains -A forward -s 192.168.0.0/24 - d 0.0.0.0/0 -j MASQ 第一个命令会将来源 192.168.0.0 ~ 192.168.255.255 的封包使用 IP 伪装,将伪装的封包送转送给预设的路由,到外部的网络。 第二个命令会将 forward 的预设政策设为 DENY。 你可以将这两行命令加在 /etc/rc.d/rc.local 档案中,使其每次开机时执行。 对于 ipchains 的使用,会在下面作更详细的说明。 4. 封包过滤防火墙ipchains 若你使用的是新版的 Linux,里面都会有 ipchains 的套件,直接使用就可以让你建立封包过滤防火墙。 4.1 ipchains语法 其选项、来源 ip、目的地 ip、port 可以不加,表示为全部。 ipchains语法: ipchains 命令 input/forward/output 选项 源ip Port 目的ip port -j目标 范例: ipchains -A input -p all -s 192.168.1.2 -d eef.oit.edu.tw 23 -j DENY 4.2 ipchains命令 可以有两种形式来指定,全名方式或缩写方式来表示 --add -A 增加新的 ipchains 规则 4.3 ipchains参数选项 可以有两种形式来指定,全名方式或缩写方式来表示 使用’!’去定义相反的意义:惊叹号’!’有’not’的意义,有许多选项可以加上’!’去使用,表示不是的意思。 例如: -s ! localhost 说明: 表示除了localhost的来源位址都可以。 --proto -p [!] protocol 协定:可以用数字或名字,例如:tcp、icmp、udp及all。 范例: ipchains -A input -p tcp -s 192.168.1.3 -d eef.oit.edu.tw ftp -j DENY 说明:源地址为 192.168.1.3 的主机不能对 eef.oit.edu.tw 这台主机做 ftp 的动作请求。 --source -s [!] 指定来源位址。 5. 封包过滤防火墙ipchains的操作规则 5.1 ipchains规则 首先列出 ipchains 的规则表出来: ipchains -L 分为三大部分: input chains:输入时的过滤规则例如: ipchains -A input -p tcp -s 192.168.1.3 -d 192.192.69.36 www -j DENY 禁止 192.168.1.3 的来源位址去存取目的地 192.192.69.36 的网页 forward chain :执行 IP 伪装的规则例如: ipchains -A forward -s 192.168.1.0/24 -d 0.0.0.0/24 -j MASQ 启动 192.168.1.0~255 的 IP 伪装 output chain:输出时的过滤规则(与 input 相反)例如: ipchains -A output -p tcp -s 192.192.69.36 www -d 192.168.1.3 -j DENY 功用与 input 相同,只不过来源地址、目的地位址要对换 每个所设的规则必须要去符合情况,以及要做些什么(目标)。 举例来说,你可能要去拒绝从 IP 位址 192.168.1.3 的 ICMP 的封包,所以在这里我们的条件必须是协定 ICMP 及来源位址必须是 192.168.1.3,目的地为 192.192.69.39 这台主机(若不设则为全部),目标是’DENY’。 指令写法为: ipchains -A input -p icmp -s 192.168.1.3 -d 192.192.73.35 -j REJECT 5.2 命令的用法 增加新的规则 -A: 我们增加(-A)’input’的规则,要指明封包的来源位址(‘-s 192.168.1.3’)及协定(‘-p ICMP’),及应该结果为拒绝(‘-j DENY’)。 范例: ipchains -A input -s 192.168.1.3 -p icmp -j DENY 说明:拒绝来自192.168.1.3的icmp封包。 删除规则 -D: 我们删除 ipchains 规则有两种方法,首先我们知道在’input’的规则中只有一个(刚刚上面所增加的),也是第一个,所以我们可以使用数字来删除.。 范例: ipchains -D input 1 说明:删除input规则中的第一条。 第二种方法是跟增加新的规则差不多,只不过是增加(-A)换成了删除(-D),这种方法在你如果设定了很多的规则的时候很好用,你可以不必去数它到底是第几个,只要照打一遍就行了,当然必须要一模一样才行。 范例: ipchains -D input -s 192.168.1.3 -p icmp -j DENY 5.3 指定协定种类 使用 '-p'来指定协定种类,其中协定分为 'TCP' (Transmission Control Protocol)、'UDP' (User Datagram Protocol)、'ICMP' (Internet Control Message Protocol)或是全部(all),在这的协定写法没有分大小写,能以数字代替协定。 在 /etc/protocols 中有注明各种协定,其中 tcp 为 6,udp 为 17,icmp 为 1。
5.4 指定UDP和TCP的port 指定来源和目的地的IP位址 -s -d : 来源(-s)和目的地(-d)的表示法有3种:
在斜线(‘/’)的数字代表了IP位址,‘/24’是255.255.255.0,‘/32’是 255.255.255.255,其中比较重要的是’0/0’,指全部。 范例: ipchains -A input -s 0/0 -j DENY 说明: ‘0/0’表示指定所有来源的 IP 位址都会被拒绝,你也可以不加’-s’参数,也是指定所有的来源 IP 位址。 5.5 重要的指定目标 除了去指定协定之外,还可以细分去指定它的 port 例如: 指所有来源位址的 port 80,其中 80 也可以用名字来表示’www’ -p tcp -s 0.0.0.0/0 80 假如要 TCP 封包可以到达 192.168.0.1 的任何 port,但除了 www 这个 port: -p tcp -d 192.168.0.1 ! www 其中惊叹号’!’放置的位址也可以这样指定: -p tcp -d ! 192.168.0.1 www 也可以表示为不是 192.168.0.1 和 www 的 port: -p tcp -d ! 192.168.0.1 ! www 5.6 log 记录 /var/log/message 若你有加上’-l’选项的话,关于 ipchains 的讯息会被记录在 /var/log/message 档案中,在标准的 Linux 系统上,kernel 的输出讯息经由 klogd(kernel logging daemon)所记录。其中的记录为: Jul 18 11:38:28 www kernel: Packet log: input REJECT eth0 PROTO=1 ipchains记录: (1) 日期、时间 5.6 log 记录 /var/log/message 若你有加上’-l’选项的话,关于 ipchains 的讯息会被记录在 /var/log/message 档案中,在标准的 Linux 系统上,kernel 的输出讯息经由 klogd(kernel logging daemon)所记录。其中的记录为: Jul 18 11:38:28 www kernel: Packet log: input REJECT eth0 PROTO=1 ipchains记录: (1) 日期、时间 6. ipchains的范例 在这里要提醒使用者,千万不要用远端登入来使用ipchains,因为常会不小心就把自个儿给关在房外,进不了家,有时候为了要测试关掉 telnet 的功能,就这样连自己也 telnet 不进去了,当然跑到主机前去修改是免不了的事。 关闭所有的服务: 基于安全的理由,我们要把所有对内、对外的窗口给统统关闭起来,执行下列指令将会将进入、输出、转送封包的预设政策设为拒绝,这一步最好放在你最后的时候再来做,因为如果先设了所有 DENY 的规则,则后来设的 ACCEPT 规则会被先前的 DENY 给取代。 ipchains -P input DENY 启动虚拟 IP 的伪装服务: 将内部虚拟 IP192.168.0.0 ~ 255 启动 IP 封包转送到外界的网络,使之可以连到外界的任何地方去。 ipchains -A forward -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQ 7. 使用ipchains-save、ipchains-restore 储存设定值 ipchains 有二支程序去储存、反存我们所设的规则,ipchains-save 可以储存一个或所有的规则,它是指令档,会先去读取 ipchains 的设定档并且储存成档案起来,使用时可以加入 -v 参数,列出详细的动作。 范例: ipchains-save -v > filename 结果: 若要恢复ipchains规则,执行下面指令 8. 使用webmin 管理 ipchains 看了上述的说明或许读者会感到十分困难,其实我们也可以使用 webmin 的 Third Party Modules 中 IPchains Firewalling 来管理,如下图所示: 其中有 Disable, Low, Medium, High, Full 五个安全等级,或者可自定规则,如下图所示: 9. 流量统计 是一个网络使用状况监测软件,在互动式模式下,ntop 会将网络的使用状况显示在使用者的终端机画面上。在 Web 模式中,ntop 会像 Web Server 一样产生出内含网络使用状况的网页传回到使用者的浏览器上。在 RedHat 7.0 powertools 中有 ntop-1.3.1.-2.i386.rpm,所以在 RedHat 7.0 下使用 rpm -ivh ntop-1.3.1.-2.i386.rpm 安装,然后用 ntop -d 执行即可,执行 web 输出画面如下:(笔者使用的是 1.1 版) 10. 流量记录 Snort ()是一个精巧的网络入侵侦测软件(IDS)。具有执行即时流量分析与封包纪录功能的特性,提供了协定的分析,封包内容的搜寻。可用来侦测各种不同的攻击与调查 (如 buffer overflows,stealth port scans,CGI attacks,SMB probes,OS fingerprinting attempts 等等)。Snort 使用 flexible rule based language 来设定那些流量应该被收集,那些应该放行。他也具有模组化的侦测引擎。Snort 具有即时警告的特性,其警告的机制可使用 syslog,使用者自订的档案,UNIX socket 或是使用 Samclient 传递 WinPopup 讯息给 Windows client 端的使用者。(取自 LinuxFAB.cx) 取得 snort-1.6.3.tar.gz ,然后执行下列步骤安装: tar xvfz snort-1.6.3.tar.gz 在此笔者只介绍封包纪录功能,其他功能日后再述。假定我们要将记录档至于首页上可以执行 snort -C -d -D -l /home/httpd/html/snort,结果如下: 当然笔者有作一些安全上的管理,否则所有网络的机密便曝光了,况且因为记录所有资料所以档案会长的很快,所以如果你真要如此记录,请注意控制的细节。底下我们再深入看看。 看到 USER 了吗?接下来当然是 PASS ……. 11. 结论: 看到了这里相信大家对 ipchains 的使用应该有进一步的认识,ipchains 的功能实在是很强大,无法去说的很彻底,有些小地方要靠读者去体会才行。另外由 ntop, snort 可以看出网络是如何不安全性,也希望所有网管人员要多重视。(哎!套一句我女儿说的:说别人说自己 :~~) |