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查看目前所启动的网络卡界面,目前为全设好的状态
![](https://i-blog.csdnimg.cn/blog_migrate/e2eaa3e996ab8aafb67d654df5327158.png)
3.2 配置文件/etc/sysconfig/network
若只有有一张网卡,那我们就直接手动安装另一张网卡,首先切换目录到 /etc/sysconfig 中,有一个档案 network,其内容为:
![](https://i-blog.csdnimg.cn/blog_migrate/7c1ed585e378011fe6b995466910792f.png)
其中的 FORWARD_IPV4 要设为 yes,才可以去启动 IP 伪装转换
3.3 /etc/sysconfig/network-scripts/ifcfg-eth1
接著到 /etc/sysconfig/network-scripts 目录中,会有下列档案
![](https://i-blog.csdnimg.cn/blog_migrate/c1e115229898a7d0a276f6fb8f120a0b.png)
目前我们要注意的是 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
第七行指定是否在开机后去启动网络卡界面
![](https://i-blog.csdnimg.cn/blog_migrate/1accb25101f9421bb828a49334b12482.png)
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
第七行指定是否在开机后去启动网络卡界面
![](https://i-blog.csdnimg.cn/blog_migrate/a40425677fb9b126a857b10159176d4d.png)
在这我们指定的内部网络,其中网络号码为 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![](https://i-blog.csdnimg.cn/blog_migrate/7c1ed585e378011fe6b995466910792f.png)
这样子就安装好了两张网络卡,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规则,执行下面指令
8. 使用webmin 管理 ipchains
看了上述的说明或许读者会感到十分困难,其实我们也可以使用 webmin 的 Third Party Modules 中 IPchains Firewalling 来管理,如下图所示:
其中有 Disable, Low, Medium, High, Full 五个安全等级,或者可自定规则,如下图所示:
9. 流量统计
http://www.ntop.org/ 是一个网络使用状况监测软件,在互动式模式下,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 (http://www.snort.org)是一个精巧的网络入侵侦测软件(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
cd snort-1.6.3
./configure
make
make install
在此笔者只介绍封包纪录功能,其他功能日后再述。假定我们要将记录档至于首页上可以执行 snort -C -d -D -l /home/httpd/html/snort,结果如下:
当然笔者有作一些安全上的管理,否则所有网络的机密便曝光了,况且因为记录所有资料所以档案会长的很快,所以如果你真要如此记录,请注意控制的细节。底下我们再深入看看。
看到 USER 了吗?接下来当然是 PASS …….
11. 结论:
看到了这里相信大家对 ipchains 的使用应该有进一步的认识,ipchains 的功能实在是很强大,无法去说的很彻底,有些小地方要靠读者去体会才行。另外由 ntop, snort 可以看出网络是如何不安全性,也希望所有网管人员要多重视。(哎!套一句我女儿说的:说别人说自己 :~~)
施势帆,任职于亚东技术学院电机系
吴国华,任职于帆网络研究室
E-mail:shie@digital.oit.edu.tw
URL:http://mouse.oit.edu.tw