发信人: rgb (网上邻居【还在等】), 信区: UNIX_PALACE
标  题:  Linux Firewall Proxy Howto(中文版)
发信站: 笑书亭 (Sat Jun 13 14:44:03 1998), 转信

Linux 防火墙-代理 HOWTO

1.导论

这篇文章源于David Rudder(email:drig@execpc.com)的Firewall-HOWTO,我是在他的认可
下对其改进的,在此我向他表示感谢.

近年来,防火墙在internet安全中得到了极大的青睐.和其他备受青睐的事物一样,随之产
生了许多误解.这篇HOWTO的文章将介绍防火墙,代理服务器的概念及安装.以及防火墙技
术在安全领域以外的应用.

1.1 读者反馈
 

欢迎读者各种形式的反馈.请随时指正本文的任何不当之处!!!我非完人,错误难免.但我
会非常乐意修正所有您指出的不当之处.我会尽量回复每一封e-mail,但若因繁忙可能延
迟回复,请见量.
 

我的email地址是: markg@netplus.net
 

[译者注:译文中一定有很多错误是由译者造成,同样欢迎来信指正:
                                       netium@writeme.com]
 

1.2 声明
 

本人不对基于本文的任何行为造成的结果负责.这份文档的本意是介绍防火墙和代理服务
器的工作原理.我不是,也无意装作是一个安全专家.我只是一个爱计算机甚于大多数人的
书虫.写这份文档来帮助人们熟悉这个主题,但并不打算让它来支配我的生活.
 

[译者声明: 我同样不对基于本文的任何行为造成的结果负责. 我只是一个大四的学生,
在翻译本文之前仅对防火墙有最初步的了解, 翻译这份文档是为了让更多的人了解并有
效的使用linux和防火墙,而不打算承担额外的责任]

1.3 版权声明

除非另外声明,linux HOWTO文件的版权属于他们各自的作者.linux HOWTO文件可以被部
分或整体的以任何媒体传播,前提是必须附加此版权声明.也允许和鼓励商业性的散发和
复制,但必须事先通知作者.
 

所有linux HOWTO的翻译,派生文档必须附带此版权声明.即,你不能对任何派生文档附加
任何限制.有些情况可作为例外处理,但必须征得linux HOWTO维护组织
(linux HOWTO coordinator)的认可.
 

简言之,我们希望在保留linux HOWTO版权的同时,以尽量多的途径促进它的传播,并乐于
看到任何的关于linux HOWTO的传播计划.

如果有问题,可以联系 Mark Grennan<markg@netplus.net>
 

[译注:译者不是法律专业人员(连法律专业的辍学生都不是:),无意纠缠字里行间的法律
因素,在此附上原文,有任何出入,请以原文为准!

Unless otherwise stated, Linux HOWTO documents are copyrighted by their
respective authors. Linux HOWTO documents may be reproduced and distributed
in whole or in part, in any medium physical or electronic, as long as this
copyright notice is retained on all copies. Commercial redistribution is
allowed and encouraged; however, the author would like to be notified of
any such distributions.

All translations, derivative works, or aggregate works incorporating any Linux
HOWTO documents must be covered under this copyright notice. That is, you may
not produce a derivative work from a HOWTO and impose additional restrictions
on its distribution. Exceptions to these rules may be granted under certain
conditions; please contact the Linux HOWTO coordinator.

In short, we wish to promote dissemination of this information through as many
channels as possible. However, we do wish to retain copyright on the HOWTO
documents, and would like to be notified of any plans to redistribute the
HOWTOs.

If you have any questions, please contact Mark Grennan at <markg@netplus.net>.

]
 

1.4 写作动机
 

虽然近年来在comp.os.linux.*新闻组中对防火墙有了相当多的讨论,我仍然发现很难找到
关于建立防火墙的足够资料. 这份文章早先版本是非常有帮助的,但还不够充分,本文通过
对David Rudder的 Fire WallHOWTO的改进,为使人们能在短时间内掌握建立防火墙所需的
信息.

1.5 未完成部分

*关于设置客户端的说明.

*为linux找一个支持UDP的代理服务器(译注:现以解决)
 

1.6 深入阅读

The NET-2 HOWTO

The Ethernet HOWTO

The Multiple Ethernet Mini HOWTO

Networking with Linux

The PPP HOWTO

TCP/IP Network Administrator's Guide by O'Reilly and Associates

The Documentation for the TIS Firewall Toolkit

 

Trusted Information System's (TIS) 的WEB节点收集了大量的有关防火墙的资料:

http://www.tis.com/
 

我正致力于一个名为"Secure Linux"的计划,在我的站点收集任何关于建立一个安全的
linux系统的资料.如果你对此有兴趣,可以用e-mail跟我联系.
 

2.防火墙初探

防火墙来自汽车工业上的一个术语,原指汽车上的隔离引擎和乘客的装置,用以在引擎起
火时保护乘客,但并不妨碍驾驶员对引擎的控制。

计算机领域中的防火墙指得是用来保护内部网络不受外部网络(整个Internet)非法侵入
的设备。
 

从现在开始,我们把“防火墙计算机”简称为“防火墙”,指的是可同时访问内部网
Internet的计算机.内部网络是不允许直接访问internet,反之亦然。
 

内部网的使用者要想访问internet,必须先登录到防火墙,才能进行访问。
 

