1. 程式人生 > >FTP服務搭建(隨時蓋樓)

FTP服務搭建(隨時蓋樓)

FTP:file transfer protocol 檔案傳輸協議。使用埠為20(資料通道,傳輸檔案或目錄列表)和21(命令通道,傳輸使用者命令),FTP伺服器能夠從網上提供檔案的傳輸服務,遠端客戶端可以上傳和下載檔案。

linux中常見FTP伺服器有:proftpd、vsftp、wu-ftpd。

FTP工作模式有兩種:主動模式PROT和被動模式PASV。

主動模式:客戶端隨機開放1個大於1024的埠N向伺服器21埠發起連結,然後開發N+1埠進行監聽,並向伺服器發出PORT N+1命令,通知伺服器自己是主動模式。

伺服器接收到命令後,會用本地FTP資料埠20向客戶端指定的N+1埠傳輸資料。

被動模式

:客戶端隨機開發1個大於1024的埠N向伺服器21埠發起連結,然後開發N+1埠進行監聽,並向伺服器發出PASV N+1命令,通知伺服器自己是被動模式。

伺服器接收到命令後,會開發給1個大於1024的埠M進行監聽,然後使用PROT M命令通知客戶端,資料埠是M。客戶端使用N+1口段和伺服器M埠進行傳輸資料。


首先我們下載我們所需的proftpd原始碼檔案。

[[email protected] ~]# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.6.tar.gz
[[email protected]
  ~]# tar -zxvf proftpd-1.3.6.tar.gz  #報錯。 proftpd-1.3.6/ proftpd-1.3.6/.autom4te.cfg proftpd-1.3.6/.gitattributes proftpd-1.3.6/.github/ proftpd-1.3.6/.github/CONTRIBUTING.md proftpd-1.3.6/.github/ISSUE_TEMPLATE.md proftpd-1.3.6/.gitignore proftpd-1.3.6/.travis.yml proftpd-1.3.6/COPYING proftpd-1.3.6/CREDITS proftpd-1.3.6/ChangeLog gzip: stdin: unexpected end of file tar: 歸檔檔案中異常的 EOF tar: 歸檔檔案中異常的 EOF tar: Error is not recoverable: exiting now [
[email protected]
  ~]# ls -l proftpd-1.3.6.tar.gz -rw-r--r--. 1 root root 242200 10月 17 17:04 proftpd-1.3.6.tar.gz   #壓縮檔案錯誤。 [[email protected]  ~]# ls -l /tmp/proftpd-1.3.6.tar.gz -rw-r--r--. 1 root root 20251898 10月 17 18:37 /tmp/proftpd-1.3.6.tar.gz  #正確的。 [[email protected]  ~]# [[email protected] ~]# tar -zxvf /tmp/proftpd-1.3.6.tar.gz -C /usr/local/src/ [[email protected] ~]# cd /usr/local/src/proftpd-1.3.6


開始編譯安裝前,首先生成Makefile檔案。

引數介紹

[[email protected] proftpd-1.3.6]#./configure --help 檢視可用的引數,也可以在   閱讀詳細的引數。 
[[email protected] proftpd-1.3.6]#./configure --prefix=/usr/local/proftpd --sysconfdir=/etc --localstatedir=/var/log/proftpd --enable-shadow --enable-autoshadow --with-modules=mod_ratio:mod_readme:mod_wrap

預設安裝會安裝mod_auth,模組包含的指令http://www.proftpd.org/docs/modules/mod_auth.html

需要安裝mod_core,模組包含的指令http://www.proftpd.org/docs/modules/mod_core.html

我這裡所用的引數有,比較簡單哦~:

--prefix 安裝目錄放在/usr/local/proftpd下

--sysconfdir 配置檔案放在/etc下

--localstatedir 日誌檔案放在/var/log/proftpd下

--enable-shadow 

--enable-autoshadow 這兩項是可以使用/etc/shadow獲取密碼

--with-modules=mod_ratio:mod_readme:mod_wrap需要使用的模組

另外:

install_user=使用者名稱 install_group=組名 ./configure --prefix=/home/tj/proftpd/devel/build/ ... 使用使用者和組名進行安裝,不影響執行。



