最近有个需求开发,需要在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 ( 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 这里面有针对这个宏的编译选项。
./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
功能测试
查看模块是否存在
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
标识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都能正常工作,用户感觉不出来。