最简单的防火墙形式是一个连结两个网络的系统。如果你能 *完全信任你的所有用户*,
可以简单地安装一个linux(编译内核时 *关掉* IP forwarding/gatewaying选项开关)
并分配给每个用户帐号,他们便可以登录进来并进行telnet,ftp,读取信件,或进行其它
你所允许的internet访问.根据这种配置,在你的内部网中唯一具有完全Internet连接能
力的是防火墙.而内部网中的其余部分甚至可以不必设置缺省路由.
 

但在此必须强调的是:你能够 *完完全全信任你的所有用户* ----我不推荐这种方案.
 

2.1 防火墙的缺点
 

"过滤型"防火墙很大程度上限制了外界对内部网的访问,因为只有那些没被过滤掉的服才
能接受访问.而对于代理防火墙,外部用户可先登录到代理服务器,再对内部网进行他们所
允许的各种访问.
 

同时,随着各种新网络客户和服务器类型的不断涌现,在使用它们之前,你必须找到控制访
问的新方法.
 

2.2 防火墙的类型

有两种类型:

1.IP包过滤防火墙---只允许指定的网络传输.

2.代理服务器----为你代理网络连接.

2.2.1 IP包过滤防火墙

IP包过滤防火墙运作在网络传输包这一层。它通过对每个包所带的源,目的地址,端口号及
包的类型这些信息来控制对其的传输。
 

这种类型的防火墙相当安全,但缺少跟踪记录手段。它可以有效阻止外部用户的非法访
问,但却不能给你任何信息关于谁在访问你内部网络的公共系统及谁通过内部网络访问
Internet.

过滤防火墙是纯粹意义上的过滤器。使用过滤防火墙,你无法做到只让特定的人来访问
你的内部服务器----除非你一下子给所有人(来自同一IP的人:译注)同样的访问权.

Linux从核心1.3.x起提供了对包过滤的支持.
 

2.2.2 代理服务器(防火墙)
 

代理服务器允许通过防火墙间接访问INTERNET.一个很形象的比方,你可以先telnet到一
台机器上,再从那里telnet别的机器.唯一区别是代理服务器自动的.当你的客户程序访问
防火墙时,代理服务器启动自己的客户程序,替你传输数据.
 

正因为通过代理服务器复制了所有的通讯信息,它能够记录下所做的一切.

对于这种类型的防火墙,最了不起的是,只要配置正确,它们是绝对安全的.它们不会让有些
人通过。 因为这种防火墙没有直接的IP路由.
 

3.防火墙的安装
 

3.1 硬件要求
 

一台16M内存的486-6/DX,并具有500M的Linux分区的计算机.装有两块网卡,分别接到我们
的专有局域网和一个我们称之为"非军事化区(DMZ)"的局域网.同时DMZ可通过一个路由器
连到Internet.
 

这是很典型的防火墙计算机配置.也可以用一块网卡加一个PPP拨号接入Internet的MODEM.
关键在于,防火墙必须具有两个IP地址.
 

现在已经有很多家庭小型局域网,通常有两三台机器组成.这时你就可以考虑把所有的
MODEM装到一台Linux机器(可能是个老式的386),同时连接Internet。这样,在一个人使用
时,如果你有两个modem,可能使连接速率加一倍!
-)
 

4.防火墙应用软件

4.1 可供选择的软件包
 

如果你仅需要一个包过滤防火墙,则Linux加上基本的网络包就足够了.
 

你所用的Linux发行包中有可能没有随带一个IP Firewall Administration 的软件包.
 

IPFWADM在 :

http://www.xos.nl/linux/ipfwadm/
 

如果你要的是一个代理防火墙,可能得选下面者之一:
1.SOCKS
2.TIS 防火墙工具包(FWTK)
 