生成了makefile檔案就可以make編譯安裝了。

[[email protected] proftpd-1.3.6]# make

報錯啦:mod_wrap.c:34:18: 錯誤:tcpd.h:沒有那個檔案或目錄,需要安裝tcp_wrappers和tcp_wrappers-devel。

gcc -DHAVE_CONFIG_H  -DLINUX  -I.. -I../include  -O2 -Wall -c mod_wrap.c
mod_wrap.c:34:18: 錯誤:tcpd.h:沒有那個檔案或目錄
...
...
make[1]: *** [mod_wrap.o] 錯誤 1
make[1]: Leaving directory `/usr/local/src/proftpd-1.3.3/modules'
make: *** [modules] 錯誤 2
[[email protected] proftpd-1.3.3]# make clean
cd src/     && make clean
make[1]: Entering directory `/usr/local/src/proftpd-1.3.3/src'
rm -f *.o
make[1]: Leaving directory `/usr/local/src/proftpd-1.3.3/src'

[[email protected] proftpd-1.3.6]# yum install tcp_wrappers-7.6-57.el6.x86_64.rpm tcp_wrappers-devel-7.6-57.el6.x86_64.rpm -y
安裝完成後所需依賴包後。
[[email protected] proftpd-1.3.6]# make clean
[[email protected] proftpd-1.3.6]# make
[[email protected] proftpd-1.3.6]# make install


檢視/etc/proftpd.conf配置檔案

#全域性設定
設定項1 引數
設定項2 引數
#某個目錄的設定
<Directory 路徑名>
</Directory>
#關於匿名使用者的設定
<Anonymous>
<Limit 限制動作>
</Limit>
</Anonymous>

最簡單的配置,也是預設的配置

[[email protected] ~]# grep -Ev "^#|^$" /etc/proftpd.conf
ServerName                      "ProFTPD Default Installation"        #伺服器的名稱
ServerType                       standalone                   #服務型別存在兩種 standalone 和 inetd/xinetd模式。對於不經常用的ftp伺服器來說選擇xinetd較好。
DefaultServer                       on                       #是否開啟?
Port                          21                         #監聽埠
UseIPv6                        off                       #是否開啟ipv6
Umask                         022                        #上傳檔案的預設許可權
MaxInstances                       30                        #最大例項即pid數量
TimeoutStalled                                         300                                            #客戶端空閒時間
User                          nobody                       #啟動服務的使用者
Group                         nobody                       #啟動服務的組
DefaultRoot ~                                                         
RootLogin off                                             #是否允許root登入ftp,為安全建議off
AllowOverwrite                       off
DisplayLogin                       welcome.msg                  #歡迎資訊 
DisplayChdir                                           .message
<Limit SITE_CHMOD>
  DenyAll
</Limit>
<Anonymous ~ftp>
  User    ftp
  Group    ftp
  # We want clients to be able to login with "anonymous" as well as "ftp"
  UserAlias anonymous ftp
  # Limit the maximum number of anonymous logins
  MaxClients 10
  # We want 'welcome.msg' displayed at login, and '.message' displayed
  # in each newly chdired directory.
  DisplayLogin   welcome.msg
  DisplayChdir   .message
  # Limit WRITE everywhere in the anonymous chroot
  <Limit WRITE>
    DenyAll
  </Limit>
</Anonymous>

注:

1.ServerType服務型別存在兩種 standalone 和 inetd/xinetd模式。inetd/xinetd會統一管理服務,由inetd/xinetd來監聽21埠,若有客戶進來則由inetd/xinetd來啟動proftpd服務和管理連線,對於不經常用的ftp伺服器/流量小的伺服器來說選擇xinetd較好。

可以編輯xinetd.conf檔案
  service ftp
  {
        disable = no
        flags			= REUSE
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/proftpd
        server_args             = -c /etc/proftpd.conf
  }

2.DefaultRoot 限制使用者訪問目錄,此指令會出現在配置檔案上下文中(不能存在virtualhost global上下文中)、<VirtualHost>、<Global>中。

DefaultRoot ~ 所有使用者的根目錄都chroot到家目錄,標準語法DefaultRoot 目錄 組或所有

DefaultRoot ~ !user_ftp 不是user_ftp組的使用者chroot到家目錄

DefaultRoot /path/to/dir group1,group2  兩個組下的使用者chroot到/path/to/dir下。 這裡若使用符號連結作為根目錄,一定要注意儘量不要使用絕對路徑作為根目錄。當chroot後會失效的

3.匿名登入且安全上傳

<Anonymous /data>
  User                          ftp
  Group                         ftp
  AnonRequirePassword off
  UserAlias                     anonymous ftp
  MaxClients                    10
  DisplayLogin                  welcome.msg
  DisplayChdir                  .message

 <Directory test>
   <Limit STOR CWD>
     AllowALL
   </Limit>
   <Limit READ RMD DELE MKD>
    DenyAll
   </Limit>
 </Directory>
</Anonymous>

4.<Limit>指令有三種引數:ftp命令、ftp命令組、關鍵字ALL(所有哦)

ftp命令組有:

ALL 所有的FTP命令(除LOGIN)
DIRS 包括CDUP, CWD, LIST, MDTM, MLSD, MLST, NLST, PWD, RNFR, STAT, XCUP, XCWD, XPWD
LOGIN 包括client logins
READ 包括RETR SIZE
WRITE 包括APPE, DELE, MKD, RMD, RNTO, STOR, STOU, XMKD, XRMD
優先順序是 單個命令 > 命令組 > ALL

a.限制單個命令(格式SITE_COMMOND):如CHMOD命令(SITE_CHMOD)

<Limit SITE_CHMOD>
 DenyAll
</Limit>

b.如何限制某個使用者禁止訪問或限制某個ip禁止登陸ftp伺服器,使用<Limit>

<Limit LOGIN>

Deny from 192.16.8.146.***

</Limit>

可以檢視mod_ifsession模組和mod_wrap2也可以實現。

c.<Limit>的繼承,當<Limit>在<Directory>中時目錄的子目錄也會繼承<Limit>的限制哦。除非被更近的<Limit>所替代。

  <Directory /path/to/uploads>#上傳
    <Limit ALL>                #第一個limit  在這個目錄下進位制使用所有命令
      DenyAll
    </Limit>

    <Limit CDUP CWD PWD XCWD XCUP>        #第二個limit  在這個目錄下可以使用的命令
      AllowAll
    </Limit>

    <Limit STOR STOU>                    #可以使用的上傳命令
      AllowAll
    </Limit>
  </Directory>

d.基本常用的許可權限制有以下:

CMD:Change Working Directory 改變目錄
MKD:MaKe Directory 建立目錄的許可權
RNFR: ReName FRom 更改目錄名的許可權
DELE:DELEte 刪除檔案的許可權
RMD:ReMove Directory 刪除目錄的許可權
RETR:RETRieve 從服務端下載到客戶端的許可權
STOR:STORe 從客戶端上傳到服務端的許可權
READ:可讀的許可權,不包括列目錄的許可權,相當於 RETR,STAT等
WRITE:寫檔案或者目錄的許可權,包括 MKD和RMD
DIRS:是否允許列目錄,相當於LIST,NLST等許可權,還是比較實用的
ALL:所有許可權
LOGIN:是否允許登陸的許可權

e.可應用的範圍有:

AllowUser 針對某個使用者允許的Limit
DenyUser 針對某個使用者禁止的Limit
AllowGroup 針對某個使用者組允許的Limit
DenyGroup 針對某個使用者組禁止的Limit
AllowAll 針對所有使用者組允許的Limit
DenyAll 針對所有使用者禁止的Limit

5.虛擬FTP伺服器設定

為什麼要有虛擬伺服器,在單一主機提供多個站點或地址。

<VirtualHost 10.0.0.1>         #基於ip
ServerName“我的虛擬FTP伺服器” 
</VirtualHost>
<VirtualHost ftp.mydomain.com>   #基於名稱
    ... 
</ VirtualHost>

6.只允許匿名登入虛擬伺服器

<VirtualHost 10.0.0.1>
ServerName "My virtual FTP server"
<Limit LOGIN>
DenyAll
</Limit>
<Anonymous /usr/local/private>
User private
Group private
<Limit LOGIN>
AllowAll
</Limit>
...
</Anonymous>
</VirtualHost>