openWrt下增加FTP ALG功能

本文详细介绍了在OpenWRT系统中实现FTPALG(应用层网关)功能的过程,包括编译配置、模块加载及功能测试。FTPALG确保了NAT环境下FTP主动模式的正常运行,通过转换报文中的IP地址和端口,解决多媒体协议、FTP等应用层通信问题。

最近有个需求开发,需要在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编译

ftp alg 涉及到的内核文件, 编译完成后,在build_dir目录中查找,看看openwrt是否默认已带了这个功能。 
netfilter/nf_nat_ftp.c 
nf_conntrack_ftp.c

ftp alg涉及到的宏控制

CONFIG_NF_CONNTRACK_FTP=m 
CONFIG_NF_NAT_FTP=m

开启相关的宏控制 
a. include/netfilter.mk 
在这个文件中有下面两行代码,表示ftp alg 受下面这两个宏控制

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

(eval(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 这里面有针对这个宏的编译选项。 


查看当前版本是否有编译
./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

查看是否有安装 
./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
功能测试

查看模块是否存在

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

查看模块是否安装 
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

功能测试 
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都能正常工作,用户感觉不出来。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值