4.2 TIS 防火墙工具包与SOCKS的比较
Trusted Information
System(http://www.tis.com)出品了一系列实现防火墙的软件.其功能与SOCKS基本类似,
但设计策略不同.SOCKS一个程序就完成所有的INTERNET传输功能.而TIS为每个功能提供
了单独的程序.

为进一步区别,我们以www和telnet为例来说明.对于SOCKS,我们只需设置一个配置文件
和守护进程,就可以通过防火墙进行www和telnet-----以及其他任何一些你没有被设置
成禁止的访问.但若使用TIS,你得为www和telnet设置各自的配置文件和守护进程.
 
而其他的INTERNET访问仍是被拒绝,直到你专门地为其作了设置.如果你没对某种特定的
功能(比如talk)设置守护进程,可以使用一个"plug-in(插件)"守护进程,但它既不灵活,
也不象其他工具配置起来那么简单。
 

SOCKS容易编译和设置,而且非常灵活;但如果你想规范内部用户的管理,TIS提供了更好的
安全性.两者都能绝对禁止外部的非法访问.

 
5.准备Linux

5.1 编译内核
 

先对Linux系统来一次'干净'的安装(我使用的版本是Redhat3.0.3,所有实例都基于该版本.)
所装的组件越少,系统的后门,安全漏洞就越少.所以只装一个最小的系统就够了.
选择一个稳定的内核.我使用Linux 2.0.14 kernel,本文档的描述也基于其上.
下一步是用适当的选项编译内核.这时你可能需要参考Kernel HOWTO,Ethernet
HOWTO,及NET-2 HOWTO.
这里是'make config'过程中涉及到的跟网络部分有关的选项

1.在'Gernal setup'中

  1.Networking Support-->On

2.在'Networking Options'中

  1.Networkfirewalls--> On

  2.TCP/IP Networking--> On

  3.IP forwarding/gatewaying-->OFF(除非你选择IP过滤防火墙)

  4.IP Firewalling-->On

  5.IP packet loggin--> On(不是必须的,却不失为一个好主意)

  6.IP masquerading-->OFF(我没有涉及该主题)

  7.IP accounting--> ON

  8.IP tunneling--> OFF

  9.IP aliasing-->OFF

  10.PC/TCP compatibility mode-->OFF

  11.IP Reverse ARP OFF-->OFF

  12.Drop source routed frames-->ON
 

3.在'Network device support'中

  1.Network device support-->ON

  2. Dummy net driver support--> ON

  3.Ethernet (10 or 100Mbit)--> ON
 

4.选择你的网络接口卡.

现在可以开始重编译了,编译后重新按装内核并reboot,启动时Linux会显示你的网卡,
否则你得再去研究其它的HOWTO.
 

5.2 配置两块网卡
如果你有两块网卡,多半情况下你要在/etc/lilo.conf中加一条append语句给出它们的中
断号和I/O地址.
这是我的lilo append语句:
append=“ether=12,0x300,eth0 ether=15,0x340,eth1”

5.3 配置网络地址
这部分非常有意义。现在你面临着几种选择。显然我们并不打算允许Internet对内部网进
行任何形式的非授权访问,因此也没有必要使用真正的IP地址.有些IP是专门保留供专有网
络使用的.因为IP总是越多越好,而这些保留IP不能在网上流通,恰好适合我们的需要.

在这里,我们使用保留IP:192.168.2.xxx,并将它作为以后的例子

你的代理防火墙将同时是内部和外部网的成员,使其得以在两者之间传送数据.
 

            199.1.2.10   __________    192.168.2.1
      _  __  _        \ |          | /           _______________
     | \/  \/ |        \| Firewall |/           |               |
    / Internet \--------|  System  |------------| Workstation/s |
    \_/\_/\_/\_/        |__________|            |_______________|
 

 

即使你采用过滤防火墙,仍然可以使用这些IP,只不过要进行IP屏蔽(IP masquerading).
这时,防火墙在传递包的同时会自动将地址转换成能在internet上流通的"真正"的IP地址.
必须把"真"IP分配给连接internet一端的网卡,同时把192.168.2.1分配给内部的那一个.
这将是内部使用的代理/网关地址,最后给内部网的机器分配其他在192.168.2.xxx范围内
的地址(192.168.2.2 到192.168.2.254)
 

我用的是RedHat Linux,为了能在启动时进行网络配置,我在
/etc/sysconfig/network-scripts 目录中加入了一个'ifcfg-eth1'
文件,该文件在启动时由系统读取,配置网络和路由表.
我的 ifcfg-eth1文件:
#!/bin/sh
#>>>Device type: ethernet
#>>>Variable declarations:
DEVICE=eth1
IPADDR=192.168.2.1
NETMASK=255.255.255.0
NETWORK=192.168.2.0
BROADCAST=192.168.2.255
GATEWAY=199.1.2.10
ONBOOT=yes

#>>>End variable
declarations
这种脚本语言还可以用来实现MODEM对ISP的自动连接,参见ipup-ppp脚本.
如果是用MODEM连接外部网络(internet),则外部IP在连接开始时由你的ISP分配.

5.4 测试
先要检查你的ifconfig 和route,对于两块网卡的系统,ifconfig的结果大致会是这样:
#ifconfig

lo Link encap:Local Loopback

inet addr:127.0.0.0 Bcast:127.255.255.255 Mask:255.0.0.0

UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1

RX packets:1620 errors:0 dropped:0 overruns:0

TX packets:1620 errors:0 dropped:0 overruns:0

eth0 Link encap:10Mbps Ethernet HWaddr 00:00:09:85:AC:55

inet addr:199.1.2.10 Bcast:199.1.2.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0

TX packets:0 errors:0 dropped:0 overruns:0

Interrupt:12 Base address:0x310

eth1 Link encap:10Mbps Ethernet HWaddr 00:00:09:80:1E:D7

inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0

TX packets:0 errors:0 dropped:0 overruns:0

Interrupt:15 Base address:0x350

并且,你的route表输出应该是:
#route -n

Kernel routing table

Destination Gateway Genmask Flags MSS Window Use Iface

199.1.2.0 * 255.255.255.0 U 1500 0 15 eth0

192.168.2.0 * 255.255.255.0 U 1500 0 0 eth1

127.0.0.0 * 255.0.0.0 U 3584 0 2 lo

default 199.1.2.10 * UG 1500 0 72 eth0

这里要注意:199.1.2.0是在防火墙的INTERNET一方,而192.168.2.0在内部网一方.
现在可以试着从内部网ping Internet,我的选择是nic.ddn.mil,这本应是个很好的目标,
事实上却不如我想象的那么可靠. 如果没有回应,再试一下其他没有和你LAN相连的地方,
若还是不行,你的PPP设置一定有问题,你只好再去看看Net-2HOWTO了.
接下去,再从防火墙内部 ping 内部网的机器,所有内部网的机器应该互相PING得通,如果
ping不通----NET-2 HOWTO:)
下一步,由内部网ping防火墙的外部地址(注意不是192.168.2.xxx).若能ping到, 说明你
还没有关闭IP Fowarding,如果这确是出自你的本意,可以去参考本文中IP过滤的部分章节.
现在,试着通过防火墙PING Internet. 还是用前面用过的(le.nic.ddn.mil)[在浙大可以
ping alpha.zju.edu.cn:)--译注], 如果IP FORWARDING是关上的,应该PING不通,否则应
该可以.
在开启 IP Farwarding的情况下,如果你的内部网络全部使用 "真" IP,而又无法 ping 通
Internet,但可以PING通防火墙的外部地址,就去检查上一级路由器是否为你内部网络的包
进行路由(可能要你的服务提供者解决).
如果你选择保留IP,则不被路由,或者你选择了使用IP屏蔽,则本测试依然适用.
现在,你已经完成了基本的设置.
 

