在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
FTP联机的两种模式
FTP采用 Client/Server 架构,FTP 协议比较特别的地方在于它在使用时必须建立二个联机:一个用来传输指令、一个用来传输档案。当我们使用 FTP 软件连到 FTP 服务器时,客户端会先连到服务器的连接端口21,并建立一条「控制联机」。接下来,您会输入账号、密码等指令,这些指令及 FTP 的响应都是使用都是使用「控制联机」。当您要下载档案时,或者是执行 ls 以列出目录中的档案时,档案或目录列表的下载是经另一个联机「数据联机」。「数据联机」和「控制联机」不同的是数据联机所传输的数据比较大,而控制联机只是用来传输指令及简单的响应。
基本上,一个完整的 FTP 联机建立过程为: 要解决 FTP Active Mode 的问题,可以在联机时改用「被动模式」(Passive Mode)。所谓的被动模式就是由服务器打开一个连接端口,被动地等客户端连过来建立「数据联机」。被动模式的联机建立过程为: 当您登入一台 FTP 服务器后,如果您输入 ls,却等了很久都没有响应,您可以输入 <Ctrl>+C 以中断命令。接着输入 passive 以进入被动模式,再打 ls 如果可以看到目录内容,则无法联机的问题一定是主动模式的原故。 设定 FTP 服务器 FreeBSD 内建有 FTP 服务器的功能,如果您要使用内建的 ftpd,我们不需要特别进行任何安装的动作,只要做好设定即可。 1 启动FTP服务器 有二种方式启动 ftpd,一种是使用 standalone daemon,另一种是使用 inetd。 使用 inetd 我们可以管理许多系统服务,例如 telnet、ssh、ftp 等,大部份的系统服务都是使用 inetd 来启动,使用它的好处在于可以统一管理各种服务,并经由它来设定服务规则,例如是否要阻挡某些 IP 来源等。不过,使用 inetd 的方式缺点是每次有联机要求时,inetd 的 daemon 必须依联机的种类去执行相对映的指令,所以速度比较慢。另一种启动 FTP 的方式是使用 standalone daemon,也就是直接执行 FTP daemon,当它接收到新的联机时,就 fork() 出来处理,这种方式联机建立的速度较快,比较适合专门的 FTP 服务器。使用 inetd,首先编辑 /etc/inetd.conf,将 ftp 设定开头的 # 移除: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l 接下来,我们必须使用下列指令重跑 inetd: # kill -1 `cat /var/run/inetd.pid` 现在您就可以开始使用 FreeBSD 的 FTP 服务了。 如果您要以独立的 daemon 方式启动 FTP,请先确定在 inetd.conf 中没有启动 FTP 服务。接下来,请在新增一个档案 /usr/local/etc/rc.d/ftpd.sh 内容如下: #!/bin/sh ftpd_program="/usr/libexec/ftpd" ftpd_flags="-D -l" case $1 in start) echo "Starting FTPD" $ftpd_program $ftpd_flags ;; stop) echo "Stopping FTPD" killall ftpd ;; restart) $0 stop sleep 1 $0 start ;; esac 编辑完后,我们必须将该档案变成可执行: # chmod 755 /usr/local/etc/rc.d/ftpd.sh 接下来,您就可以使用下列指令启动 FTPD 了: # /usr/local/etc/rc.d/ftpd.sh tart 如果您要停止 FTPD 服务,则使用下列指令: # /usr/local/etc/rc.d/ftpd.sh stop 2 编辑欢迎信息 当我们联机到一个 FTP 站点时,我们可以看到二个欢迎讯息,一个是登入前的讯息,另一个是登入后的讯息。开头为 220- 的就是登入前的讯息,我们称它为欢迎讯息。以 230- 为开头的是登入后的讯息,我们称它为本日讯息 (Message of the day)。这二种讯息我们都可以自行设定。 如果您要设定的是登入前的讯息,请新增一个档案 /etc/ftpwelcome,并将您的讯息写入该文件中。您不需要写 220- 等数据,FTP 服务器会自动帮您加上这种代码。而登入后的讯息是存放在 /etc/ftpmotd,您可以编辑该档以进行设定。 3 FTP服务器管理 在启动 FTP 服务器时,我们可以加入一些参数以调整服务器的行为。例如,修改预设的连接端口、记录使用者上传、下载的档案等等。有些参数必须要在使用独立的 daemon 方式启动时才有用,而有的参数在 inetd 模式下也可以使用。下表为我们常用的参数:
如果您要修改 ftpd 启动的参数,在 inetd 模式下,您可以修改 /etc/inetd.conf,并在 ftp 设定的最后面加入参数,如下列粗体字所示: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -d ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l -l -d 上面的范例中,我们多加入了参数 -l -d,以记录更多 ftpd 的讯息。 如果您是以独立的 Daemon 方式启动 ftpd,则请修改 /usr/local/etc/rc.d/ftpd.sh: #!/bin/sh ftpd_program="/usr/libexec/ftpd" ftpd_flags="-D -l -l -d" ... 我们只要修改 ftpd_flags 的部份,加入您所要的参数即可。 4 FTP权限控制 预设的 FTP 启动后,使用者可以上传、下载任何他们有权存取的档案。在登入后,使用者可以进到任何系统中的目录 (如果目录权限允许的话)。 我们可以设定限制某些账号不可以使用 FTP 登入。使用者在登入 FTP 服务器时,有几个规则会拒绝该账号登入: ftpd : localhost : allow ftpd : .nice.guy.example.com : allow ftpd : .evil.cracker.example.com : deny ftpd : ALL : allow 如果我们要限制某几个 IP 或网域不能使用 FTP,可以使用下列范例: # Provide a small amount of protection for ftpd ftpd : localhost : allow ftpd : 210.122.13.5 : deny ftpd : .evil.cracker : deny ftpd : ALL : allow 如果您要设定只有某些来源可以使用 FTP,而拒绝大多数的主机,则可以设定: # Provide a small amount of protection for ftpd ftpd : localhost : allow ftpd : 192.168.0. : allow ftpd : my.friend.com : allow ftpd : ALL : deny 在使用者登入后,只要目录、档案权限许可,它们可以自由的上传、下载档案。如果您希望加以限制读写的权限,可以在启动 FTP 时加上下列几个参数:
一般使用者登入后,预设会进入自己的家目录中。使用者可以改变工作路径到系统的任何目录中。如果您希望使用者登入后只能在自己的家目录中活动,而不能进入其它系统目录中,可以使用 chroot 的功能。所谓的 chroot 就是将某一个目录变成使用者看到的根目录。例如,我们让使用者 alex 登入后,将 /home/alex 变成根目录。则 alex 在使用指令「cd /」时,还是会停留在 /home/alex。如果他使用指令「pwd」查看目前所在路径,则会显示 /。如此一来,我们就可以确保使用者不会到处乱跑,进入一些不该进入的地方。这个功能对于提升 FTP 的安全性有莫大的助益。 设定 chroot 的方法很简单,只要修改 /etc/ftpchroot 即可。下面是一个范例: alex@guest john /var/ftp @other /var/ftp 其中第一行是设定使用者 alex 登入后,以自己的家目录为根目录。第二行的 @guest 表示只要是群组为 guest 的使用者,都以自己的家目录为根目录。而第三、四行分别表示使用者 john 及群组 other 都以 /var/ftp 为根目录。 只要我们善用 chroot 的功能,就可以加强保护系统其它目录,让没有权利的使用者不可以进入系统目录中。建议您在开放 FTP 服务时,将所有使用者都加入 /etc/ftpchroot 中。 我们平常在登入 FreeBSD 的 FTP 站台时,可以使用 anonymous 或是 ftp 这二个使用者登入,而且在登入时,任何密码都可以通过。这种可以使用 anonymous 登入的 FTP 就叫作匿名 FTP。anonymous 及 ftp 这二个账号是预设的匿名账号,当使用者以匿名登入时,服务器会将匿名账号对映到系统内的真实使用者 ftp。所以,如果您要提供匿名的 FTP 服务,请使用下列指令新增使用者账号 ftp: # pw adduser ftp # mkdir /home/ftp # chown ftp:ftp /home/ftp 我们建立了使用者 ftp 及其家目录 /home/ftp。使用 pw 指令所建立的使用者在 /etc/master.passwd 中的密码字段预设为 *,表示不可以登入。这个使用者除了匿名 FTP 外,将不可以使用 telnet、SSH、或是其它服务。 在新增了使用者 ftp 之后,我们就已经支持匿名 FTP 的功能了。现在您可以使用 anonymous 或 ftp 账号登入,而且不需任何密码。由于开放了匿名 FTP 后,任何人都可以登入系统,所以匿名账号登入后一定会使用 chroot,以将匿名使用者限制在家目录中。 除了强制使用 chroot 外,我们还可以在启动 FTP 时加上一些参数,以针对匿名使用者进行更多的限制。下表为启动 FTP 服务时可以使用的参数:
以上只是针对FreeBSD系统自带的简单ftpd进行的配置应用,如果希望架设更强大的FTP服务器,可以选用proftpd等工具来实现,而且在/usr/ports/ftp目录下就已经加入了proftpd这个工具,具体配置参考本人后续文章。 |
请发表评论