vsFTPD Pasv Mode behind FortiGate Firewall.

以前都是用RHEL直接當防火牆使用,FTP使用都很正常,直到某次手癢把防火牆換成Fortigate之後就是噩夢的開始。

User一直反映連線很慢,有些Client連線都還會有問題,還好都一一解掉了。

首先問題有幾個:
a.登入打完帳號密碼後反應很慢,連線正常。

最後查出來是:反解的問題,但是以前FTP Server直接對外並沒有這個問題,還不知道為啥躲在Fortigate後面就有這問題。
在vsftp.conf加入下面設定即可。
reverse_lookup_enable=NO

以下是 vsftpd 關於反解的說明:
reverse_lookup_enable
Set to YES if you want vsftpd to transform the ip address into the hostname, before pam authentication. This is useful if you use pam_access
including the hostname. If you want vsftpd to run on the environment where the reverse lookup for some hostname is available and the name server
doesn’t respond for a while, you should set this to NO to avoid a performance issue.
Default: YES

b.Pasv Mode 得到的Port號有誤。
這個就是Fortigate的鍋了,Fortinet有一個功能是session helpers不知道為啥,會對FTP做出干擾。
假定原本傳送給Client的PortNumber是3000-3010,他會給你亂跳到完全不相關的PortNumber上去。

檢測方式:在cmd > ftp ftp.yourftp.com > 登入進去之後 > quote pasv
會得到 Entering Passive Mode (xxx,xxx,xxx,xxx,250,120)
前面的xxx.xxx.xxx.xxx是IP,後面的250,120是Port Number,
計算方式為 250*256+120=64120

其中一個解決方式,就是放大Pasv Port的範圍,但這個有安全上的疑慮,我自己就不採用。

第二種方式就是要到Fortigate裡面把session helpers針對FTP的設定拿掉。
ssh admin@fortigate (Login via ssh)
show system session-helper (Display session-helper data)

以我目前版本為例,目前是在9的位置。
edit 9
set name ftp
set protocol 6
set port 21

config system session-helper (Enter Config Mode)
delete 9 (Delete 9)
end (end)

此時再去測試,就會發現拿到正常的Pasv Port,但是天不從人願,通常事情沒那麼簡單。
因為以前FTP Server 直接對外,給的Pasv IP是正確的,
現在躲在Fortigate後面,NAT的部分就不說了,問題是FTP給出去的IP會是內網的IP,
所以我們要再告訴Client我們的Public IP是多少。
在vsftp.conf加入下面設定即可。
pasv_address=xxx.xxx.xxx.xxx

這樣就大功告成了。

為了這檔事,花了很多時間重看FTP的協定也是因禍得福……