5.5 防火墙安全

开放不必要的服务往往使防火墙为入侵者敞开了方便之门."坏孩子"们可能侵入并根据自
己的需要修改防火墙的设置.

所以首先要关闭所有不用的服务.

/etc/inetd.conf 文件控制着所谓的"超级服务(super server)"。它控制着各种服务的
守护进程,在访问请求到达时启动相应的服务.
 

一定要关闭netstat,systat,tftp,bootp,finger.为关闭某项服务,只须把相应的行最前面
用#注释掉即可.改好后,向inetd进程发一个SIG-HUP信号,即键入命令"kill -HUP <pid>",
<pid>是inetd的进程号.该命令使得inetd重新读入配置数据(inetd.conf),并重新启动.

telnet防火墙的15号端口,这是NETSTATE的端口,如果你仍然得到了 netstat的输出, 说明
inetd没有正确读入修改后的设置.
 

6.安装IP过滤防火墙(IPFWADM)
 

在开始之前,要打开内核的IP forwarding,启动你的系统能够转发所有你发出的数据, 再
配好你的路由表,保证内部网和外部网之间就畅通无阻了, 但我们是要做的是建立一个禁
止任意的访问的防火墙.

在我的系统里,我为防火墙的forwading(包递交)和accounting(包记帐)策略各建立一个脚
本文件。加入/etc/rc.d的脚本文件中, 启动时由系统自动调用.
 

缺省情况下,linux kernel的 IP forwarding 功能是完全开放的(是网关:译注)

因此你的防火墙脚本应从规定拒绝所有访问开始。
 

#

# setup IP packet Accounting and Forwarding

#

# Forwarding

#

# By default DENY all services

ipfwadm -F -p deny

# Flush all commands

ipfwadm -F -f

ipfwadm -I -f

ipfwadm -O -f

好,现在我们有了一个超级防火墙,它拒绝所有的访问,当然你还是需要一些服务的,可以
参考下面几个实用的例子:
# Forward email to your server
ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 192.1.2.10 25

# Forward email connections to outside email servers
ipfwadm -F -a accept -b -P tcp -S 196.1.2.10 25 -D 0.0.0.0/0 1024:65535

# Forward Web connections to your Web Server
/sbin/ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 196.1.2.11 80
 

# Forward Web connections to outside Web Server
/sbin/ipfwadm -F -a accept -b -P tcp -S 196.1.2.* 80 -D 0.0.0.0/0 1024:65535

# Forward DNS traffic
/sbin/ipfwadm -F -a accept -b -P udp -S 0.0.0.0/0 53 -D 196.1.2.0/24

你或许对统计流量最感兴趣,下面的脚本就是用来统计包的.可以为每记帐.

# Flush the current accounting rules
ipfwadm -A -f

# Accounting
/sbin/ipfwadm -A -f
/sbin/ipfwadm -A out -i -S 196.1.2.0/24 -D 0.0.0.0/0
/sbin/ipfwadm -A out -i -S 0.0.0.0/0 -D 196.1.2.0/24
/sbin/ipfwadm -A in -i -S 196.1.2.0/24 -D 0.0.0.0/0
/sbin/ipfwadm -A in -i -S 0.0.0.0/0 -D 196.1.2.0/24
 
 

如果你决定只要包过滤放火墙,可以到此为止了. :-)

7.安装TIS

7.1 获取TIS

可从 ftp://ftp.tis.com/ 下载. 别重复我犯过的错误. 好好读一下那里的README文件.
TISfwtk是放在一个隐含目录中的.TIS要求你向fwtk-request@tis.com 发信申请,信的正
文只写SEND,不用写标题,在12小时内,你将会得到系统自动答复,即包含fwtk源码的隐含
目录名称.

我得到的TIS是2.0(beta)版,编译没问题(一点exception),工作的也很好.下面的描述都
基于该版本.当他们发布正式版时,我将更新这份文档.

安装FWTK前,先在你的/usr/src目录下建立一个fwtk-2.0目录.把FWTK (fwtk-2.0.tar.gz)
copy到目录下并解压 (tar zxf fwtk-2.0.tar.gz).

FWTK本身不支持对SSL web的代理,但有一个addon,作者是Jean-Christophe Touvet.可从:

ftp://ftp.edelweb.fr/pub/contrib/fwtk/ssl-gw.tar.Z

下载.Touvet不对其提供技术支持.

我这里用的是一个经过修改,能够支持Netscape secure news servers的版本,作者是:
Eric Wedel.站点是:

ftp://mdi.meridian-data.com/pub/tis.fwtk/ssl-gw/ssl-gw2.tar.Z.
 

安装时在/usr/src/fwtk-2.0目录下建立一个ssl-gw目录就可以了.在编译之前,要对代码
作一些改动.
 

首先是ssl-gw.c少了一个include文件,在其中加入:
 

#if defined(__linux)

#include <sys/ioctl.h>

#endif
 

再就是其中没有包含makefile,我的解决方法是从其它网关目录中copy一个,再把网关名字
改成: ssl-gw

7.2 编译TIS FWTK

