把Linux用作家里的Internet网关和服务器
时间:2007-02-17 来源:PHP爱好者
By James T. Dennis, [email protected]
Starshine Technical Services, http://www.starshine.org/
翻译:gaia
From Nilesh M.
Hi,
我有几个问题.我想把Linux设置成我的家用电脑的服务器,让它们共享一条 Internet连接,还想把它用做Internet服务器.
O.K.那是三种不同的角色:
网络服务器 (要提供哪些服务)
Internet网关 (代理(proxy) 和/或 伪装(masquerading))
Internet主机/服务器 (要提供哪些服务)
Linux可以同时扮演这三种角色---尽管就安全和风险评估而言"把所有的蛋放进一个篮子"未必是个好主意.
按常规,你还要考虑机器性能---不过拥有200+Pentium处理器,32M到256M RAM,4Gb到12Gb磁盘空间的典型的现代PC比起5到10年前的Unix已经是相当强大了 .
你知道不知道我能否用一个用于modem的10mbs以太网和一个用于家庭网络的100mbs以太网来设置Linux?应该从哪着手,怎么去做?
我猜想你指的是设一个10Mbps以太网用于cable modem,ISDN路由器(router)(如 Trancell/WebRamp,或Ascend Pipeline系列),或者DSL路由器.这些设备的功能是作 为你购买的cable,ISDN或xDSL服务的路由器,一般提供10Mbps接口.
你完全可以在Linux系统中安装两个或更多以太网卡.若你把任何标准的现代 100Mbps网卡用于10Mbps的局域网,它们会自动处理10Mbps的速率.所以你只管为你的系统安装两块这样的网卡,一块接路由器,另一块接高速HUB.
你通常要把以下这行加进/etc/lilo.conf文件里好让内核识别第二块网卡:
append="ether=0,0,eth1"
... 0,0,表示自动检测这个设备的 IRQ 及I/O基地址.否则你就需要像下面这样指定参数:
append="ether=10,0x300,eth0 ether=11,0x280,eth1"
这一行必须出现在/etc/lilo.conf的每一个Linux"段"中(即每一组引导Linux的选项,分别指向不同的Linux kernel,相应的root文件系统及其它设置).
当然了,你必须运行 /sbin/lilo命令以读入 /etc/lilo.conf 文件中的任何改变,并把它们"编译"进新的引导区和映 像("maps").
如果你的系统安装了普通的modem---照样可以用.你可以用PPP(使用pppd程序)通过普通电话线建立Internet连接.Linux还提供了对内置ISDN, T1 "FRADs" (frame relay access devices)和 CSU/DSU (即Codecs --- coder decoder units)的支持.
我还听说用于控制一些类型的内置ISDN卡的ipppd.我想多数其它设备都有相应的驱 动程序使它们"看似"Linux的 modem或以太网设备.
我只想买两块100mbs网卡互相连接...所以我想我并不需要集线器,对吗?我只想让两台机器连在这个简单网络上.
你要么需要一个HUB,要么需要一个"十字交叉"的ethernet patch cord.普通的5个接头(? cat 5)的ethernet patch cord没法正确直接连接两块网卡.
感谢你的每一点帮助,特别是像一些站点链接之类的信息,能让我找到教我怎样一步步设置的资料.
我不知道这样的链接.正如你可能已经知道的,Linux有一百多个HOWTO文件,其中许多和设置各种服务有关.
现在我们回到前面列出的几种不同的角色:
网络服务器(要提供哪些服务) Internet网关(代理(proxy)和/或IP伪装(masquerading)) Internet主机/服务器(要提供哪些服务)
从第一项开始说吧.你有一个平时不连在Internet上的小网络(即没有永久的Internet专线连接).所以你会希望你的系统使用"私人网络地址".这就是指保留的IP地址 ---它们不会被分配给任何Internet上的主机(所以,使用它们不会导致你的系统在选择路由时产生歧义).
有三类这样的地址:
192.168.*.* --- 255个C类网络 172.16.*.* 到 172.31.*.* --- 15个B类网络 10.*.*.* --- 1个A类网络
... 我为我家里的网络分配了 192.168.42.*
... 这些地址还可以被防火墙和Internet网关(gateways)后面的系统使用.
就Linux而言,我们可以把一个Linux系统设置成本地服务器和Internet网关.我们的网关的实现可以通过"代理"(使用SOCKS或其它应用层工具在我们的私人网络和 Internet之间转发数据),或者通过IP伪装(在数据包被转发时,使用内建于内核的网络地址翻译代码重写数据包---一种网络层透明的代理方式).
不过,我们说得太远了点.
首先我们要设置Linux LAN服务器.所以,安装好Linux并设置好其网卡的IP地址,如 192.168.5.1.内核路由表里应该有指向我们的内部网络的路由,就像下面这样:
route add -net 192.168.5.0 eth0
... 这就告诉内核所有地址是 192.168.5.* 的主机位于与eth0相连的网段.
现在,想想你希望为你的其它机器提供什么服务.
Linux在缺省安装时就为任何能访问你的系统的机器提供了一些常见服务 (telnet, NFS, FTP, rsh, rlogin, sendmail/SMTP, web,samba/SMB, POP和 IMAP等等).多数这些服务要通过名叫inetd的"internet服务分派程序 "才能得到.这些服务的清单在 /etc/inetd.conf里.一些其它服务,如 mail传送及转发(sendmail),和web (Apache httpd)以"standalone"模式启动 ---即由 /etc/rc.d/*/S* 脚本启动而不需要inetd.NFS是一个特殊服务,需要几个不同的守护进程参与完成---特别是 portmapper和 mountd.因为NFS是基于"RPC"(远端过程调用)的服务.
既然所有能送数据包给你的系统都可以请求你的系统提供的服务,既然多数Unix和 Linux系统提供全套服务,这就出现了一个严重的安全问题.任何服务的守护进程的任何bug会导致整个系统的不可靠,从而可能被世界任何一个角落的人利用.这就导致了TCP包装程序(TCP Wrappers)的产生.(所有主要Linux发布都缺省安装了它---但缺省设置成提供全部权限).也就是为什么我们有"防火墙"和"包过滤".
你容易以为你很隐蔽,谁也不会闯进来.然而,如今有很多cracker和script kiddies,他们花费大量时间在"端口扫描"("portscanning")上---寻找脆弱的系统 ---把他们叫过来,利用他们做进一步的portscanning sniffing, 破解口令 ,spamming,破解软件,及其它活动.
我最近安装了一条DSL线路.所以我现在可以一直连在Internet上.我装上它还不足一个月,还没有指向我的IP地址的DNS记录.但我已经做了至少三次扫描寻找一些常见的 IMAP的bug,还有一次寻找一个mountd 的bug.所以,我敢说你并没有隐避得能高枕无忧.
当你通过ISDN或POTS(plain old telephone service)线路使用拨号PPP时,你仍有些风险.当你做这些时,风险仍在你这边.然而,设置你的系统以避免这类问题还是 值得的.
所以,你有必要如下编辑两个文件:
/etc/hosts.allow
ALL:LOCAL
/etc/hosts.deny
ALL:ALL
... 这绝对是你最低限度要考虑的.这样设置意味着tcpd程序(TCP Wrappers)允许 "local"系统访问(相对于你的域名,其主机名中没有"点"的那些主机),并且拒绝其它所有主机对一切服务的访问.
为了让这项措施正常工作,你要确认所有你的本地主机在/etc/hosts文件里正确地有自己的一项,且/或你已经正确设置了你自己的DNS服务的 forward 和reverse区.你还有必要确认你的/etc/host.conf (libc5)文 件和/或 /etc/nsswitch.conf (glibc2,即libc6)设置成首先搜索 /etc/hosts文件.
我的host.conf文件是这样的:
# /etc/host.conf
order hosts bind
multi on
我的/etc/nsswitch.conf是这样:
passwd: db files nis
shadow: db files nis
group: db files nis
hosts: files dns
networks: files dns
services: db files
protocols: db files
rpc: db files
ethers: db files
netmasks: files
netgroup: files
bootparams: files
automount: files
aliases: files
glibc2提供了一些钩函数,所以使用模块化的服务库(service libraries)对上面文件里每一种数据库的搜索和处理是可扩展的.所以很快我们将可以看到在这个服务调度文件(services switch file)中加入 LDAP服务---那样主机(hosts)用户(passwd或shadow?),用户组 (group)等信息就可以用名为nss_ldap的模块库来查询和处理,而nss_ldap模块与 LDAP服务器打交道.我们还可能看到用某种nss_hesiod模块对一些用户和用户组信息提供"Hesiod"服务(通过DNS或secureDNS协议).甚至我们会看到用一个 nss_nds模块来提供NDS(Novell/Netware目录服务).
不过话说得远了点.
一旦你做完这些,你就可以为你的LAN提供普通服务了.简单地说你如何设置你的客户系统取决于它们运行什么OS,和你想让它们得到什么服务.
比如,如果你想通过NFS让你的Linux或其它Unix客户共享文件,你要编辑你的 Linux服务器上的/etc/exports文件指定哪些目录树对哪些客户系统是可访问的.
以我自己的系统上的exports文件为例:
-+
# / *.starshine.org(ro,insecure,no_root_squash)
# / 192.168.5.*(ro,insecure,no_root_squash)
/etc/ (noaccess)
/root/ (noaccess)
/mnt/cdrom 192.168.5.*(insecure,ro,no_root_squash)
... 注意我在向我的LAN输出根目录时把两个目录标记为noaccess".这样做是为了防止我的网络上其它系统读我的设置文件和passwd/shadow文件.我只用 read-only模式输出我的根目录,并且只是偶尔才暂时地输出根目录(这就是为什么你看到时这几行是被注释掉的).我的CDROM设为可访问的,因为我并不担心屋子里的任何人读我的任何CD上的数据.
牢牢记住NFS就是 "no flippin security"(不堪一击的安全性) --- 任何能控制你的网络上任何系统的人都能够变成非root用户身份执行操作,并以那个用户的"名义"访问任何共享的NFS(NFS是为这样一种情况设 计的:只有少数主机并且都被锁在屋子里严格控制;而不是为在现代办公环境中使用而设计的:你夹着安装了Linux,FreeBSD,甚至 Solaris x86系统的膝上机走进办公室,把它连在最近的以太网插口上(这在现代办 公室随处可见---我在某些地方的接待区(reception areas)也见过).
为了与你的Windows系统共享文件,你需编辑 /etc/smb.conf.文件来设置 Samba.要想作MacOS的文件服务器,你需要安装并设置 etatalk.要想模拟 Netware文件服务器,你要安装Mars_nwe,和/或从Caldera (http://www.caldera.com)买一份Netware Server for Linux.
这些组件的每一个都有几种方法能把你的系统设置为打印服务器.
说完文件和打印服务,我们来看看"标准的Internet服务"( "commodity internet services")如FTP,telnet,HTTP (WWW).一般说来,如果你安装了任何通用的Linux发布,它们并不需要特殊的设置.
如果在/etc/passwd文件里你建立了一个FTP帐号,就允许通过匿名FTP访问你的某一子目录.如果你把这个帐号改名为"noftp"或"ftpx"或除了"ftp"的任何名字,或者干脆删除这个帐号,你的系统将关闭FTP服务.如果你开放FTP服务,你只需把你想共享的文件放进FTP的主目录的/pub目录下---确认它们是"可读"权限.FTP服务缺省由tcpd运行,所以要依据你的hosts.allow/hosts.deny文件的设置.
如果你打算建立一个"真正的"FTP站点,用作公共镜像或专业"extranet"应用,你恐怕需要用ncftpd, proftpd,或beroftpd代替已经过时的WU-ftpd或旧的BSD FTP守护程序(in.ftpd).这些替代的FTP守护程序有自己的设置文件,可以支持虚拟主机和其它特性.它们中有的允许你建立"虚拟用户"---这些帐号只允许通过FTP访问指定FTP子目录;还有虚拟主机服务---这些帐号可以被用于访问系统的任何其它服务.
Web服务由它们自己的设置文件控制.有几本书专门介绍Apache服务器的设置.缺省情况下,它们允许所有人浏览你放进魔力目录(magic directories)的所有网页 (/home/httpd/docs 或类似目录).
你可以根据客户的IP地址(或反过来找到它的DNS名字)来限制对特定目录的访问.和 TCP Wrappers一样,这不能被认为是一种"认证"---但它可以用于区分"本地"与"非本地"系统,如果你设置了反欺骗包过滤措施( ANTI-SPOOFING PACKET FILTERS)(任何好的防火墙都会有这部分).
telnet, rlogin, rsh,和其它类型的交互式shell访问通常极容易设置.像许多Unix/Linux服务一样,取消或限制访问比开放它们要麻烦得多.
在Red HatLinux下,这些和其它"需认证的"服务可通过编辑/etc/pam.d/下的PAM设置文件来控制.
所以,对于"如何把Linux设置成服务器"这个问题的简单回答就是,安装它,设置地址和路由选择,然后安装并设置你想提供的服务.
当我们想把Linux用作Internet网关时(或通向任何其它网络的网关---把你的家庭网络与你办公室或朋友的网络连接),你首先要解决的是地址分配和路由选择问题(设好你的第二个接口,并把它正确地加入路由表).然后利用IP伪装或代理服务 (SOCKS)使你的网络系统(使用的是"私人网络"地址)能够访问 Internet服务.
要用旧的ipfwadm(标准2.0.x内核)实现IP伪装,你只需用这样的命令行:
ipfwadm -F -a accept -m -D 0.0.0.0/0 -S 192.168.5.0/24
... 加入 (-a即add)一条规则到转发表中 (-F即 forwarding)以"接受(accept)"并伪装 (-m即"masquerading")符合以下条件的数据包:其目的地(-D即"destined for")为任何地址 (0.0.0.0/0),且其源IP地址(-S)符合192.168.5.0/24(24是一个地址掩码(相当于255.255.255.0),指定地址的前24bit即三位八进制数作为IP地址的"网络部分"---从而覆盖了这个C类网络的全部).
你应该使用模块化编译的内核,并且当你使用这种伪装技术时,几乎总是应该启动 kerneld来装载模块.这是因为有一些常见协议(特别是FTP)在伪装时需要特别处理(拿FTP协议来说,数据连接是从服务器向客户端(发出请求),然而通常数据连接的方向是从客户到服务器).
因为这个原因,我其实偏爱应用层的代理.你可以到任何Red Hat的站点的"contrib"目录下,下载SOCKS服务器和客户端软件.把服务器安装在你的Linux网关上,再把客户软件安装在任何你的Linux客户上.
在SOCKS网关上,创建一个文件: /etc/socks5.conf 照此写入内容:
route 192.168.5. - eth0
permit - - - - - -
... 你可以用很多选项来限制对socks网关的访问---不过这个是最简单的例子.
在Linux客户端,建立一个叫/etc/libsocks5.conf的文件,写入类似下面的一项:
socks5 - - - - 192.168.5.2
noproxy - 192.168.5. -
... 其中".2"地址就是我运行SOCKS服务器的主机.
对非Linux客户机,你要用各种不同设置方法.多数Windows TCP/IP工具集(除了 Microsoft的)支持SOCKS代理.有一些替代的WINSOCK.DLL,可以透明地为多数或全部其它Windows服务提供对这种代理协议的支持.MacOS应用程序似乎也广泛支持 SOCKS.
还有一些NECs SOCKS服务器的替代品.我发现"DeleGate"就是相当不错的一个(到 Freshmeat去搜索一下).DeleGate的优点在于,你不仅可以把它用作"SOCKS"兼容的代理,还可以用作"manually traversal"代理.SOCKS代理协议允许客户端软件与代理服务器软件通讯,并发送给服务器有关请求信息,服务器反过来把请求转发给外部的服务器上运行的某个进程.这就是所谓"traversal."
非SOCKS的代理不得不用其它" traversal"机制.很多就是"manually traversed" ---我telnet 或ftp到TIS FWTK代理上 (打个比方)然后以"[email protected]."登录 ---换句话说,我向提示 符输入了附加的帐号和目的地址的信息,而普通情况下只需输入帐号名 .
DeleGate能让你在碰到不支持SOCKS协议的客户程序时使用" manual traversal"机 制.
我还听说过另一种SOCKS服务器软件,名叫"Dante"---也能在(http://www.freshmeat.net)找到.
还有几种专一于特定服务的代理.比如 Apache web 服务器,CERN web服务器和其它几种服务器可作为"caching web proxies"(不仅代理web访问请求,还能cache传输 来的文件). Squid也可以代理并cache web和FTP请求.
有一些服务,如mail和DNS,本身就设计成具有"代理"功能.在这封信里我不可能详细介绍DNS或e-mail服务了.有几本书专门介绍这些.
以上所说的是把Linux设成私人网络与Internet之间的网关的非常基础的知识 .如果你得到了一些"真正的"IP地址,并执意要使用它们从而在你的LAN中使用"DRIP"(directly routed IP),你不一定要设IP伪装或代理---但你要采用包过滤措施来 保护你的客户系统和服务器.
设计好包过滤是很困难的.问题之一我在前面已经有所提及,就是FTP需要两个不同的连接---一个向外发出的控制连接和一个进来的数据连接.还有一个辅助的 "PASV"即"消极(passive)"模式,---不过它还是需要两个连接.简单的包过滤措施将把事情搞得一团糟,因为我们不能仅仅盲目地拒绝所有"进来的"连接请求(根据 TCP数据包报头的SYN和ACK标志位的状态来判断)."状态检查"("stateful inspection")的一个"好处"(或复杂之处)就在于它跟踪这些连接(及所有连接的 TCP序列号)以保证一致性.
一组像样的包过滤措施将比我在这里提供的代理和伪装的例子复杂得多.我个人不喜欢DRIP类型的设置.我觉得它们给家庭和小公司的网络带来了太多风险.不过,下面有一个例子
# Flush the packet filtering tables
/root/bin/flushfw
# Set default policy to deny
/sbin/ipfwadm -I -p deny
/sbin/ipfwadm -F -p deny
/sbin/ipfwadm -O -p deny
# Some anti-martian rules -- and log them
## eth1 is outside interface
/sbin/ipfwadm -I -o -W eth1 -a deny -S 192.168.0.0/16
/sbin/ipfwadm -I -o -W eth1 -a deny -S 172.16.0.0/12
/sbin/ipfwadm -I -o -W eth1 -a deny -S 10.0.0.0/8
/sbin/ipfwadm -I -o -W eth1 -a deny -S 127.0.0.0/8
# Some anti-leakage rules -- with logging
## eth1 is outside interface
/sbin/ipfwadm -O -o -W eth1 -a deny -S 192.168.0.0/16
/sbin/ipfwadm -O -o -W eth1 -a deny -S 172.16.0.0/12
/sbin/ipfwadm -O -o -W eth1 -a deny -S 10.0.0.0/8
/sbin/ipfwadm -O -o -W eth1 -a deny -S 127.0.0.0/8
## these are taken from RFC1918 --- plus
## the 127.* which is reserved for loopback interfaces
# An anti-spoofing rule -- with logging
/sbin/ipfwadm -I -o -W eth1 -a deny -S 222.250.185.16/28
# No talking to our fw machine directly
## (all packets are destined for forwarding to elsewhere)
/sbin/ipfwadm -I -o -a deny -D 222.250.185.14/32
/sbin/ipfwadm -I -o -a deny -D 222.250.185.30/32
# An anti-broadcast Rules
## (block broadcasts)
/sbin/ipfwadm -F -o -a deny -D 222.250.185.15/32
/sbin/ipfwadm -F -o -a deny -D 222.250.185.31/32
# Allow DNS
## only from the servers listed in my caching servers
## /etc/resolv.conf
/sbin/ipfwadm -F -a acc -D 222.250.185.18/32 -P udp -S 192.155.183.72/32
/sbin/ipfwadm -F -a acc -D 222.250.185.18/32 -P udp -S 192.174.82.4/32
/sbin/ipfwadm -F -a acc -D 222.250.185.18/32 -P udp -S 192.174.82.12/32
# anti-reserved ports rules
## block incoming access to all services
/sbin/ipfwadm -F -o -a deny -D 222.250.185.16/28 1:1026 -P tcp
/sbin/ipfwadm -F -o -a deny -D 222.250.185.16/28 1:1026 -P udp
# Diode
## (block incoming SYN/-ACK connection requests)
## breaks FTP
/sbin/ipfwadm -F -o -a deny -D 222.250.185.16/28 -y
## /sbin/ipfwadm -F -o -i acc
## -S 0.0.0.0/0 20 -D 222.250.185.16/28 1026:65535 -y
## simplistic FTP allow grr!
# Allow client side access:
## (allow packets that are part of existing connections)
/sbin/ipfwadm -F -o -a acc -D 222.250.185.16/28 -k
这一组过滤规则有缺陷.读一下注释你就明白了,有一条规则处理FTP---却让所有使用1024以上端口的服务面临风险---比如X windows(用6000以上端口)等.攻击者只需拥有其系统的控制权(作为自己的Linux或其它Unix的root---并不很困难),并创建数据包使其看上去来自他们的TCP20号端口(FTP数据端口).同样,对于任何拥有 spak(send package)的人来说也是易如反掌.
所以,我把这条规则注释掉了,也没给出一组规则能允许本地系统与一个代理FTP系统连接.
注意这些地址是假的.就我所知它们不会代表任何真正的主机.
这些过滤规则中我唯一感到满意的是拒绝spoof数据包(即声称来自我自己的地址或者像本地主机一样来自私有或假想的地址的那些数据包)进入的那部分.还有一些规则是为了防范私人网络上任何走失的数据包不会"泄漏"到Internet上.这是一种礼貌---此外一个实际的好处是,我几乎不会把"私人网络"上分享的机密数据"泄漏"出去,哪怕我硬要把它们送出去.
我看过一些关于ipfil的资料,(Darren Reed开发的IP过滤软件包 --- 是 FreeBSD和其它BSD系统上的事实标准,也可在Linux上编译运行).这个软件似乎提供了某种"状态相关的"(stateful)特性,可能让你在开放非消极模式FTP时能更安全 .不过,具体细节我就不知道了.
2.2版的内核将包括修改过的内核包过滤机制,由ipchain命令控制.一系列非正式的2.0系列内核的补丁也提供了这些功能.这似乎没有提供任何"状态检查"特性 ,("stateful inspection")但比起现有的ipfwadm控制的表来说还是有不少改进的 .
你最后一个问题是想把Linux设成Internet服务器(可能用做公共WEB页,FTP或其它常见Internet服务).
可能你已经看出来了,提供Internet服务与提供你自己的LAN的服务是一样的 .在缺省情况下,Linux下(及其它类型的Unix)的任何服务都可在全世界范围内被访问 . (这也就是为什么我们需要防火墙).
我已经花了些时间介绍如何对Linux和Unix系统做些特殊设置来限制 指定的那些网络对你的服务的访问.否则,在巴西的什么人会像你自己一样容易地在你的打印机上打印文件.
要成为Internet服务器,所有你要做的就是拥有一个静态IP地址(或者定期更新你在 http://www.ml.org的地址记录).只要人们知道怎样把请求送达你的服务器,---假如你并没有采取措施拒绝那些请 求---Linux就会服务于它们.
设置网络过程中最具挑战性的是涉及地址,路由选择,域名和安全的那些部分.我们中的大多数在自己的网络上还在使用"静态"路由选择---就是架设新系统时手工分配IP地址 .使用拨号PPP的多数是从ISP那里得到动态IP地址.一些站点如今使用 DHCP来为桌面系统提供动态地址(服务器还是需要稳定的地址---为服务器使用 DHCP只会带来更多的麻烦).
至于路由,划分子网和LAN网段的问题---去看看我上个月贴出的关于路由的文章 (我想Heather会在这个月出版它).它长达30页!
(那篇文章里我省略了的一件事是以太网的 "proxyarp".这些将在这个月的另一封回信里介绍.所以,要是你想学更多东西,可以看看它).
我希望安全问题已经能引起你的注意.哪怕你的系统上没有任何有价值的东西---如果有cracker破坏你的文件取乐对你来说无关紧要---把一个不安全的系统连在 Internet上也是不负责任的(因为你的有漏洞的系统可能被用于破坏其它网络).
我想在一切完成之后写一个有关这个主题的FAQ...希望在我自己摸索了一些经验后能对别人有所帮助.
尽管这种贡献是令人赞赏的---能写成书更好.不过,我更希望看到一些 "个案研究"---讲述典型的SOHO(small office,home office即小办公室,家庭办公 室),部门的,企业的Linux方案.
这些方案研究应该包括网络布局,并提供每一个客户机和服务器的地址分配,路由表,网络服务的设置文件的"一目了然的"示例.公司名,域名和其它名字及IP地址应该被隐去,以避免被别有用心的人利用,并尽量减少公布带来的风险(提供者的 E-mail地址应该用假地址).
重要的是要确切描述你打算提供什么服务,和打算提供给哪些用户和用户组.这就是一个我已在前面反复提到的过程---需求分析.
你要知道你向什么人提供服务,他们需要什么服务.
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
Starshine Technical Services, http://www.starshine.org/
翻译:gaia
From Nilesh M.
Hi,
我有几个问题.我想把Linux设置成我的家用电脑的服务器,让它们共享一条 Internet连接,还想把它用做Internet服务器.
O.K.那是三种不同的角色:
网络服务器 (要提供哪些服务)
Internet网关 (代理(proxy) 和/或 伪装(masquerading))
Internet主机/服务器 (要提供哪些服务)
Linux可以同时扮演这三种角色---尽管就安全和风险评估而言"把所有的蛋放进一个篮子"未必是个好主意.
按常规,你还要考虑机器性能---不过拥有200+Pentium处理器,32M到256M RAM,4Gb到12Gb磁盘空间的典型的现代PC比起5到10年前的Unix已经是相当强大了 .
你知道不知道我能否用一个用于modem的10mbs以太网和一个用于家庭网络的100mbs以太网来设置Linux?应该从哪着手,怎么去做?
我猜想你指的是设一个10Mbps以太网用于cable modem,ISDN路由器(router)(如 Trancell/WebRamp,或Ascend Pipeline系列),或者DSL路由器.这些设备的功能是作 为你购买的cable,ISDN或xDSL服务的路由器,一般提供10Mbps接口.
你完全可以在Linux系统中安装两个或更多以太网卡.若你把任何标准的现代 100Mbps网卡用于10Mbps的局域网,它们会自动处理10Mbps的速率.所以你只管为你的系统安装两块这样的网卡,一块接路由器,另一块接高速HUB.
你通常要把以下这行加进/etc/lilo.conf文件里好让内核识别第二块网卡:
append="ether=0,0,eth1"
... 0,0,表示自动检测这个设备的 IRQ 及I/O基地址.否则你就需要像下面这样指定参数:
append="ether=10,0x300,eth0 ether=11,0x280,eth1"
这一行必须出现在/etc/lilo.conf的每一个Linux"段"中(即每一组引导Linux的选项,分别指向不同的Linux kernel,相应的root文件系统及其它设置).
当然了,你必须运行 /sbin/lilo命令以读入 /etc/lilo.conf 文件中的任何改变,并把它们"编译"进新的引导区和映 像("maps").
如果你的系统安装了普通的modem---照样可以用.你可以用PPP(使用pppd程序)通过普通电话线建立Internet连接.Linux还提供了对内置ISDN, T1 "FRADs" (frame relay access devices)和 CSU/DSU (即Codecs --- coder decoder units)的支持.
我还听说用于控制一些类型的内置ISDN卡的ipppd.我想多数其它设备都有相应的驱 动程序使它们"看似"Linux的 modem或以太网设备.
我只想买两块100mbs网卡互相连接...所以我想我并不需要集线器,对吗?我只想让两台机器连在这个简单网络上.
你要么需要一个HUB,要么需要一个"十字交叉"的ethernet patch cord.普通的5个接头(? cat 5)的ethernet patch cord没法正确直接连接两块网卡.
感谢你的每一点帮助,特别是像一些站点链接之类的信息,能让我找到教我怎样一步步设置的资料.
我不知道这样的链接.正如你可能已经知道的,Linux有一百多个HOWTO文件,其中许多和设置各种服务有关.
现在我们回到前面列出的几种不同的角色:
网络服务器(要提供哪些服务) Internet网关(代理(proxy)和/或IP伪装(masquerading)) Internet主机/服务器(要提供哪些服务)
从第一项开始说吧.你有一个平时不连在Internet上的小网络(即没有永久的Internet专线连接).所以你会希望你的系统使用"私人网络地址".这就是指保留的IP地址 ---它们不会被分配给任何Internet上的主机(所以,使用它们不会导致你的系统在选择路由时产生歧义).
有三类这样的地址:
192.168.*.* --- 255个C类网络 172.16.*.* 到 172.31.*.* --- 15个B类网络 10.*.*.* --- 1个A类网络
... 我为我家里的网络分配了 192.168.42.*
... 这些地址还可以被防火墙和Internet网关(gateways)后面的系统使用.
就Linux而言,我们可以把一个Linux系统设置成本地服务器和Internet网关.我们的网关的实现可以通过"代理"(使用SOCKS或其它应用层工具在我们的私人网络和 Internet之间转发数据),或者通过IP伪装(在数据包被转发时,使用内建于内核的网络地址翻译代码重写数据包---一种网络层透明的代理方式).
不过,我们说得太远了点.
首先我们要设置Linux LAN服务器.所以,安装好Linux并设置好其网卡的IP地址,如 192.168.5.1.内核路由表里应该有指向我们的内部网络的路由,就像下面这样:
route add -net 192.168.5.0 eth0
... 这就告诉内核所有地址是 192.168.5.* 的主机位于与eth0相连的网段.
现在,想想你希望为你的其它机器提供什么服务.
Linux在缺省安装时就为任何能访问你的系统的机器提供了一些常见服务 (telnet, NFS, FTP, rsh, rlogin, sendmail/SMTP, web,samba/SMB, POP和 IMAP等等).多数这些服务要通过名叫inetd的"internet服务分派程序 "才能得到.这些服务的清单在 /etc/inetd.conf里.一些其它服务,如 mail传送及转发(sendmail),和web (Apache httpd)以"standalone"模式启动 ---即由 /etc/rc.d/*/S* 脚本启动而不需要inetd.NFS是一个特殊服务,需要几个不同的守护进程参与完成---特别是 portmapper和 mountd.因为NFS是基于"RPC"(远端过程调用)的服务.
既然所有能送数据包给你的系统都可以请求你的系统提供的服务,既然多数Unix和 Linux系统提供全套服务,这就出现了一个严重的安全问题.任何服务的守护进程的任何bug会导致整个系统的不可靠,从而可能被世界任何一个角落的人利用.这就导致了TCP包装程序(TCP Wrappers)的产生.(所有主要Linux发布都缺省安装了它---但缺省设置成提供全部权限).也就是为什么我们有"防火墙"和"包过滤".
你容易以为你很隐蔽,谁也不会闯进来.然而,如今有很多cracker和script kiddies,他们花费大量时间在"端口扫描"("portscanning")上---寻找脆弱的系统 ---把他们叫过来,利用他们做进一步的portscanning sniffing, 破解口令 ,spamming,破解软件,及其它活动.
我最近安装了一条DSL线路.所以我现在可以一直连在Internet上.我装上它还不足一个月,还没有指向我的IP地址的DNS记录.但我已经做了至少三次扫描寻找一些常见的 IMAP的bug,还有一次寻找一个mountd 的bug.所以,我敢说你并没有隐避得能高枕无忧.
当你通过ISDN或POTS(plain old telephone service)线路使用拨号PPP时,你仍有些风险.当你做这些时,风险仍在你这边.然而,设置你的系统以避免这类问题还是 值得的.
所以,你有必要如下编辑两个文件:
/etc/hosts.allow
ALL:LOCAL
/etc/hosts.deny
ALL:ALL
... 这绝对是你最低限度要考虑的.这样设置意味着tcpd程序(TCP Wrappers)允许 "local"系统访问(相对于你的域名,其主机名中没有"点"的那些主机),并且拒绝其它所有主机对一切服务的访问.
为了让这项措施正常工作,你要确认所有你的本地主机在/etc/hosts文件里正确地有自己的一项,且/或你已经正确设置了你自己的DNS服务的 forward 和reverse区.你还有必要确认你的/etc/host.conf (libc5)文 件和/或 /etc/nsswitch.conf (glibc2,即libc6)设置成首先搜索 /etc/hosts文件.
我的host.conf文件是这样的:
# /etc/host.conf
order hosts bind
multi on
我的/etc/nsswitch.conf是这样:
passwd: db files nis
shadow: db files nis
group: db files nis
hosts: files dns
networks: files dns
services: db files
protocols: db files
rpc: db files
ethers: db files
netmasks: files
netgroup: files
bootparams: files
automount: files
aliases: files
glibc2提供了一些钩函数,所以使用模块化的服务库(service libraries)对上面文件里每一种数据库的搜索和处理是可扩展的.所以很快我们将可以看到在这个服务调度文件(services switch file)中加入 LDAP服务---那样主机(hosts)用户(passwd或shadow?),用户组 (group)等信息就可以用名为nss_ldap的模块库来查询和处理,而nss_ldap模块与 LDAP服务器打交道.我们还可能看到用某种nss_hesiod模块对一些用户和用户组信息提供"Hesiod"服务(通过DNS或secureDNS协议).甚至我们会看到用一个 nss_nds模块来提供NDS(Novell/Netware目录服务).
不过话说得远了点.
一旦你做完这些,你就可以为你的LAN提供普通服务了.简单地说你如何设置你的客户系统取决于它们运行什么OS,和你想让它们得到什么服务.
比如,如果你想通过NFS让你的Linux或其它Unix客户共享文件,你要编辑你的 Linux服务器上的/etc/exports文件指定哪些目录树对哪些客户系统是可访问的.
以我自己的系统上的exports文件为例:
-+
# / *.starshine.org(ro,insecure,no_root_squash)
# / 192.168.5.*(ro,insecure,no_root_squash)
/etc/ (noaccess)
/root/ (noaccess)
/mnt/cdrom 192.168.5.*(insecure,ro,no_root_squash)
... 注意我在向我的LAN输出根目录时把两个目录标记为noaccess".这样做是为了防止我的网络上其它系统读我的设置文件和passwd/shadow文件.我只用 read-only模式输出我的根目录,并且只是偶尔才暂时地输出根目录(这就是为什么你看到时这几行是被注释掉的).我的CDROM设为可访问的,因为我并不担心屋子里的任何人读我的任何CD上的数据.
牢牢记住NFS就是 "no flippin security"(不堪一击的安全性) --- 任何能控制你的网络上任何系统的人都能够变成非root用户身份执行操作,并以那个用户的"名义"访问任何共享的NFS(NFS是为这样一种情况设 计的:只有少数主机并且都被锁在屋子里严格控制;而不是为在现代办公环境中使用而设计的:你夹着安装了Linux,FreeBSD,甚至 Solaris x86系统的膝上机走进办公室,把它连在最近的以太网插口上(这在现代办 公室随处可见---我在某些地方的接待区(reception areas)也见过).
为了与你的Windows系统共享文件,你需编辑 /etc/smb.conf.文件来设置 Samba.要想作MacOS的文件服务器,你需要安装并设置 etatalk.要想模拟 Netware文件服务器,你要安装Mars_nwe,和/或从Caldera (http://www.caldera.com)买一份Netware Server for Linux.
这些组件的每一个都有几种方法能把你的系统设置为打印服务器.
说完文件和打印服务,我们来看看"标准的Internet服务"( "commodity internet services")如FTP,telnet,HTTP (WWW).一般说来,如果你安装了任何通用的Linux发布,它们并不需要特殊的设置.
如果在/etc/passwd文件里你建立了一个FTP帐号,就允许通过匿名FTP访问你的某一子目录.如果你把这个帐号改名为"noftp"或"ftpx"或除了"ftp"的任何名字,或者干脆删除这个帐号,你的系统将关闭FTP服务.如果你开放FTP服务,你只需把你想共享的文件放进FTP的主目录的/pub目录下---确认它们是"可读"权限.FTP服务缺省由tcpd运行,所以要依据你的hosts.allow/hosts.deny文件的设置.
如果你打算建立一个"真正的"FTP站点,用作公共镜像或专业"extranet"应用,你恐怕需要用ncftpd, proftpd,或beroftpd代替已经过时的WU-ftpd或旧的BSD FTP守护程序(in.ftpd).这些替代的FTP守护程序有自己的设置文件,可以支持虚拟主机和其它特性.它们中有的允许你建立"虚拟用户"---这些帐号只允许通过FTP访问指定FTP子目录;还有虚拟主机服务---这些帐号可以被用于访问系统的任何其它服务.
Web服务由它们自己的设置文件控制.有几本书专门介绍Apache服务器的设置.缺省情况下,它们允许所有人浏览你放进魔力目录(magic directories)的所有网页 (/home/httpd/docs 或类似目录).
你可以根据客户的IP地址(或反过来找到它的DNS名字)来限制对特定目录的访问.和 TCP Wrappers一样,这不能被认为是一种"认证"---但它可以用于区分"本地"与"非本地"系统,如果你设置了反欺骗包过滤措施( ANTI-SPOOFING PACKET FILTERS)(任何好的防火墙都会有这部分).
telnet, rlogin, rsh,和其它类型的交互式shell访问通常极容易设置.像许多Unix/Linux服务一样,取消或限制访问比开放它们要麻烦得多.
在Red HatLinux下,这些和其它"需认证的"服务可通过编辑/etc/pam.d/下的PAM设置文件来控制.
所以,对于"如何把Linux设置成服务器"这个问题的简单回答就是,安装它,设置地址和路由选择,然后安装并设置你想提供的服务.
当我们想把Linux用作Internet网关时(或通向任何其它网络的网关---把你的家庭网络与你办公室或朋友的网络连接),你首先要解决的是地址分配和路由选择问题(设好你的第二个接口,并把它正确地加入路由表).然后利用IP伪装或代理服务 (SOCKS)使你的网络系统(使用的是"私人网络"地址)能够访问 Internet服务.
要用旧的ipfwadm(标准2.0.x内核)实现IP伪装,你只需用这样的命令行:
ipfwadm -F -a accept -m -D 0.0.0.0/0 -S 192.168.5.0/24
... 加入 (-a即add)一条规则到转发表中 (-F即 forwarding)以"接受(accept)"并伪装 (-m即"masquerading")符合以下条件的数据包:其目的地(-D即"destined for")为任何地址 (0.0.0.0/0),且其源IP地址(-S)符合192.168.5.0/24(24是一个地址掩码(相当于255.255.255.0),指定地址的前24bit即三位八进制数作为IP地址的"网络部分"---从而覆盖了这个C类网络的全部).
你应该使用模块化编译的内核,并且当你使用这种伪装技术时,几乎总是应该启动 kerneld来装载模块.这是因为有一些常见协议(特别是FTP)在伪装时需要特别处理(拿FTP协议来说,数据连接是从服务器向客户端(发出请求),然而通常数据连接的方向是从客户到服务器).
因为这个原因,我其实偏爱应用层的代理.你可以到任何Red Hat的站点的"contrib"目录下,下载SOCKS服务器和客户端软件.把服务器安装在你的Linux网关上,再把客户软件安装在任何你的Linux客户上.
在SOCKS网关上,创建一个文件: /etc/socks5.conf 照此写入内容:
route 192.168.5. - eth0
permit - - - - - -
... 你可以用很多选项来限制对socks网关的访问---不过这个是最简单的例子.
在Linux客户端,建立一个叫/etc/libsocks5.conf的文件,写入类似下面的一项:
socks5 - - - - 192.168.5.2
noproxy - 192.168.5. -
... 其中".2"地址就是我运行SOCKS服务器的主机.
对非Linux客户机,你要用各种不同设置方法.多数Windows TCP/IP工具集(除了 Microsoft的)支持SOCKS代理.有一些替代的WINSOCK.DLL,可以透明地为多数或全部其它Windows服务提供对这种代理协议的支持.MacOS应用程序似乎也广泛支持 SOCKS.
还有一些NECs SOCKS服务器的替代品.我发现"DeleGate"就是相当不错的一个(到 Freshmeat去搜索一下).DeleGate的优点在于,你不仅可以把它用作"SOCKS"兼容的代理,还可以用作"manually traversal"代理.SOCKS代理协议允许客户端软件与代理服务器软件通讯,并发送给服务器有关请求信息,服务器反过来把请求转发给外部的服务器上运行的某个进程.这就是所谓"traversal."
非SOCKS的代理不得不用其它" traversal"机制.很多就是"manually traversed" ---我telnet 或ftp到TIS FWTK代理上 (打个比方)然后以"[email protected]."登录 ---换句话说,我向提示 符输入了附加的帐号和目的地址的信息,而普通情况下只需输入帐号名 .
DeleGate能让你在碰到不支持SOCKS协议的客户程序时使用" manual traversal"机 制.
我还听说过另一种SOCKS服务器软件,名叫"Dante"---也能在(http://www.freshmeat.net)找到.
还有几种专一于特定服务的代理.比如 Apache web 服务器,CERN web服务器和其它几种服务器可作为"caching web proxies"(不仅代理web访问请求,还能cache传输 来的文件). Squid也可以代理并cache web和FTP请求.
有一些服务,如mail和DNS,本身就设计成具有"代理"功能.在这封信里我不可能详细介绍DNS或e-mail服务了.有几本书专门介绍这些.
以上所说的是把Linux设成私人网络与Internet之间的网关的非常基础的知识 .如果你得到了一些"真正的"IP地址,并执意要使用它们从而在你的LAN中使用"DRIP"(directly routed IP),你不一定要设IP伪装或代理---但你要采用包过滤措施来 保护你的客户系统和服务器.
设计好包过滤是很困难的.问题之一我在前面已经有所提及,就是FTP需要两个不同的连接---一个向外发出的控制连接和一个进来的数据连接.还有一个辅助的 "PASV"即"消极(passive)"模式,---不过它还是需要两个连接.简单的包过滤措施将把事情搞得一团糟,因为我们不能仅仅盲目地拒绝所有"进来的"连接请求(根据 TCP数据包报头的SYN和ACK标志位的状态来判断)."状态检查"("stateful inspection")的一个"好处"(或复杂之处)就在于它跟踪这些连接(及所有连接的 TCP序列号)以保证一致性.
一组像样的包过滤措施将比我在这里提供的代理和伪装的例子复杂得多.我个人不喜欢DRIP类型的设置.我觉得它们给家庭和小公司的网络带来了太多风险.不过,下面有一个例子
# Flush the packet filtering tables
/root/bin/flushfw
# Set default policy to deny
/sbin/ipfwadm -I -p deny
/sbin/ipfwadm -F -p deny
/sbin/ipfwadm -O -p deny
# Some anti-martian rules -- and log them
## eth1 is outside interface
/sbin/ipfwadm -I -o -W eth1 -a deny -S 192.168.0.0/16
/sbin/ipfwadm -I -o -W eth1 -a deny -S 172.16.0.0/12
/sbin/ipfwadm -I -o -W eth1 -a deny -S 10.0.0.0/8
/sbin/ipfwadm -I -o -W eth1 -a deny -S 127.0.0.0/8
# Some anti-leakage rules -- with logging
## eth1 is outside interface
/sbin/ipfwadm -O -o -W eth1 -a deny -S 192.168.0.0/16
/sbin/ipfwadm -O -o -W eth1 -a deny -S 172.16.0.0/12
/sbin/ipfwadm -O -o -W eth1 -a deny -S 10.0.0.0/8
/sbin/ipfwadm -O -o -W eth1 -a deny -S 127.0.0.0/8
## these are taken from RFC1918 --- plus
## the 127.* which is reserved for loopback interfaces
# An anti-spoofing rule -- with logging
/sbin/ipfwadm -I -o -W eth1 -a deny -S 222.250.185.16/28
# No talking to our fw machine directly
## (all packets are destined for forwarding to elsewhere)
/sbin/ipfwadm -I -o -a deny -D 222.250.185.14/32
/sbin/ipfwadm -I -o -a deny -D 222.250.185.30/32
# An anti-broadcast Rules
## (block broadcasts)
/sbin/ipfwadm -F -o -a deny -D 222.250.185.15/32
/sbin/ipfwadm -F -o -a deny -D 222.250.185.31/32
# Allow DNS
## only from the servers listed in my caching servers
## /etc/resolv.conf
/sbin/ipfwadm -F -a acc -D 222.250.185.18/32 -P udp -S 192.155.183.72/32
/sbin/ipfwadm -F -a acc -D 222.250.185.18/32 -P udp -S 192.174.82.4/32
/sbin/ipfwadm -F -a acc -D 222.250.185.18/32 -P udp -S 192.174.82.12/32
# anti-reserved ports rules
## block incoming access to all services
/sbin/ipfwadm -F -o -a deny -D 222.250.185.16/28 1:1026 -P tcp
/sbin/ipfwadm -F -o -a deny -D 222.250.185.16/28 1:1026 -P udp
# Diode
## (block incoming SYN/-ACK connection requests)
## breaks FTP
/sbin/ipfwadm -F -o -a deny -D 222.250.185.16/28 -y
## /sbin/ipfwadm -F -o -i acc
## -S 0.0.0.0/0 20 -D 222.250.185.16/28 1026:65535 -y
## simplistic FTP allow grr!
# Allow client side access:
## (allow packets that are part of existing connections)
/sbin/ipfwadm -F -o -a acc -D 222.250.185.16/28 -k
这一组过滤规则有缺陷.读一下注释你就明白了,有一条规则处理FTP---却让所有使用1024以上端口的服务面临风险---比如X windows(用6000以上端口)等.攻击者只需拥有其系统的控制权(作为自己的Linux或其它Unix的root---并不很困难),并创建数据包使其看上去来自他们的TCP20号端口(FTP数据端口).同样,对于任何拥有 spak(send package)的人来说也是易如反掌.
所以,我把这条规则注释掉了,也没给出一组规则能允许本地系统与一个代理FTP系统连接.
注意这些地址是假的.就我所知它们不会代表任何真正的主机.
这些过滤规则中我唯一感到满意的是拒绝spoof数据包(即声称来自我自己的地址或者像本地主机一样来自私有或假想的地址的那些数据包)进入的那部分.还有一些规则是为了防范私人网络上任何走失的数据包不会"泄漏"到Internet上.这是一种礼貌---此外一个实际的好处是,我几乎不会把"私人网络"上分享的机密数据"泄漏"出去,哪怕我硬要把它们送出去.
我看过一些关于ipfil的资料,(Darren Reed开发的IP过滤软件包 --- 是 FreeBSD和其它BSD系统上的事实标准,也可在Linux上编译运行).这个软件似乎提供了某种"状态相关的"(stateful)特性,可能让你在开放非消极模式FTP时能更安全 .不过,具体细节我就不知道了.
2.2版的内核将包括修改过的内核包过滤机制,由ipchain命令控制.一系列非正式的2.0系列内核的补丁也提供了这些功能.这似乎没有提供任何"状态检查"特性 ,("stateful inspection")但比起现有的ipfwadm控制的表来说还是有不少改进的 .
你最后一个问题是想把Linux设成Internet服务器(可能用做公共WEB页,FTP或其它常见Internet服务).
可能你已经看出来了,提供Internet服务与提供你自己的LAN的服务是一样的 .在缺省情况下,Linux下(及其它类型的Unix)的任何服务都可在全世界范围内被访问 . (这也就是为什么我们需要防火墙).
我已经花了些时间介绍如何对Linux和Unix系统做些特殊设置来限制 指定的那些网络对你的服务的访问.否则,在巴西的什么人会像你自己一样容易地在你的打印机上打印文件.
要成为Internet服务器,所有你要做的就是拥有一个静态IP地址(或者定期更新你在 http://www.ml.org的地址记录).只要人们知道怎样把请求送达你的服务器,---假如你并没有采取措施拒绝那些请 求---Linux就会服务于它们.
设置网络过程中最具挑战性的是涉及地址,路由选择,域名和安全的那些部分.我们中的大多数在自己的网络上还在使用"静态"路由选择---就是架设新系统时手工分配IP地址 .使用拨号PPP的多数是从ISP那里得到动态IP地址.一些站点如今使用 DHCP来为桌面系统提供动态地址(服务器还是需要稳定的地址---为服务器使用 DHCP只会带来更多的麻烦).
至于路由,划分子网和LAN网段的问题---去看看我上个月贴出的关于路由的文章 (我想Heather会在这个月出版它).它长达30页!
(那篇文章里我省略了的一件事是以太网的 "proxyarp".这些将在这个月的另一封回信里介绍.所以,要是你想学更多东西,可以看看它).
我希望安全问题已经能引起你的注意.哪怕你的系统上没有任何有价值的东西---如果有cracker破坏你的文件取乐对你来说无关紧要---把一个不安全的系统连在 Internet上也是不负责任的(因为你的有漏洞的系统可能被用于破坏其它网络).
我想在一切完成之后写一个有关这个主题的FAQ...希望在我自己摸索了一些经验后能对别人有所帮助.
尽管这种贡献是令人赞赏的---能写成书更好.不过,我更希望看到一些 "个案研究"---讲述典型的SOHO(small office,home office即小办公室,家庭办公 室),部门的,企业的Linux方案.
这些方案研究应该包括网络布局,并提供每一个客户机和服务器的地址分配,路由表,网络服务的设置文件的"一目了然的"示例.公司名,域名和其它名字及IP地址应该被隐去,以避免被别有用心的人利用,并尽量减少公布带来的风险(提供者的 E-mail地址应该用假地址).
重要的是要确切描述你打算提供什么服务,和打算提供给哪些用户和用户组.这就是一个我已在前面反复提到的过程---需求分析.
你要知道你向什么人提供服务,他们需要什么服务.
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
相关阅读 更多 +