1. 程式人生 > >openwrt下增加FTP alg功能

openwrt下增加FTP alg功能

最近有個需求開發,需要在openwrt的系統中增加FTP ALG(應用層閘道器Application Layer Gateway)功能,把我的整個處理個程記錄下來。

功能描述:

ALG,Application Layer Gateway的縮寫,這是一般網路裝置或者主機都必備的一個小模組,那ALG是為了完成一個什麼功能呢?這首先要從IPV4的地址過少說起,因為IPV4地址過少,所以規定了部分地址給內部分配使用,這種地址段在網際網路上是不分配的,其中有10.X.X.X和192.168.X.X,一般公司較大的就用前一種,公司較小的就用後一種。(比如我在公司的機器就是192.168.1.11)這樣使用內部地址的機器要訪問一個外部網路的伺服器時,如大家平時在公司通過本地區域網的閘道器或路由器訪問雅虎,這個時候閘道器或者路由器上必須有一個網路地址轉換模組(NAT),可以把你的報文中的內部地址(192.168.1.X)轉換成一個你從ISP處得到的外部地址,這樣來完成網路訪問。

詳細說明如下: FTP資料連線的協商分為兩種模式,一種是主動模式,另一種是被動模式。

主動模式的特點是,在客戶端和伺服器端要進行檔案傳遞時,首先是客戶端使用一個報文告訴伺服器端,它將用某個IP地址的某個埠作為資料連線(這個資訊就是報文的載荷),也就是通常說的PORT命令。伺服器端收到這個報文後,迴應一個同意的ACK報文,然後伺服器端會主動用自己的IP地址加上埠20來發送一個SYN報文到客戶端通過PORT命令告訴它的那個IP地址和埠,和客戶端建立起一個數據連線。

  被動模式的特點是,在客戶端和伺服器端要進行檔案傳遞時,首先是伺服器端通過一個報文告訴客戶端,它將用那一個IP地址的那一個埠作為資料連線(該報文以命令字227開始),也就是PASV命令。客戶端收到這個報文之後,迴應一個同意的ACK報文。然後客戶端會用自己的IP地址,然後任選一個能夠使用的埠(注意:通常情況下都不是20)和伺服器端告訴它的那個IP地址和埠相連線,建立資料連線。

被動模式不需要alg支援,主動模式則需要alg支援才能正常工作。

FTP ALG編譯

  1. ftp alg 涉及到的核心檔案, 編譯完成後,在build_dir目錄中查詢,看看openwrt是否預設已帶了這個功能。 netfilter/nf_nat_ftp.c nf_conntrack_ftp.c

  2. ftp alg涉及到的巨集控制

    CONFIG_NF_CONNTRACK_FTP=m CONFIG_NF_NAT_FTP=m

  3. 開啟相關的巨集控制 a. include/netfilter.mk 在這個檔案中有下面兩行程式碼,表示ftp alg 受下面這兩個巨集控制

    (eval(call nf_add,NF_NATHELPER,CONFIG_NF_CONNTRACK_FTP, $(P_XT)nf_conntrack_ftp))

    (eval(call nf_add,NF_NATHELPER,CONFIG_NF_NAT_FTP, $(P_XT)nf_nat_ftp))

b. target/linux/generic/config-4.4 (主要看你使用的是哪個配置)

  在這裡主要配置
  CONFIG_NF_CONNTRACK_FTP=m
  CONFIG_NF_NAT_FTP=m

c . 還需要將NF_NATHELPER巨集開啟

./package/kernel/linux/modules/netfilter.mk 這裡面有針對這個巨集的編譯選項。 這裡寫圖片描述

  1. 檢視當前版本是否有編譯

./build_dir/target-mipsel_24kc_musl-1.1.16/linux-ramips_mt7628/packages/ipkg-mipsel_24kc/kmod-nf-nat/lib/modules/4.4.71/nf_nat_ftp.ko ./build_dir/target-mipsel_24kc_musl-1.1.16/linux-ramips_mt7628/packages/ipkg-mipsel_24kc/kmod-nf-nat/lib/modules/4.4.71/nf_conntrack_ftp.ko

  1. 檢視是否有安裝 ./build_dir/target-mipsel_24kc_musl-1.1.16/root-ramips/lib/modules/4.4.71/nf_conntrack_ftp.ko ./build_dir/target-mipsel_24kc_musl-1.1.16/root-ramips/lib/modules/4.4.71/nf_nat_ftp.ko

功有測試

  1. 檢視模組是否存在

    find / -name “*ftp.ko”

    /lib/modules/4.4.71/nf_conntrack_ftp.ko /lib/modules/4.4.71/nf_nat_ftp.ko /rom/lib/modules/4.4.71/nf_conntrack_ftp.ko /rom/lib/modules/4.4.71/nf_nat_ftp.ko

  2. 檢視模組是否安裝 lsmod | grep ftp

nf_conntrack 48073 10 nf_nat_ipv4,nf_conntrack_ipv6,nf_conntrack_ipv4,xt_state,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_ftp,nf_nat,nf_conntrack_rtcache,nf_conntrack_ftp nf_conntrack_ftp 5296 1 nf_nat_ftp nf_nat 9179 5 nf_nat_ipv4,xt_nat,nf_nat_redirect,nf_nat_masquerade_ipv4,nf_nat_ftp nf_nat_ftp 1264 0

  1. 功能測試 a. 載入ftp模組後,進行ftp傳輸並抓包 insmod ./lib/modules/4.4.71/nf_conntrack_ftp.ko insmod ./lib/modules/4.4.71/nf_nat_ftp.ko 這裡寫圖片描述

標識1 :表示當前的主動模式告訴伺服器使用52049的埠來訪問ftp client. 標識2: 表示主動模式請求成功。 標識3: 表示服務端成功使用埠52049來進行資料傳輸

b 解除安裝ftp模組後進行ftp傳輸並抓包 rmmod nf_nat_ftp rmmod nf_conntrack_ftp 這裡寫圖片描述 標識1 :表示當前的主動模式告訴伺服器使用52210的埠來訪問ftp client. 標識2: 表示主動模式請求失敗,client 主動切換成了被動模式 標識3: 表示資料傳輸使用的是被動模式,埠與之前請求的埠已經不一致了。

注: 當前的ftp client比較強大,當主動模式不通時會自動切換成被動模式,所以加不加alg都能正常工作,使用者感覺不出來。