FWTK的2.0版在比以前任何版本都要容易编译得多,但在这个BETA版中我仍然发现了一些需
要纠正的地方.希望这些错误在正式版中能够得到纠正.
先到 /src/fwtk/fwtk 目录,用Makefile.config.linux 拷贝覆盖 Makefile.config 这个
文件.
注意:千万不要按操作指示中说的那样运行fixmake.否则会搞坏每个目录中的makefile.
我有一个解决fixmake的方法,是用sed在makefile中每个包含include的行中加入'.'和''.
相应的sed脚本为:

sed 's/^include[ ]*\([^ ].*\)/include \1/' $name .proto > $name
然后我们得编辑Makefile.config.有两处需要修改.
作者是在他的home目录中编译代码的, 而我们把代码放在 /usr/src, 因此要对环境变量
FWTKSRCDIR作相应改动:
FWTKSRCDIR=/usr/src/fwtk/fwtk
其次,有些linux系统使用gdbm数据库.而Makefile.config中缺省的是dbm也许你的需要修
改.我的/linux版本是 redhat 3.0.3.
DBMLIB=-lgdbm
最后一处在x-gw中,这个BETA版的socket.c有BUG,解决方法是去掉下面的一段代码:

#ifdef SCM_RIGHTS /* 4.3BSD Reno and later */
+ sizeof(un_name->sun_len) + 1
#endif

如果你在FWTK源目录中加入了ssl-gw,还要把它的目录加到 Makefile里:
 
DIRS=smap smapd netacl plug-gw ftp-gw tn-gw rlogin-gw http-gw x-gw ssl-gw

现在,可以运行make了.

 

7.3 安装TIS FWTK
 

运行 make install

缺省的安装目录为/usr/local/etc.你可以把它改到一个更安全的目录,我没改,而是把这
个目录的权限设为'chmod 700'.

剩下的就只有配置工作了.

 
7.4 配置 TIS FWTK
这才是真正引人入胜的部分.我们要让系统能够调用这些新加入的服务,并建立相应的控制
信息.

我不想重复TIS FWTK手册的内容.只说明一些我所遇到的问题及其解决方法.

有三个文件组成了所有的控制.
* /etc/services  告诉系统服务所在的端口
* /etc/inetd.conf  决定inetd在某端口收到服务请求时调用哪个程序
*/usr/local/etc/netperm-table  决定FWTK对服务请求的许可/拒绝为使 FWTK 发挥作用,
你最好从头编辑这些文件.忽略其中任何一个都可能导致系统失效.

 

netperm-table
该文件用来控制对TIS FWTK服务的访问授权.要同时考虑防火墙两边的情况.外部的用户必
须经过验证后才能获得访问权,内部用户则可以允许直接通过.
 

TIS 防火墙可以进行身份验证,系统通过一个authsrv的程序管理一个用户ID和密码的数据
库。netperm-table的授权部分指定了数据库的位置及访问权限.
 

我在禁止对该服务读取时遇到了一些麻烦.注意我给出的是在permit-host行中 '*'表示给
所有用户访问权.而正确的设置应该是

'' authsrv: premit-hosts localhost.

#

# Proxy configuration table

#

# Authentication server and client rules

authsrv: database /usr/local/etc/fw-authdb

authsrv: permit-hosts *

authsrv: badsleep 1200

authsrv: nobogus true

# Client Applications using the Authentication server

*: authserver 127.0.0.1 114
 

初始化数据库时,要先su到root,在/var/local/etc下运行./authsrv创建用户的记录,

如下所示:
 

可以在FWTK的文档中找到创建用户及组的信息.
#

# authsrv

authsrv# list

authsrv# adduser admin “Auth DB admin”

ok - user added initially disabled

authsrv# ena admin

enabled

authsrv# proto admin pass

changed

authsrv# pass admin “plugh”

Password changed.

authsrv# superwiz admin

set wizard

authsrv# list

Report for users in database

user group longname ok? proto last

------ ------ ------------------ ----- ------ -----

admin Auth DB admin ena passw never

authsrv# display admin

Report for user admin (Auth DB admin)

Authentication protocol: password

Flags: WIZARD

authsrv# ^D

EOT

#
 
 

telnet网关是最直截了当的并且是你第一个需要设置的.

在我的例子中,所有内部的用户无须认证(permit-hosts 196.1.2.* -passok-xok),而其余
用户必须经过ID和密码的验证.(permit-hosts *-auth)我还特别允许 196.1.2.202的用户
不经过防火墙直接访问代理服务器.有关inetacl-in.telnetd的两行表现了这一点,接下去
我就会解释调用的过程.

Telnet的timeout应尽量设小.

# telnet gateway rules:

tn-gw: denial-msg /usr/local/etc/tn-deny.txt

tn-gw: welcome-msg /usr/local/etc/tn-welcome.txt

tn-gw: help-msg /usr/local/etc/tn-help.txt

tn-gw: timeout 90

tn-gw: permit-hosts 196.1.2.* -passok -xok

tn-gw: permit-hosts * -auth

# Only the Administrator can telnet directly to the Firewall via Port 24

netacl-in.telnetd: permit-hosts 196.1.2.202 -exec /usr/sbin/in.telnetd
 

rlogin的命令与telnet相仿.

# rlogin gateway rules:

rlogin-gw: denial-msg /usr/local/etc/rlogin-deny.txt

rlogin-gw: welcome-msg /usr/local/etc/rlogin-welcome.txt

rlogin-gw: help-msg /usr/local/etc/rlogin-help.txt

rlogin-gw: timeout 90

rlogin-gw: permit-hosts 196.1.2.* -passok -xok

rlogin-gw: permit-hosts * -auth -xok

# Only the Administrator can telnet directly to the Firewall via Port

netacl-rlogind: permit-hosts 196.1.2.202 -exec /usr/libexec/rlogind -a

