Chinaunix首页 | 论坛 | 博客
  • 博客访问: 877231
  • 博文数量: 206
  • 博客积分: 10276
  • 博客等级: 上将
  • 技术积分: 2358
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-01 02:41
文章分类

全部博文(206)

文章存档

2014年(1)

2013年(1)

2012年(2)

2011年(10)

2010年(14)

2009年(15)

2008年(33)

2007年(90)

2006年(40)

我的朋友

分类: LINUX

2007-01-31 11:31:41

防火墙基本上是为了预防别人来存取你的网络,进而管制网络上资料的进出,防火墙一端连接外部的网络(经由真实的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.255
    Class 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 启动网卡

启动 关闭
执行 ifconfig eth0 up ifconfig eth0 down
执行 ifconfig eth1 up ifconfig eth1 down

3.6 设定路由表

  当上述的配置文件设定完、启动之后,我们必须替这两个网络去建立 route(路由)。

  route的命令为:

    route add -net network address netmask device
网段 真实网段 虚拟网段
网络号(network) 192.192.73.0 192.168.1.0
网络号(network) 255.255.255.0 255.255.255.0
网关(gateway) 192.192.73.1 192.168.1.1

  真实网段路由的设法:

    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
  /sbin/ipchains -P forward DENY

  第一个命令会将来源 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 规则
  --delete -D 删除第一个 ipchains 规则,或某一个 ipchains 规则
  --insert -I 插入一个新 ipchains 规则,其插入需指定规则中的数字,如果数字为 1 表示为第一个。
  --replace -R 取代所选择的规则,其取代需指定规则中的数字。
  --list -L 列出所选择设定的 ipchains 规则,如果没有规则被指定,会列出所有的规则出来。
  --flush -F 将某个 ipchains 规则清除(例如:input、output、forward)这相当于去删除掉规则的功效。
  --zero -Z 将所有规则中的封包和位元组计数器归零它也可以去指定-L, --list (list) 选项,会先列出之前的资料,再列出归零的资料。
  --check -C 检查封包是否违反所设的规则,这是一个相当有用的测试,其是-s (来源), -d (目的地), -p(协定), -i (界面)更是必要。
  --new -N 产生一个新的使用者定义规则(user-defined)。
  --delete-chain -X 删除使用者定义的规则,如果没有指定任何的参数,它将会所有的定义的规则。
  --policy -P 设定目标的政策,只有 input,forward,output 可以去设定。
  --masquerade -M 这个选项可以去查看现在的伪装连接状况(须加上-L 选项),或是去设定 kernel 伪装参数(-S选项)。
  --set -S 设定伪装停止时间变数
  --help -h 列出描述命令语法的说明。

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 [!] 指定来源位址。
  --source-port [!] port 指定来源的port。
  --destination -d [!] 指定目的地位址
  --destination-port [!] 指定目的地的port
  --icmp-type [!] 类型名称,指定ICMP类型
  --interface -i [!] 网络接口名称 ,lo、eth0、eth1。
  --jump -j 指定规则的目标,如果没有指定的话,这条规则算是没有用处。
  --numeric -n 取消DNS查询,直接使用IP
  --log -l 将关于ipchains的讯息记录起来,记录于/var/log/messages内。
  --verbose -v 完整模式,会列出界面名称、规则、TOS伪装,封包和位元组计数也会列出,须和-L一起使用。
  [!] --syn -y 只有当SYN设定时才会符合TCP封包
  --TOS -t Type Of Service
  [!] --version -V 列出ipchains的版本
  --bidirectional -b 双向模式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。

TCP(传输控制协定):
位于应用层,如果应用程序(http、ftp)需要可靠性高的资料传输方式,那么就可以采用 TCP,TCP 会去检查资料是否安全到达,否则就重新发送资料。将传输的资料以 TCP 格式成为资料段,交由网络层的 IP 协定去处理,每一段资料含有一个检查值,接收者用它来验证资料是否受损,如果接收的资料没有损坏,会传回确认回去;如果资料有损会便会丢弃。TCP 具有可靠性及连线性。

UDP(使用者资料协定):
位于应用层,让应用程序直接使用封包传送服务,如 IP 提供的传送服务,UDP 协定并不会去检查封包是否安全到达目的地,因此传送速度快,但却是一个不可靠、非连线性的封包协定。

ICMP(网络控制讯息协定):
属于网际层的一部分,利用 IP 封包的传送,发送它的讯息,ICMP 发送的讯息执行了如侦测远端机器是否运作(‘ping’)、资料流的控制(当封包到得太快来不及处理时,目的主机传回一个 ICMP 的来源抑制讯息给发送者,告诉资料来源暂时停止传送封包)。
ICMP 并没有 port,但它还是有它的选项参数可以使用,用来选择 ICMP 的类型。
我们可以指定 ICMP 的名称或是数字代表(可以执行 ipchains -h icmp 去列出详细的名字)。
5.4 指定UDP和TCP的port

  指定来源和目的地的IP位址 -s -d :

  来源(-s)和目的地(-d)的表示法有3种:

使用完整的主称名称,例如:‘mouse.oit.edu.tw’ 或 ‘localhost’
使用IP位址,例如:‘192.192.73.36’
允许某范围的IP位址,例如:‘192.192.73.0/24’ 或 ‘192.192.73.0/255.255.255.0’ 两者是一样的,都是包含了192.192.73.0 ~ 192.192.73.255的IP位址。
  在斜线(‘/’)的数字代表了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
(1) (2) (3) (4) (5) (6) (7) (8)
192.168.1.3:8 192.168.1.1:0 L=60 S=0x00 I=7476 F=0x0000 T=32
(9) (10) (11) (12) (13) (14) (15)

  ipchains记录:

(1) 日期、时间
(2) 主机名称
(3) 使用 kernel 来记录
(4) 指出从 ipchains 产生讯息
(5) 所使用的规则:input
(6) 规则的目标:REJECT
(7) 封包所经过的网络卡界面:eth0
(8) 协定号码:1(ICMP)、6(TCP)、17(UDP)
(9) 来源 IP 位址和 port
(10) 目的地 IP 位址和 port
(11) 封包的长度
(12) TOS(Type of service)
(13) IP 的 ID
(14) 资料段偏移
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
(1) (2) (3) (4) (5) (6) (7) (8)
192.168.1.3:8 192.168.1.1:0 L=60 S=0x00 I=7476 F=0x0000 T=32
(9) (10) (11) (12) (13) (14) (15)

  ipchains记录:

(1) 日期、时间
(2) 主机名称
(3) 使用 kernel 来记录
(4) 指出从 ipchains 产生讯息
(5) 所使用的规则:input
(6) 规则的目标:REJECT
(7) 封包所经过的网络卡界面:eth0
(8) 协定号码:1(ICMP)、6(TCP)、17(UDP)
(9) 来源 IP 位址和 port
(10) 目的地 IP 位址和 port
(11) 封包的长度
(12) TOS(Type of service)
(13) IP 的 ID
(14) 资料段偏移(重新组合资料段封包)
(15) 封包的 TTL(Time to live)

6. ipchains的范例

  在这里要提醒使用者,千万不要用远端登入来使用ipchains,因为常会不小心就把自个儿给关在房外,进不了家,有时候为了要测试关掉 telnet 的功能,就这样连自己也 telnet 不进去了,当然跑到主机前去修改是免不了的事。

  关闭所有的服务:

  基于安全的理由,我们要把所有对内、对外的窗口给统统关闭起来,执行下列指令将会将进入、输出、转送封包的预设政策设为拒绝,这一步最好放在你最后的时候再来做,因为如果先设了所有 DENY 的规则,则后来设的 ACCEPT 规则会被先前的 DENY 给取代。

ipchains -P input DENY
ipchains -P forward DENY
ipchains -P output 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规则,执行下面指令
使用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 ( (如 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
cd snort-1.6.3
./configure
make
make install

  在此笔者只介绍封包纪录功能,其他功能日后再述。假定我们要将记录档至于首页上可以执行 snort -C -d -D -l /home/httpd/html/snort,结果如下:
阅读(637) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~