尚待努力方向
o 学习Macintosh的做法
o 学习不同的Windows TCP/IP套装软体
o 找个好用的UDP Proxy Server和Linux搭配
深入研究时的参考资料
o TIS Firewall Toolkit文件
o NET-2 HOWTO
o PPP HOWTO
o Ethernet HOWTO
o MultIPle Ethernet Mini HOWTO
o Networking with Linux
o TCP/IP Network Administrators Guide by OReilly and Associates
Firewall Toolkit by TIS 有一套很棒的文件, 其中有谈到Firewall及相关的资料, 至于Firewall Toolkit的进一步说明, 请看Firewall软体那一节。
了解Firewalls
Firewall原来是汽车上的一个术语, 它用来隔离引擎和乘客, 在引擎爆炸时可以发挥保护乘客的功能。电脑上的Firewall是一个逻辑装置, 用来保护私人的区域
不受公用部份的侵害, 做法是:
1. 找一部有Routing能力的电脑(例如Linux)
2. 加入两个界面(例如: 序列埠、Ethernet、Token Ring等等)
3. 关掉IP forwarding的功能
4. 把其中一个界面接上Internet
5. 把受保护的网路接在另一个界面上
现在你使电脑接到两个不同的网路上。这部Firewall电脑, 现在就称为Firewall 了, 可以接到Internet上, 也可以接到保护网路(Protected Network) 上。但保护网路无法连上 Internet, Internet也连不上保护网路。
如果要从保护网路内连上Internet, 必须要先telnet到Firewall, 从那里使用Internet。同样的, Internet上的人要进入保护网路, 也必须先透过Firewall。
这种作法对于Internet上的攻击有很优秀的免疫作用。如果有人企图对受保护的网路进行攻击, 则必须先穿过Firewall, 攻击必须分成两步骤, 难度也增加了。如果有人想藉著使用一般的手法, 如邮件炸弹(MAIL BOMB)或""Internet Worm"", 来攻击受保护的网路, 他们可能是无法如愿的。
2.1. Firewall的缺点
Firewall最大的问题在于由内部Access Internet的困难。基本上, Firewall利用Dial-Up Shell 的帐号来减少对于Internet的使用, 必须先login Firewall 才能做其他对Internet的Access动作。因此一些需要直接连接Internet的程式(如Netscape) 便无法在Firewall后方顺利动作, 解决的办法——Proxy Server。
2.2. Proxy Server
Proxy Server可用来协助由Firewall后方直接Access到Internet。它们的工作是在Server上开启一个Socket, 作为和Internet沟通的管道。举例来说, 我的电脑drig是在保护网路内, 当我要使用Netscape去浏览Web 时, 我得在Firewall上建个Proxy Server, 这个Proxy Server设定好可以接受我的电脑的请求, 把要连上Port 80请求转接到它的Port 1080上。
任何用过TIA 或TERM的人应该对这个观念不会太陌生, 在这两个程式里, 你可以对一个Port做转向的动作。我的一个朋友用TIA 设定允许大家用192.251.139.21 port 4024去连上他的web server。这里提到的Proxy Server原理也差不多, 只是恰好相反, 让你使用port 1080(或某特定值)去连接其他人的port 80。Proxy Server最了不起的地方在于它的安全性, 如果你设定正确的话, 它不会允许任何人逾越它。
3. 动手吧!
3.1. 硬体需求
本例中, 电脑采用486-DX66, 8M RAM, 500M Linux 分割, 以一台1.44 bps
MODEM连到ISP上。这就是原本Linux box的基本配备, 要架成Firewall, 我们还得加上一块NE2000 Ethernet网路卡。接著连上三部PC(Win 3.1+Trumpet Winsock)和两台Suns(SunOS 4.1)。我选择这样的架构是著眼于它很普通常见, 而且我对这两种平台都蛮熟悉的。本来有考虑要加上Mac, 可是我不太常用也不熟, 就算了。
3.2. 设定软体
现在, Linux box 透过14.4 PPP line连上Internet, 再用Ethernet连上其他的电脑。首先, 先recomplie linux kernel, make config时得做适当的调整。
我参考了Kernel HOWTO, Ethernet HOWTO, NET-2 HOWTO然后进行""make config"":
1. 使用Networking Support
2. 使用TCP/IP Networking
3. 取消IP Forwarding (CONFIG_IP_FORWARD).
4. 使用IP Firewalling
5. 可以使用IP accounting, 这样比较审慎一点。
6. 使用Networking Device Support
7. 使用PPP 及Ethernet support, 视你的界面而定
接著, 我们recompile, reinstall kernel 后重开机。应该可以在开机过程中
看到我们所加入的界面的资料, 如果没有, 参考其他的HOWTO, 看看是那里做错了。
3.3. 设定网路位址
这是很有趣的一部份。因为我们不希望Internet直接Access我们的网路, 所以不必使用真实位址。一个不错的选择是C Class的192.168.2.xxx, 它是设定来做测试的dummy domain。所以放心大胆的用它吧! 没人会跟你抢的。在我们的设定中, 只需要一个真实的位址, 其他的自设就可以了。指定连上PPP 的串列埠一个真实IP位址, Firewall上的Ethernet卡设为192.168.2.1, 将其他电脑设为192.168.2.xxx。
3.4. 测试看看
试著从Firewall上ping一个Internet上的Node。我使用nic.ddn.mil做为测试点。[ 译注: 在国内可以ping edu.tw 看看 ]如果不行, 查查你的PPP 有没有设好, 仔细的读一下Net-2 HOWTO, 再试一次。
现在, 试著ping保护网路内的电脑, 所有网路内的电脑应该可以ping其他任何一台电脑, 如果不行, 老话一句, 看看NET-2 HOWTO 再试一次。接著, 所有在保护网路内的机器应该都可以ping Firewall。若不行, 再重覆以上步骤, 记得, 你该ping 192.168.2.1, 而非PPP 的真实IP位址。
然后试著从Firewall里的电脑去ping PPP的IP位址, 如果可以, 表示你IP Forwarding的功能未取消, 你必须重新compile kernel。虽然我们已经把受保护的网路设为192.168.2.1 domain, 不会收到来自Internet的封包, 可是把IP Forwarding 关掉还是比较保险一点, 可以自己主控全局而非仰赖ISP。
最后, 从Firewall上ping一下受保护的网路内的机器, 到这个地步, 应该不会有什么问题。到这里, 我们已经完成了最基础的Firewall安装。
3.5. Firewall的安全性
目前的Firewall还不够好, 因为它还敞开著大门等待别人来攻击。首先, 找到/etc/inetd.conf, 它又被称为""super server"", 因为在上面有超过一打的server daemon被执行。例如:
o Telnet
o Talk
o FTP
o Daytime
取消所有不需要的功能, 例如netstat、systat、tftp、bootp、finger。甚至你可以关掉telnet只允许rlogin或vica-versa。你只要 在该功能前加上# 就可以轻易的把它取消掉。利用kill -HUP 送出一个SIG-HUP给inetd, 使inetd 重新去读取我们刚才改的设定(inetd.conf)同时restart。试试telnet Firewall的port 15(netstat port), 如果你还读得到netstat的资料, 表示你没有正确的restart inetd。[译注: 如果还搞不定, 考虑reboot吧!]
4. Firewall软体
4.1. 可用的套装软体
单纯的Firewall除了Linux核心及基本网路套装软体(inetd, telnetd和telnet, ftpd和ftp)外不需外加任何软体, 但这种情况下, 限制极多而且不太好用。所以有些软体可以使你的Firewall更有用, 我最主要要探讨的是一个叫""socks""的Proxy Server。另外, 有两个软体你可以记在心中, 我等一下会简单介绍。
4.2. TIS Firewall Toolkit
TIS 中有一套程式用来进行Firewalling, 这些程式和socks基本上相同, 但采用了不同的设计策略。socks是用一个程式来搞定所有的Internet动作, TIS 则利为不同的功能发展不同的程式。
为了明白说明起见, 就以World Wide Web和telnet作例子吧! 在socks中, 你要设定一个config档和一个daemon, 透过这个档案及daemon, telnet及www可以正常使用, 就宛如你没把它们关掉前一样。
而在TIS toolkit中, 你要为WWW and Telnet各设一个daemon及config档。完成之后, 其他的Internet Access仍被禁止, 直到你完成其设定为止。如果某一特定功能没有daemon(如talk), 你可以使用""plug-in""的daemon, 只是不像其他的工具那样有弹性且不易使用罢了。
这里似乎有一点小小的不同, 不过会造成很大的不同——socks 允许你随便设设就上路, 不过一个设定不良的Socks server, 网路内部的人可以试著得到超出预期的Internet Access权。而TIS toolkit中, 人们只能使用系统管理者所赋与的权限。
Socks易于安装、易于complie且具有较大的弹性。如果你想严格控制网路内的使用者, 则TIS toolkit的安全性较佳。但二者都提供了对外的绝对保护。
4.3. TCP Wrapper
TCP wrapper不是一个Firewalling工具, 但它提供了许多相同的效果。透过TCP wrapper, 你可以控制谁有权Access你的机器和Access那些服务, 同时可以追踪连线的记录, 而且它还提供了一个基本的侦测伪装功能。
TCP wrapper基于一些理由, 并未广泛的运用:
o 它不算是一个真的Firewall
o 要使用它, 你必须要连上Internet, 因此你得有一个IP 位址
o 它只控制安装它的「机器」, 对「网路」不能提供很好的服务。Firewall则可以保护每一个架构上的每一个机器。TCP wrapper在Mac及MS Windows机器无法使用。
4.4. IPfw 和 IPfw Admin
5. Proxy Server
5.1. 安装Proxy Server
Proxy Server需要额外的软体, 你可以从ftp://sunsite.unc.edu/pub/Linux/system/Network/misc/socks-linux- src.tgz得到你要的宝贝。在sock-conf下同时有一个config档范例。解压之后, 跟著指示把它make起来, 我在make时遇到了一箩筐的问题, 确定你的Makefile正确无误。一件要注意的是记得把Proxy Server加到/etc/inetd.conf里, 你可以加入下行:
socks stream tcp nowait nobody /usr/local/etc/sockd sockd
5.2. 设定Proxy Server
socks的程式需要两个configuration档。一个说明那些Access是被允许的, 另一个则是把请求route到适当的Proxy Server。Access档必须设在server上。而routing档则要装在每部Un*x机器上。DOS 和mac的机器会进行它们自己的routing。
5.2.1. Access档
在socks4.2 Beta中, Access档称为""sockd.conf"", 应该包括两行, 一行允许的(permit), 一行是禁止的(deny), 每行有三个项目:
o 识别字(permit/deny)
o IP位址
o 位址修正值(位址 modifier)
识别字不是permit就是deny, 应该要有一行permit、一行deny。IP位址采用Internet上的标准记法, 例如192.168.2.0。 位址修正值也是采IP位址的格式, 而有netmask 的效果。把它想像成一个三十二位元的二进位数, 若该位元为1, 表示在做位址比较时, 此一位元必须和之前IP位址那一项的该位元相符。例如:
permit 192.168.2.23 255.255.255.255
意思是只有192.168.2.23算是相符, 而
permit 192.168.2.0 255.255.255.0
会允许192.168.2.0到192.168.2.255间的IP 位址, 即整个C Class domain。如果你加入下行:
permit 192.168.2.0 0.0.0.0
则代表你是来者不拒了。所以先允许你要开放权限的位址, 再拒绝其他的位址。例如:
permit 192.168.2.0 255.255.255.0
deny 0.0.0.0 0.0.0.0
会允许所有的192.169.2.xxx, 注意deny行里的""0.0.0.0"" 使用了0.0.0.0做修正, ""0.0.0.0""并没什么特殊用意, 修正值就拒绝了所有的位址, 用0只是因为打字方便罢了, 你要用255.255.255.255 也没人拦著你。除这两行外, 你还可以加上额外的限制。
你也可以permit或deny某一特定的user, 但这需要""ident authenticaiont"", 并非所有的系统都有此一功能, 像Trumpet Winsock 就没有, 所以我就不再深入研究, 以上所做的讨论应该已经足够了。
5.2.2. Routing档
Routing档称作""socks.conf"", 很容易跟Access档搞混。Routing档用来告诉socks clients何时用socks , 何时不用。例如, 在我们的网路上, 192.168.2.3 和192.168.2.1 (Firewall) talk时就用不到socks , 它们直接用Ethernet相连。因为系统自动定义127.0.0.1作为回路之用, 你和自已talk时当然也不需socks。
档案中有三个项目:
o deny
o direct
o sockd
Deny指示何时要拒绝请求, 它的语法和sockd.conf同。一般来说, 把修正值设为0.0.0.0 就可以轻易挡掉所有的外来者。direct项指出那些位址不必用到socks , 即不必透过Proxy Server就可连到的地方。同样有三栏, 识别字、IP位址和位址修正值, 例如:
direct 192.168.2.0 255.255.255.0
这使我们可以在保护网路内直接通行。sockd 项说明那些电脑上有socks server daemon在执行, 语法是:
sockd @=
注意""@=""那一栏, 它让你列出一堆Proxy Server的IP位址。在我们的例子里, 我们只用一台Proxy Server, 但你可以多设几个好容纳高负载, 同时减少故障停摆的风险, IP位址和修正值用法同前。
5.2.3. Firewall内的DNS
相较之下, 在Firewall内安装DNS 是很简单的事, 只要在Firewall的机器上装个DNS , 并且将Firewall内的机器DNS 设定改成它就行了。
5.3. 使用Proxy Server
5.3.1. Unix
若你的应用程式想要应用Proxy Server, 先绝条件是它们必须是""sockified""型的, 所以你必须有两个TELNET, 一个是直接连接的, 一个则是透过Proxy Server连接。Socks 有教你怎么去sockify 一个程式, 同时也有一堆己经sockified 的程式, 如果你使用一sockified 版本去作直接连接, socks 会自动替你转换成直接版。所以, 我们得把所有保护网内的原有程式改为sockified 的版本, 先将""finger""改为""finger.orig"", ""telnet"" 改成""telnet.orig""等等, 你必须在include/socks.h档中告诉socks这些资料。
有些程式会自行routing并sockify自己, Netscape就是一个例子。你可以在Netscape中使用Proxy Server, 只要在Proxies 选项中输入 Server的位址就可以了(在本例中为192.168.2.1)。每个应用程式都会让你有点手忙脚乱吧!
5.3.2. MS Windows/Trumpet Winsock
Trumpet Winsock 具有内容Proxy Server的能力, 在""setup"" menu里输入你的server IP位址和其他相关可以直接连通的电脑位址, Trumpet会处理所有外送的封包。
5.4. 使Proxy Server处理UDP 封包
有点美中不足的是socks 软体只能处理TCP 封包, 而不包括UDP 封包。很多有用的程式像talk, Archie都使用UDP。 有个软体可以用来当作UDP 的Proxy Server, 叫作UDPrelay, 由Tom Fitzgerald所写。不幸的是, 到目前为止,
它还不相容于Linux。
5.5. Proxy Server的缺点
Proxy Server是个安全装置, 用它在有限的IP位址上增加Internet的Access动
作会有一些缺点。Proxy Server允许在保护网路到Internet的大量Access, 却可以让外界不能触及网路内部, 亦即外界的server, talk或Archie, mail都无法真接传至保护网路内, 看起来没什么大不了的, 可是请你仔细想想:
o 你可能在保护网路内用电脑打了一篇报告, 回家之后, 你想把它拿回来看看, 抱歉, 这是不可能的, 你根本无法Access你的电脑, 因为它在Firewall内部。你试著login Firewall, 可是因为每个人都有Proxy Server Access, 所以没有人为你在上面另设帐号。
o 你和你的女友用email通信, 有些「不可告人」的私事要讲, 请她把email直接寄到你的电脑上会比较好, 但是不行。你信任Firewall的管理者没错, 但这毕竟还是私人信件。
o 无法处理UDP 封包是Proxy Servers的致命伤, 我想UDP 的用途会愈来愈多。
[例如: CoolTalk... ]
FTP 会造成Proxy Server上的另外一个问题, 当你抓档或是作一个ls动作时, FTP Server会开一个socket 在client机器上, 并藉由它来传送资讯。而一个Proxy Server不会允许你这么做, 所以FTP 就无法顺利完成。另外, Proxy Server跑起来挺慢的, 因为overhead太大了些, 其他的方法相形之下就快多了。
基本上, 如果你有一个IP位址, 你也不担心安全的问题, 也用不到Firewall或是Proxy Server; 如果没有, 而你也不担心安全问题, 你可以找找IP emulator 之类的工具, 如Term、Slirp或TIA。Term可以在ftp://sunsite.unc.edu拿到, Slirp 可以在ftp://blitzen.canberra.edu.au/pub/slirp拿到, 而TIA在marketplace.com 上有。这些工具跑起来快多了, 连线也较有效率, 同时由Internet连入内部网路的权限也大多了。Proxy Server适合那些有一大堆主机要连上Internet却不太想安装和设定太多东西的人。
6. 进阶设定
在结束之前, 我有些设定要交代一下, 之前所说的适合大部分的人。但以下我会谈到一些进阶的设定来澄清一些问题。如果对之前我所提的你尚有疑问, 或是有兴趣了解一下Proxy Servers和Firewall的多彩多姿, 就再读下去吧!
6.1. 强调安全性的大网路
[译注: 原文中举了一个Milwaukee 23rd Discordian Cobal的例子, 术语很多, 而且对不熟当地文化的人几乎不知所云, 我乾脆把它整个换成宋七力的
例子, 有点类似, 而且有趣多了。:) ]
如果你是宋七力本尊, 你想建个网路, 参考一下。假设你有50部电脑和一个有32 (5 bits)IP 位址的子网路, 有多重的Access等级, 你要依据不同的等级交代你的手下不同的事情。很明显的, 你会想把网路中的一部分保护起来, 防止不同等级的人去接触。
[声明: 本例纯属虚构, 如有雷同, 纯属巧合。]
这些等级分别为:
1.凡夫级: 泛指可以给所有的人看的, 基本上, 就是一些闲扯蛋, 例如对本尊的流言毁谤之类的。
2.信徒级: 在这里你告诉他们宇宙光明体的真谛, 还有本尊是个万能的神的事实。
3.核心级: 真正的精华所在, 在这一级中, 有七人小组所从事的地下活动的资讯, 准备要使接管世界统治权的计划, 包括了用Photoshop合成的发光照片、用Word排版的宇宙光明论及用Delphi写的信徒供养资料库等等。
6.1.1. 网路设计
IP位址安排如下:
o 192.168.2.255, 用作广播之用。
o 32个IP位址挪出23个, 设给供Internet Access的机器。
o 一个IP给Linux box。
o 一个给网路上另一部Linux box。
o 两个IP号码给Router。
o 剩下四个Domain Names设为paul, ringo, john, 和george, 用来掩人耳目。
o 保护网路位址为192.168.2.xxx
建立出两个分离的网路, 放在显相纪念馆不同的房间中, 使用红外线Ethernet来做Route , 对外界而言完全隐形。幸运的, 红外线Ethernet用起来和一般的Ethernet完全相同(我猜想是吧!), 所以可以视为一般的网路。两个网路各接上一台Linux box。
有一个File Server 连上两个保护网路, 真是因为接管世界的计划包含了一部份忠诚的信徒参与。File Server 对信徒级用192.168.2.17, 对核心级用192.168.2.23。
之所以用不同的位址是因为它们用不同的Ethernet卡, IP forwarding己经关了。
两台Linux box上的IP Forwarding都关了, Router不会把寄给192.168.2.xxx的封包向前传, 除非另有设定, 因此已算安全, 之所以要关掉IP forwarding是要防止信徒网路接触到核心网路。
NFS server也可以设计来提供不同的档案存取权限, 这可以用手动来控制, 但要用到一点符号链结的技巧, 使得一些共用档可供所有人使用。利用这个设定再加上一块Ethernet卡可以使三个网路都可以分享这些档案。
6.1.2. Proxy的架设
现在来制定三个网路的Net Access权。凡夫网直接连上Internet, 省得跟Proxy Server搅混, 信徒网及核心网已被包在在Firewall内, 所以凡夫网中不用架设Proxy Server。信徒网和核心网路的架设十分相似, 几乎设定相同, 因此我加入一些限制条件, 使它有些变化而且有趣一点。
1.不许任何人用File Server 作Internet Access 以防止病毒及其他的恶作剧等。这点十分重要。
2.不允许信徒使用World Wide Web, 外界的流言会影响他们的忠贞。
所以信徒网Linux box上的sockd.conf档设定如下:
deny 192.168.2.17 255.255.255.255
核心网机器上则是:
deny 192.168.2.23 255.255.255.255
信徒网还要加上这一行:
deny 0.0.0.0 0.0.0.0 eq 80
这样可以防止任何机器使用Port 80, HTTP Port, 但其他的服务仍然是开放的, 除了浏览WEB 之外。然后两边的档中还要加上:
permit 192.168.2.0 255.255.255.0
使得192.168.2.xxx的电脑可以使用这个Proxy Server, 除了己经被拒绝者之外。(ie. File Server 和信徒网上的web Access) 信徒网的sockd.conf看起来如下:
deny 192.168.2.17 255.255.255.255
deny 0.0.0.0 0.0.0.0 eq 80
permit 192.168.2.0 255.255.255.0
核心网的档案应该如下:
deny 192.168.2.23 255.255.255.255
permit 192.168.2.0 255.255.255.0
这样应该就行了, 每个网路都是独立的, 只允许有限度的接触, 大家都如愿了。
o 学习Macintosh的做法
o 学习不同的Windows TCP/IP套装软体
o 找个好用的UDP Proxy Server和Linux搭配
深入研究时的参考资料
o TIS Firewall Toolkit文件
o NET-2 HOWTO
o PPP HOWTO
o Ethernet HOWTO
o MultIPle Ethernet Mini HOWTO
o Networking with Linux
o TCP/IP Network Administrators Guide by OReilly and Associates
Firewall Toolkit by TIS 有一套很棒的文件, 其中有谈到Firewall及相关的资料, 至于Firewall Toolkit的进一步说明, 请看Firewall软体那一节。
了解Firewalls
Firewall原来是汽车上的一个术语, 它用来隔离引擎和乘客, 在引擎爆炸时可以发挥保护乘客的功能。电脑上的Firewall是一个逻辑装置, 用来保护私人的区域
不受公用部份的侵害, 做法是:
1. 找一部有Routing能力的电脑(例如Linux)
2. 加入两个界面(例如: 序列埠、Ethernet、Token Ring等等)
3. 关掉IP forwarding的功能
4. 把其中一个界面接上Internet
5. 把受保护的网路接在另一个界面上
现在你使电脑接到两个不同的网路上。这部Firewall电脑, 现在就称为Firewall 了, 可以接到Internet上, 也可以接到保护网路(Protected Network) 上。但保护网路无法连上 Internet, Internet也连不上保护网路。
如果要从保护网路内连上Internet, 必须要先telnet到Firewall, 从那里使用Internet。同样的, Internet上的人要进入保护网路, 也必须先透过Firewall。
这种作法对于Internet上的攻击有很优秀的免疫作用。如果有人企图对受保护的网路进行攻击, 则必须先穿过Firewall, 攻击必须分成两步骤, 难度也增加了。如果有人想藉著使用一般的手法, 如邮件炸弹(MAIL BOMB)或""Internet Worm"", 来攻击受保护的网路, 他们可能是无法如愿的。
2.1. Firewall的缺点
Firewall最大的问题在于由内部Access Internet的困难。基本上, Firewall利用Dial-Up Shell 的帐号来减少对于Internet的使用, 必须先login Firewall 才能做其他对Internet的Access动作。因此一些需要直接连接Internet的程式(如Netscape) 便无法在Firewall后方顺利动作, 解决的办法——Proxy Server。
2.2. Proxy Server
Proxy Server可用来协助由Firewall后方直接Access到Internet。它们的工作是在Server上开启一个Socket, 作为和Internet沟通的管道。举例来说, 我的电脑drig是在保护网路内, 当我要使用Netscape去浏览Web 时, 我得在Firewall上建个Proxy Server, 这个Proxy Server设定好可以接受我的电脑的请求, 把要连上Port 80请求转接到它的Port 1080上。
任何用过TIA 或TERM的人应该对这个观念不会太陌生, 在这两个程式里, 你可以对一个Port做转向的动作。我的一个朋友用TIA 设定允许大家用192.251.139.21 port 4024去连上他的web server。这里提到的Proxy Server原理也差不多, 只是恰好相反, 让你使用port 1080(或某特定值)去连接其他人的port 80。Proxy Server最了不起的地方在于它的安全性, 如果你设定正确的话, 它不会允许任何人逾越它。
3. 动手吧!
3.1. 硬体需求
本例中, 电脑采用486-DX66, 8M RAM, 500M Linux 分割, 以一台1.44 bps
MODEM连到ISP上。这就是原本Linux box的基本配备, 要架成Firewall, 我们还得加上一块NE2000 Ethernet网路卡。接著连上三部PC(Win 3.1+Trumpet Winsock)和两台Suns(SunOS 4.1)。我选择这样的架构是著眼于它很普通常见, 而且我对这两种平台都蛮熟悉的。本来有考虑要加上Mac, 可是我不太常用也不熟, 就算了。
3.2. 设定软体
现在, Linux box 透过14.4 PPP line连上Internet, 再用Ethernet连上其他的电脑。首先, 先recomplie linux kernel, make config时得做适当的调整。
我参考了Kernel HOWTO, Ethernet HOWTO, NET-2 HOWTO然后进行""make config"":
1. 使用Networking Support
2. 使用TCP/IP Networking
3. 取消IP Forwarding (CONFIG_IP_FORWARD).
4. 使用IP Firewalling
5. 可以使用IP accounting, 这样比较审慎一点。
6. 使用Networking Device Support
7. 使用PPP 及Ethernet support, 视你的界面而定
接著, 我们recompile, reinstall kernel 后重开机。应该可以在开机过程中
看到我们所加入的界面的资料, 如果没有, 参考其他的HOWTO, 看看是那里做错了。
3.3. 设定网路位址
这是很有趣的一部份。因为我们不希望Internet直接Access我们的网路, 所以不必使用真实位址。一个不错的选择是C Class的192.168.2.xxx, 它是设定来做测试的dummy domain。所以放心大胆的用它吧! 没人会跟你抢的。在我们的设定中, 只需要一个真实的位址, 其他的自设就可以了。指定连上PPP 的串列埠一个真实IP位址, Firewall上的Ethernet卡设为192.168.2.1, 将其他电脑设为192.168.2.xxx。
3.4. 测试看看
试著从Firewall上ping一个Internet上的Node。我使用nic.ddn.mil做为测试点。[ 译注: 在国内可以ping edu.tw 看看 ]如果不行, 查查你的PPP 有没有设好, 仔细的读一下Net-2 HOWTO, 再试一次。
现在, 试著ping保护网路内的电脑, 所有网路内的电脑应该可以ping其他任何一台电脑, 如果不行, 老话一句, 看看NET-2 HOWTO 再试一次。接著, 所有在保护网路内的机器应该都可以ping Firewall。若不行, 再重覆以上步骤, 记得, 你该ping 192.168.2.1, 而非PPP 的真实IP位址。
然后试著从Firewall里的电脑去ping PPP的IP位址, 如果可以, 表示你IP Forwarding的功能未取消, 你必须重新compile kernel。虽然我们已经把受保护的网路设为192.168.2.1 domain, 不会收到来自Internet的封包, 可是把IP Forwarding 关掉还是比较保险一点, 可以自己主控全局而非仰赖ISP。
最后, 从Firewall上ping一下受保护的网路内的机器, 到这个地步, 应该不会有什么问题。到这里, 我们已经完成了最基础的Firewall安装。
3.5. Firewall的安全性
目前的Firewall还不够好, 因为它还敞开著大门等待别人来攻击。首先, 找到/etc/inetd.conf, 它又被称为""super server"", 因为在上面有超过一打的server daemon被执行。例如:
o Telnet
o Talk
o FTP
o Daytime
取消所有不需要的功能, 例如netstat、systat、tftp、bootp、finger。甚至你可以关掉telnet只允许rlogin或vica-versa。你只要 在该功能前加上# 就可以轻易的把它取消掉。利用kill -HUP 送出一个SIG-HUP给inetd, 使inetd 重新去读取我们刚才改的设定(inetd.conf)同时restart。试试telnet Firewall的port 15(netstat port), 如果你还读得到netstat的资料, 表示你没有正确的restart inetd。[译注: 如果还搞不定, 考虑reboot吧!]
4. Firewall软体
4.1. 可用的套装软体
单纯的Firewall除了Linux核心及基本网路套装软体(inetd, telnetd和telnet, ftpd和ftp)外不需外加任何软体, 但这种情况下, 限制极多而且不太好用。所以有些软体可以使你的Firewall更有用, 我最主要要探讨的是一个叫""socks""的Proxy Server。另外, 有两个软体你可以记在心中, 我等一下会简单介绍。
4.2. TIS Firewall Toolkit
TIS 中有一套程式用来进行Firewalling, 这些程式和socks基本上相同, 但采用了不同的设计策略。socks是用一个程式来搞定所有的Internet动作, TIS 则利为不同的功能发展不同的程式。
为了明白说明起见, 就以World Wide Web和telnet作例子吧! 在socks中, 你要设定一个config档和一个daemon, 透过这个档案及daemon, telnet及www可以正常使用, 就宛如你没把它们关掉前一样。
而在TIS toolkit中, 你要为WWW and Telnet各设一个daemon及config档。完成之后, 其他的Internet Access仍被禁止, 直到你完成其设定为止。如果某一特定功能没有daemon(如talk), 你可以使用""plug-in""的daemon, 只是不像其他的工具那样有弹性且不易使用罢了。
这里似乎有一点小小的不同, 不过会造成很大的不同——socks 允许你随便设设就上路, 不过一个设定不良的Socks server, 网路内部的人可以试著得到超出预期的Internet Access权。而TIS toolkit中, 人们只能使用系统管理者所赋与的权限。
Socks易于安装、易于complie且具有较大的弹性。如果你想严格控制网路内的使用者, 则TIS toolkit的安全性较佳。但二者都提供了对外的绝对保护。
4.3. TCP Wrapper
TCP wrapper不是一个Firewalling工具, 但它提供了许多相同的效果。透过TCP wrapper, 你可以控制谁有权Access你的机器和Access那些服务, 同时可以追踪连线的记录, 而且它还提供了一个基本的侦测伪装功能。
TCP wrapper基于一些理由, 并未广泛的运用:
o 它不算是一个真的Firewall
o 要使用它, 你必须要连上Internet, 因此你得有一个IP 位址
o 它只控制安装它的「机器」, 对「网路」不能提供很好的服务。Firewall则可以保护每一个架构上的每一个机器。TCP wrapper在Mac及MS Windows机器无法使用。
4.4. IPfw 和 IPfw Admin
5. Proxy Server
5.1. 安装Proxy Server
Proxy Server需要额外的软体, 你可以从ftp://sunsite.unc.edu/pub/Linux/system/Network/misc/socks-linux- src.tgz得到你要的宝贝。在sock-conf下同时有一个config档范例。解压之后, 跟著指示把它make起来, 我在make时遇到了一箩筐的问题, 确定你的Makefile正确无误。一件要注意的是记得把Proxy Server加到/etc/inetd.conf里, 你可以加入下行:
socks stream tcp nowait nobody /usr/local/etc/sockd sockd
5.2. 设定Proxy Server
socks的程式需要两个configuration档。一个说明那些Access是被允许的, 另一个则是把请求route到适当的Proxy Server。Access档必须设在server上。而routing档则要装在每部Un*x机器上。DOS 和mac的机器会进行它们自己的routing。
5.2.1. Access档
在socks4.2 Beta中, Access档称为""sockd.conf"", 应该包括两行, 一行允许的(permit), 一行是禁止的(deny), 每行有三个项目:
o 识别字(permit/deny)
o IP位址
o 位址修正值(位址 modifier)
识别字不是permit就是deny, 应该要有一行permit、一行deny。IP位址采用Internet上的标准记法, 例如192.168.2.0。 位址修正值也是采IP位址的格式, 而有netmask 的效果。把它想像成一个三十二位元的二进位数, 若该位元为1, 表示在做位址比较时, 此一位元必须和之前IP位址那一项的该位元相符。例如:
permit 192.168.2.23 255.255.255.255
意思是只有192.168.2.23算是相符, 而
permit 192.168.2.0 255.255.255.0
会允许192.168.2.0到192.168.2.255间的IP 位址, 即整个C Class domain。如果你加入下行:
permit 192.168.2.0 0.0.0.0
则代表你是来者不拒了。所以先允许你要开放权限的位址, 再拒绝其他的位址。例如:
permit 192.168.2.0 255.255.255.0
deny 0.0.0.0 0.0.0.0
会允许所有的192.169.2.xxx, 注意deny行里的""0.0.0.0"" 使用了0.0.0.0做修正, ""0.0.0.0""并没什么特殊用意, 修正值就拒绝了所有的位址, 用0只是因为打字方便罢了, 你要用255.255.255.255 也没人拦著你。除这两行外, 你还可以加上额外的限制。
你也可以permit或deny某一特定的user, 但这需要""ident authenticaiont"", 并非所有的系统都有此一功能, 像Trumpet Winsock 就没有, 所以我就不再深入研究, 以上所做的讨论应该已经足够了。
5.2.2. Routing档
Routing档称作""socks.conf"", 很容易跟Access档搞混。Routing档用来告诉socks clients何时用socks , 何时不用。例如, 在我们的网路上, 192.168.2.3 和192.168.2.1 (Firewall) talk时就用不到socks , 它们直接用Ethernet相连。因为系统自动定义127.0.0.1作为回路之用, 你和自已talk时当然也不需socks。
档案中有三个项目:
o deny
o direct
o sockd
Deny指示何时要拒绝请求, 它的语法和sockd.conf同。一般来说, 把修正值设为0.0.0.0 就可以轻易挡掉所有的外来者。direct项指出那些位址不必用到socks , 即不必透过Proxy Server就可连到的地方。同样有三栏, 识别字、IP位址和位址修正值, 例如:
direct 192.168.2.0 255.255.255.0
这使我们可以在保护网路内直接通行。sockd 项说明那些电脑上有socks server daemon在执行, 语法是:
sockd @=
注意""@=""那一栏, 它让你列出一堆Proxy Server的IP位址。在我们的例子里, 我们只用一台Proxy Server, 但你可以多设几个好容纳高负载, 同时减少故障停摆的风险, IP位址和修正值用法同前。
5.2.3. Firewall内的DNS
相较之下, 在Firewall内安装DNS 是很简单的事, 只要在Firewall的机器上装个DNS , 并且将Firewall内的机器DNS 设定改成它就行了。
5.3. 使用Proxy Server
5.3.1. Unix
若你的应用程式想要应用Proxy Server, 先绝条件是它们必须是""sockified""型的, 所以你必须有两个TELNET, 一个是直接连接的, 一个则是透过Proxy Server连接。Socks 有教你怎么去sockify 一个程式, 同时也有一堆己经sockified 的程式, 如果你使用一sockified 版本去作直接连接, socks 会自动替你转换成直接版。所以, 我们得把所有保护网内的原有程式改为sockified 的版本, 先将""finger""改为""finger.orig"", ""telnet"" 改成""telnet.orig""等等, 你必须在include/socks.h档中告诉socks这些资料。
有些程式会自行routing并sockify自己, Netscape就是一个例子。你可以在Netscape中使用Proxy Server, 只要在Proxies 选项中输入 Server的位址就可以了(在本例中为192.168.2.1)。每个应用程式都会让你有点手忙脚乱吧!
5.3.2. MS Windows/Trumpet Winsock
Trumpet Winsock 具有内容Proxy Server的能力, 在""setup"" menu里输入你的server IP位址和其他相关可以直接连通的电脑位址, Trumpet会处理所有外送的封包。
5.4. 使Proxy Server处理UDP 封包
有点美中不足的是socks 软体只能处理TCP 封包, 而不包括UDP 封包。很多有用的程式像talk, Archie都使用UDP。 有个软体可以用来当作UDP 的Proxy Server, 叫作UDPrelay, 由Tom Fitzgerald所写。不幸的是, 到目前为止,
它还不相容于Linux。
5.5. Proxy Server的缺点
Proxy Server是个安全装置, 用它在有限的IP位址上增加Internet的Access动
作会有一些缺点。Proxy Server允许在保护网路到Internet的大量Access, 却可以让外界不能触及网路内部, 亦即外界的server, talk或Archie, mail都无法真接传至保护网路内, 看起来没什么大不了的, 可是请你仔细想想:
o 你可能在保护网路内用电脑打了一篇报告, 回家之后, 你想把它拿回来看看, 抱歉, 这是不可能的, 你根本无法Access你的电脑, 因为它在Firewall内部。你试著login Firewall, 可是因为每个人都有Proxy Server Access, 所以没有人为你在上面另设帐号。
o 你和你的女友用email通信, 有些「不可告人」的私事要讲, 请她把email直接寄到你的电脑上会比较好, 但是不行。你信任Firewall的管理者没错, 但这毕竟还是私人信件。
o 无法处理UDP 封包是Proxy Servers的致命伤, 我想UDP 的用途会愈来愈多。
[例如: CoolTalk... ]
FTP 会造成Proxy Server上的另外一个问题, 当你抓档或是作一个ls动作时, FTP Server会开一个socket 在client机器上, 并藉由它来传送资讯。而一个Proxy Server不会允许你这么做, 所以FTP 就无法顺利完成。另外, Proxy Server跑起来挺慢的, 因为overhead太大了些, 其他的方法相形之下就快多了。
基本上, 如果你有一个IP位址, 你也不担心安全的问题, 也用不到Firewall或是Proxy Server; 如果没有, 而你也不担心安全问题, 你可以找找IP emulator 之类的工具, 如Term、Slirp或TIA。Term可以在ftp://sunsite.unc.edu拿到, Slirp 可以在ftp://blitzen.canberra.edu.au/pub/slirp拿到, 而TIA在marketplace.com 上有。这些工具跑起来快多了, 连线也较有效率, 同时由Internet连入内部网路的权限也大多了。Proxy Server适合那些有一大堆主机要连上Internet却不太想安装和设定太多东西的人。
6. 进阶设定
在结束之前, 我有些设定要交代一下, 之前所说的适合大部分的人。但以下我会谈到一些进阶的设定来澄清一些问题。如果对之前我所提的你尚有疑问, 或是有兴趣了解一下Proxy Servers和Firewall的多彩多姿, 就再读下去吧!
6.1. 强调安全性的大网路
[译注: 原文中举了一个Milwaukee 23rd Discordian Cobal的例子, 术语很多, 而且对不熟当地文化的人几乎不知所云, 我乾脆把它整个换成宋七力的
例子, 有点类似, 而且有趣多了。:) ]
如果你是宋七力本尊, 你想建个网路, 参考一下。假设你有50部电脑和一个有32 (5 bits)IP 位址的子网路, 有多重的Access等级, 你要依据不同的等级交代你的手下不同的事情。很明显的, 你会想把网路中的一部分保护起来, 防止不同等级的人去接触。
[声明: 本例纯属虚构, 如有雷同, 纯属巧合。]
这些等级分别为:
1.凡夫级: 泛指可以给所有的人看的, 基本上, 就是一些闲扯蛋, 例如对本尊的流言毁谤之类的。
2.信徒级: 在这里你告诉他们宇宙光明体的真谛, 还有本尊是个万能的神的事实。
3.核心级: 真正的精华所在, 在这一级中, 有七人小组所从事的地下活动的资讯, 准备要使接管世界统治权的计划, 包括了用Photoshop合成的发光照片、用Word排版的宇宙光明论及用Delphi写的信徒供养资料库等等。
6.1.1. 网路设计
IP位址安排如下:
o 192.168.2.255, 用作广播之用。
o 32个IP位址挪出23个, 设给供Internet Access的机器。
o 一个IP给Linux box。
o 一个给网路上另一部Linux box。
o 两个IP号码给Router。
o 剩下四个Domain Names设为paul, ringo, john, 和george, 用来掩人耳目。
o 保护网路位址为192.168.2.xxx
建立出两个分离的网路, 放在显相纪念馆不同的房间中, 使用红外线Ethernet来做Route , 对外界而言完全隐形。幸运的, 红外线Ethernet用起来和一般的Ethernet完全相同(我猜想是吧!), 所以可以视为一般的网路。两个网路各接上一台Linux box。
有一个File Server 连上两个保护网路, 真是因为接管世界的计划包含了一部份忠诚的信徒参与。File Server 对信徒级用192.168.2.17, 对核心级用192.168.2.23。
之所以用不同的位址是因为它们用不同的Ethernet卡, IP forwarding己经关了。
两台Linux box上的IP Forwarding都关了, Router不会把寄给192.168.2.xxx的封包向前传, 除非另有设定, 因此已算安全, 之所以要关掉IP forwarding是要防止信徒网路接触到核心网路。
NFS server也可以设计来提供不同的档案存取权限, 这可以用手动来控制, 但要用到一点符号链结的技巧, 使得一些共用档可供所有人使用。利用这个设定再加上一块Ethernet卡可以使三个网路都可以分享这些档案。
6.1.2. Proxy的架设
现在来制定三个网路的Net Access权。凡夫网直接连上Internet, 省得跟Proxy Server搅混, 信徒网及核心网已被包在在Firewall内, 所以凡夫网中不用架设Proxy Server。信徒网和核心网路的架设十分相似, 几乎设定相同, 因此我加入一些限制条件, 使它有些变化而且有趣一点。
1.不许任何人用File Server 作Internet Access 以防止病毒及其他的恶作剧等。这点十分重要。
2.不允许信徒使用World Wide Web, 外界的流言会影响他们的忠贞。
所以信徒网Linux box上的sockd.conf档设定如下:
deny 192.168.2.17 255.255.255.255
核心网机器上则是:
deny 192.168.2.23 255.255.255.255
信徒网还要加上这一行:
deny 0.0.0.0 0.0.0.0 eq 80
这样可以防止任何机器使用Port 80, HTTP Port, 但其他的服务仍然是开放的, 除了浏览WEB 之外。然后两边的档中还要加上:
permit 192.168.2.0 255.255.255.0
使得192.168.2.xxx的电脑可以使用这个Proxy Server, 除了己经被拒绝者之外。(ie. File Server 和信徒网上的web Access) 信徒网的sockd.conf看起来如下:
deny 192.168.2.17 255.255.255.255
deny 0.0.0.0 0.0.0.0 eq 80
permit 192.168.2.0 255.255.255.0
核心网的档案应该如下:
deny 192.168.2.23 255.255.255.255
permit 192.168.2.0 255.255.255.0
这样应该就行了, 每个网路都是独立的, 只允许有限度的接触, 大家都如愿了。