不要允许任何人直接访问你的防火墙,即使FTP访问也不行.因此要避免在防火墙机器上安
装FTP服务.
 

值得重申的是,这里允许所有内部用户自由访问Internet,而其他用户则必须通过验证. 我
还启用了文件收发的记录.
 

(-log { retr stor })

 
ftp timeout指定防火墙对一个失效FTP连接的最长等待时间.
 

# ftp gateway rules:

ftp-gw: denial-msg /usr/local/etc/ftp-deny.txt

ftp-gw: welcome-msg /usr/local/etc/ftp-welcome.txt

ftp-gw: help-msg /usr/local/etc/ftp-help.txt

ftp-gw: timeout 300

ftp-gw: permit-hosts 196.1.2.* -log { retr stor }

ftp-gw: permit-hosts * -authall -log { retr stor }
 

Web,gopher, 和基于浏览器的FTP由http-gw来完成. 前两行建立目录来缓存通过防火墙的
web页面和ftp文件,我把这些文件的所有者设为root,并保存在只有root才能访问的目录中.
 

Web connection应保持在一个较小的值,它控制用户等待一个失效连接的时间.
 

# www and gopher gateway rules:

http-gw: userid root

http-gw: directory /jail

http-gw: timeout 90

http-gw: default-httpd www.afs.net

http-gw: hosts 196.1.2.* -log { read write ftp }

http-gw: deny-hosts *
 

ssl-gw只有一个传递作用, 要小心设置. 在这里, 我允许内部用户访问除 127.0.0.* 和
192.1.1.*以外的所有外部地址.且只能访问443到563端口,这些是通用的SSL端口.
 

# ssl gateway rules:

ssl-gw: timeout 300

ssl-gw: hosts 196.1.2.* -dest { !127.0.0.* !192.1.1.* *:443:563 }

ssl-gw: deny-hosts *
 

下例说明怎样使用plug-gw代理news server,只允许内部用户访问一个外部server,且只能
访问一个端口。
 
第二行设置允许news server将数据送入内部网.
 

几乎所有的news client在用户阅读news时保持连接状态,因此这里给news server规定了
一个较长的等待时间(time out).
 

# NetNews Pluged gateway

plug-gw: timeout 3600

plug-gw: port nntp 196.1.2.* -plug-to 199.5.175.22 -port nntp

plug-gw: port nntp 199.5.175.22 -plug-to 196.1.2.* -port nntp
 

finger-gw比较简单,任何内部用户只能先登录到防火墙,再运行finger,其他访问者将得到

一个信息(finger.txt).

# Enable finger service

netacl-fingerd: permit-hosts 196.1.2.* -exec /usr/libexec/fingerd

netacl-fingerd: permit-hosts * -exec /bin/cat /usr/local/etc/finger.txt
 

我没有作过Mail和X-windows服务的代理,无法提供相应的例子,欢迎来信补充.
 

关于inetd.conf
 

下面是一例inetd.conf文件,所有不必要的服务都被注释掉了. 但我还是包括了整个文件,
以阐明怎样关闭服务及为防火墙开启新服务.

#echo stream tcp nowait root internal

#echo dgram udp wait root internal

#discard stream tcp nowait root internal

#discard dgram udp wait root internal

#daytime stream tcp nowait root internal

#daytime dgram udp wait root internal

#chargen stream tcp nowait root internal

#chargen dgram udp wait root internal

# FTP firewall gateway

ftp-gw stream tcp nowait.400 root /usr/local/etc/ftp-gw ftp-gw

# Telnet firewall gateway

telnet stream tcp nowait root /usr/local/etc/tn-gw /usr/local/etc/tn-gw

# local telnet services

telnet-a stream tcp nowait root /usr/local/etc/netacl in.telnetd

# Gopher firewall gateway

gopher stream tcp nowait.400 root /usr/local/etc/http-gw /usr/local/etc/http-gw

# WWW firewall gateway

http stream tcp nowait.400 root /usr/local/etc/http-gw /usr/local/etc/http-gw

# SSL firewall gateway

ssl-gw stream tcp nowait root /usr/local/etc/ssl-gw ssl-gw

# NetNews firewall proxy (using plug-gw)

nntp stream tcp nowait root /usr/local/etc/plug-gw plug-gw nntp

#nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd

# SMTP (email) firewall gateway

#smtp stream tcp nowait root /usr/local/etc/smap smap

#

# Shell, login, exec and talk are BSD protocols.

#

#shell stream tcp nowait root /usr/sbin/tcpd in.rshd

#login stream tcp nowait root /usr/sbin/tcpd in.rlogind

#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd

#talk dgram udp wait root /usr/sbin/tcpd in.talkd

#ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd

#dtalk stream tcp waut nobody /usr/sbin/tcpd in.dtalkd

#

# Pop and imap mail services et al

#

#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d

#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d

#imap stream tcp nowait root /usr/sbin/tcpd imapd

#

# The Internet UUCP service.

#

#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l

#

# Tftp service is provided primarily for booting. Most sites

# run this only on machines acting as “boot servers.” Do not uncomment

# this unless you *need* it.

#

#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd

#bootps dgram udp wait root /usr/sbin/tcpd bootpd

#

# Finger, systat and netstat give out user information which may be

# valuable to potential "system crackers." Many sites choose to disable

# some or all of these services to improve security.

#

# cfinger is for GNU finger, which is currently not in use in RHS Linux

#

finger stream tcp nowait root /usr/sbin/tcpd in.fingerd

#cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd

#systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx

#netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet

#

