openwrt下增加FTP alg功能

最近有个需求开发,需要在openwrt的系统中增加FTP ALG(应用层网关Application Layer Gateway)功能,把我的整个处理个程记录下来。

功能描述:

普通NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力,在许多应用层协议中,比如多媒体协议(H.323、SIP等)、FTP、SQLNET等,TCP/UDP载荷中带有地址或者端口信息,这些内容不能被NAT进行有效的转换,就可能导致问题。而NAT ALG(Application Level Gateway,应用层网关)技术能对多通道协议进行应用层报文信息的解析和地址转换,将载荷中需要进行地址转换的IP地址和端口或者需特殊处理的字段进行相应的转换和处理,从而保证应用层通信的正确性。

FTP应用就由数据连接和控制连接共同完成,而且数据连接的建立动态地由控制连接中的载荷字段信息决定,这就需要ALG来完成载荷字段信息的转换,以保证后续数据连接的正确建立

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 ( e v a l (call nf_add,NF_NATHELPER,CONFIG_NF_CONNTRACK_FTP, $(P_XT)nf_conntrack_ftp))

    (eval ( e v a l (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 这里面有针对这个宏的编译选项。
openwrt下增加FTP alg功能_第1张图片

  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
    openwrt下增加FTP alg功能_第2张图片

标识1 :表示当前的主动模式告诉服务器使用52049的端口来访问ftp client.
标识2: 表示主动模式请求成功。
标识3: 表示服务端成功使用端口52049来进行数据传输

b 卸载ftp模块后进行ftp传输并抓包
rmmod nf_nat_ftp
rmmod nf_conntrack_ftp
openwrt下增加FTP alg功能_第3张图片
标识1 :表示当前的主动模式告诉服务器使用52210的端口来访问ftp client.
标识2: 表示主动模式请求失败,client 主动切换成了被动模式
标识3: 表示数据传输使用的是被动模式,端口与之前请求的端口已经不一致了。

注: 当前的ftp client比较强大,当主动模式不通时会自动切换成被动模式,所以加不加alg都能正常工作,用户感觉不出来。

你可能感兴趣的:(openwrt下增加FTP alg功能)