# Time service is used for clock syncronization.

#

#time stream tcp nowait root /usr/sbin/tcpd in.timed

#time dgram udp wait root /usr/sbin/tcpd in.timed

#

# Authentication

#

auth stream tcp wait root /usr/sbin/tcpd in.identd -w -t120

authsrv stream tcp nowait root /usr/local/etc/authsrv authsrv

#

# End of inetd.conf

 

 

关于/etc/services
 

真正的服务是从这里启动的.当一个客户请求到达防火墙计算机的一个已知端口(<1024),
比如telnet的23端口, inetd就在 /etc/services文件中寻找这种服务的名称. 然后调用
inetd.conf中指定的相应的应用程序.
 

我们建立的某些服务通常并不在 /etc/services 中, 你有指定端口的自由. 例如, 我把
administrator的telnet端口指定为24,你甚至可以用2323.因此作为管理员, 访问防火墙
时必须telnet到24端口,另外,如果你象我一样设置了netperm-table, 就只能从内部网用
administrator访问防火墙.

telnet-a 24/tcp

ftp-gw 21/tcp # this named changed

auth 113/tcp ident # User Verification

ssl-gw 443/tcp
 
 

8.SOCKS代理服务器
 

8.1 安装

(译注:本文所有内容均基于 socks4.2(socks4),鉴于socks5已经成为目前的标准,译者
将对两者不同之处尽量注明)。
 

ftp://sunsite.unc.edu/pub/Linux/system/Network/misc/socks-linux-src.tgz可以
得到SOCKS代理服务器。同一个目录中还有一个样本配置文件"socks-conf".解开文件,按
说明make.我碰过一些个问题,关键在于保证Makefile的正确.
 

值得注意的的一点是要把proxy server加入/etc/inetd.conf.你必须加入一行:

(译注:SOCKS5还可以用其它方式启动,具体见其文档)

socks stream tcp nowait nobody /usr/local/etc/sockd sockd
 

用以在请求到来时启动服务.
 

8.2 配置代理服务
 

SOCKS程序需要两个配置文件.一个用来确认访问许可,另一个用于客户同代理服务器之间
的路由.访问许可配置文件在服务器上,而路由配置文件在每台Un*x机器上,Dos可以自己进
行路由,MAC应该也可以自己进行路由。
 

配置访问许可
 

在socks4.2Beta中,配置文件为"sockd.conf".包含两行,分别用于接受和拒绝访问.每行
由三项组成:
 

*标示符 (permit/deny) *IP地址 *地址修饰

标示符的取值为permit/deny,各占一行.
 

IP地址为典型的由句号隔开的4byte格式.比如:192.168.2.0
 

地址修正,与子网屏蔽类似,这个数字有32位,如果某位是1,则它必需与它所检查的IP
地址这一位的值是一样的,例如,如果该行为:
permit 192.168.2.0 255.255.255.0
表示允许在 192.168.2.0 到
192.168.2.255范围内的所有C类地址,下面一行是危险的:
permit 192.168.2.0 0.0.0.0
因为这等于没有地址匹配检查,缺省允许所有访问!
 

因此,首先设定允许范围,再加以限制.下面两行允许来自192.168.2.xxx的所有访问:

permit

192.168.2.0 255.255.255.0

deny 0.0.0.0 0.0.0.0
 

注意后面一行,第一个"0.0.0.0"是什么无所谓,因为它的屏蔽值是"0.0.0.0",用全零只
是为了书写方便.
 

每行多于一项也是合法的.
 

也可以配置成对指定用户访问的接收或拒绝.由身份验证完成.但不是所有的系统都支持,
包括Trumpet Winsock,因此我不再介绍有关内容,具体可参考socks的文挡.

配置路由
 

路由配置文件被冠以一个糟糕的名字:"socks.conf"之所以糟糕是因为同前一个文件名
太象了,容易使人产生误解.
 

路由配置文件决定何时使用sock. 比如说:在我们的网络内, 192.168.2.3 同192.168.2.1
之间的对话不需要使用sock去和防火墙对话,而是通过以太网直接进行.其中也定义了你的
IP回路,127.0.0.1,同样你也不需要用SOCK同自己对话.共有三项:
 

*deny

*direct

*sockd
 
 

Deny指示SOCKS何时拒绝请求.与sockd.conf相同,每行含标识符,IP地址和IP修正三个域.
 

一般说来,这些也由sockd.conf和访问文件处理,所以IP修正这一项可以在这里被设成
0.0.0.0。如果你想让自己那儿都访问不了,你可以在这儿设置。
 

direct指定不通过代理的地址.这些都是可以直接访问的,同样有标识符,IP地址和IP修正
三个域,我们的例子:
 

direct 192.168.2.0 255.255.255.0

指定所有内部网络的地址不用代理.
 

sockd用来说明服务器的地址,这一行的格式为:

sockd @=<serverlist> <IP address> <modifier>
 

注意"@="是要你设置代理服务器的IP列表.我们这里只使用一个服务器,但你可以使用多
个以增加带宽或利用冗余提高稳定性.
 

其余两项同前,设置通过相应代理的地址。
 

在防火墙后设置域名服务器是一项相对简单的工作.你只要在代理服务器上设置DNS服务,
并将其作为墙内机器的DNS即可.
 

8.3 使用代理服务器

8.3.1 UNIX

要使应用程序配合防火墙工作,首先要把他们sockify,你将有两个telnet,一个用于直接
连接,另一个用于通过防火墙的连接.SOCKS中含有关于如何sock化应用程序的文挡,以及
一些已经sock化了的例子.如果你使用sock化的程序去访问直接连接的地址,SOCKS会自动
为你切换成直接连接的版本.

因此,我们可以把墙内机器所有的应用程序替换成AA过的版本,这时,原来的"finger"变成
了"finger.orig","telnet"变成了"telnet.orig"等等.但你必须在/include/socks.h中
告诉SOCKS每项改动.

有些应用程序可以自己处理路由和sockify,比如Netscape,你只要在相应的位置填入代理
服务器的地址(我们这里是192.168.2.1)即可。

8.3.2 MS Windows with Trumpet Winsock

Trumpet Winsock
自带了对代理的支持,在"setup"菜单里填入server的IP和可以直接连接的IP,Trumpet就
可以工作了.

8.3.4 关于UDP包

SOCKS(译注:SOCKS4)只能代理TCP,不支持UDP(译注:SOCKS5全面支持UDP).这使得SOCKS无
法代理象talk,

--
 

发信人: rgb (网上邻居【还在等】), 信区: UNIX_PALACE
标  题: Linux Firewall Proxy Howto译后记(一)
发信站: 笑书亭 (Sat Jun 13 20:03:10 1998), 转信
 

终于能把这份文档完整的POST出来了。初稿早在四月就已完成,但其间由于种种
原因耽搁了下来,现在也终于能理解为什么作者说会"及时更新这份文档"而两年
内却未见动作.
两年内防火墙技术又在突飞猛进,新产品,新技术也层出不穷,但该文档还是具有
指导意义的,主要涉及到的两种产品都已经有了相应的RFC.对于两年内的更新造
成的改动,在译文中已尽量注明.
今年一月底开始接触Linux,就是从fuse找来的各种HOWTO入手的,发现这的确是新手
的好教材.就性质来说,这相当于产品的用户手册. 而这么全面详尽的用户手册, 都
是Linux Hacker们在业余时间里完成的, 不能不说这是 linux奇迹的一个重要组成
部分.
记得有一位台湾的HOWTO译者 (好象是译modules howto的那位) 曾说过, 在GNU 的
世界里待久了,就免不了为GNU精神所感动.我正是经历了这么一个过程. 而 linux
本身正是GNU精神的最佳诠释之一.相信同时还有很多人象我一样,看看各大 BBS的
LINUX版就知道了,总还能记起我在undernet的linux频道里提起 linux 在中国大陆
的流行程度时, 老外们表现出的好奇与兴奋.
我同时也发现,我们对GNU的奉献实在是少得可怜, 这一点我很羡慕台湾同胞们, 无
论在软件创作和汉化, 还是文档翻译的工作上, 他们都走在了我们甚至是世界的前
面.而我们,在相当程度上是在坐享其成----毕竟作内码转换的工作要容易的多.
chat* sigh
事实上, 两岸并不是所有的东西都可以通用,软件也是有其文化背景, 至少科技用语
就存在不小的差异. 我在阅读台湾同胞们翻译的HOWTO时, 感觉并不比原版的省力多
少.而自己又是新手,要为GNU原创作点贡献不太现实的说:P,因此萌发了翻译HOWTO的
念头.
 

--

Life cant be digitized,
Life is more than words,
Time can exile my heart,
Who can escheat neighbor's oath?

m;33m※ 来源:.笑书亭 bbs.zju.ml.org.[FROM: csadm.zju.edu.cn]m
--
m;37m※ 转寄:.笑书亭 bbs.zju.ml.org.[FROM: 210.32.151.168]m
我是作过两次翻译的.
第一次是在96年,为网办的老师翻一本Internet的入门手册,
网虫生涯也是那时开始的吧,当时自然没想到一年之后竟会得到一笔对一个穷学生
来讲颇为不菲的稿费,却在不知不觉中爱上了这一行,总不自觉得想,有多少人会看
这本书呢?我翻的这几章会有用吗?记得后来拿到这本书的时候,并没有太多留意虽
也变成铅字但不在译者中的名字,而是马上翻到某页的插图, 寻找我在编辑图片时
加进的自己的邮件地址;-)也是一个小小的彩旦,呵呵
第二次是在上学期,作为课题组项目的一部分,也作为毕业设计的文献翻译,译得是
某大型纺织CAD系统的用户手册(还是手册:)与纺织行业的术语有了一阵交往---我
翻译术语表.其间也有过很多插曲,令人感慨,离题已有些远了,不提了罢.
这是第三次,初识GNU的我,觉得把纺织术语作为毕业设计的翻译不太对口. 就决定
找份Linux HOWTO来翻.也正是由于把它当作毕业设计的一部分来做, 我的语言里
缺了几分GNU风格的自由活泼,幸好后来QIQI帮我增色不少.翻的时候我也不怎么懂
防火墙,尤其是没看过国内的有关资料,很多名词的译法都是自己揣摩的,但里面涉
及的各种例子,我都找来了相应的版本和最新的版本,一一试过了.star上面的
port 24,就是其中的一个实验,很多网友用过的.说到这里,想起要提一下,zju第一
个fwtk是alan装上的,其实浙大linux的高手实在是很多,我碰到问题时总能得到帮
助.当然,其中被我麻烦最多的该是fuse了:)
本译文的前八章由我完成,第九章由QIQI完成,QIQI对全文进行了整理和校正.
GNU的规定不准对派生,翻译文档的散发作任何形式的限制----若允许,我会加上:
在zju bbs恢复自由登记之前,该文档不得在那里转贴.
把它献给所有的网友和两个心爱的BBS.
sandy

--
  ?

本文转自中文Linux论坛