免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5880 | 回复: 7
打印 上一主题 下一主题

[网络子系统] ftp ALG问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-11 16:01 |只看该作者 |倒序浏览
本帖最后由 peruke 于 2013-07-15 09:06 编辑

测试2.6.21内核(非标准)ftp 穿透防火墙,Windows自带的ftp client不能下载文件,抓包发现ftp PORT命令包含私有IP:
PORT 192,168,1,100,12,172
500 Illegal PORT range rejected.
被ftp server拒绝了。

检查了linux kernel 配置,NF_CONNTRACK_FTP 和NF_NAT_FTP 选项都是yes 的,按理ftp 载荷里私有IP应被修改为广域网IP地址,
不知道为什么ftp ALG 没有起作用。

跟标准2.6.21 kernel对比了一下,netfilter代码基本相同,相信是2.6.21 kernel 本身就存在的bug,求patch,谢谢!

论坛徽章:
0
2 [报告]
发表于 2013-07-12 10:19 |只看该作者
本帖最后由 peruke 于 2013-07-12 10:32 编辑

查看了内核nf_conntrack_ftp.c,有注册ftp helper的代码:
  1. static int __init nf_conntrack_ftp_init(void)
  2. {
  3.         int i, j = -1, ret = 0;
  4.         char *tmpname;

  5.         ftp_buffer = kmalloc(65536, GFP_KERNEL);
  6.         if (!ftp_buffer)
  7.                 return -ENOMEM;

  8.         if (ports_c == 0)
  9.                 ports[ports_c++] = FTP_PORT;

  10.         /* FIXME should be configurable whether IPv4 and IPv6 FTP connections
  11.                  are tracked or not - YK */
  12.         for (i = 0; i < ports_c; i++) {
  13.                 ftp[i][0].tuple.src.l3num = PF_INET;
  14.                 ftp[i][1].tuple.src.l3num = PF_INET6;
  15.                 for (j = 0; j < 2; j++) {
  16.                         ftp[i][j].tuple.src.u.tcp.port = htons(ports[i]);
  17.                         ftp[i][j].tuple.dst.protonum = IPPROTO_TCP;
  18.                         ftp[i][j].mask.src.l3num = 0xFFFF;
  19.                         ftp[i][j].mask.src.u.tcp.port = htons(0xFFFF);
  20.                         ftp[i][j].mask.dst.protonum = 0xFF;
  21.                         ftp[i][j].max_expected = 1;
  22.                         ftp[i][j].timeout = 5 * 60;        /* 5 Minutes */
  23.                         ftp[i][j].me = THIS_MODULE;
  24.                         ftp[i][j].help = help;
  25.                         tmpname = &ftp_names[i][j][0];
  26.                         if (ports[i] == FTP_PORT)
  27.                                 sprintf(tmpname, "ftp");
  28.                         else
  29.                                 sprintf(tmpname, "ftp-%d", ports[i]);
  30.                         ftp[i][j].name = tmpname;

  31.                         DEBUGP("nf_ct_ftp: registering helper for pf: %d "
  32.                                "port: %d\n",
  33.                                 ftp[i][j].tuple.src.l3num, ports[i]);
  34.                         ret = nf_conntrack_helper_register(&ftp[i][j]);
  35.                         if (ret) {
  36.                                 printk("nf_ct_ftp: failed to register helper "
  37.                                        " for pf: %d port: %d\n",
  38.                                         ftp[i][j].tuple.src.l3num, ports[i]);
  39.                                 nf_conntrack_ftp_fini();
  40.                                 return ret;
  41.                         }
  42.                 }
  43.         }

  44.         return 0;
  45. }
复制代码
并且在syslog中也有记录:
Netfilter messages via NETLINK v0.30.
nf_conntrack version 0.5.0 (256 buckets, 2048 max)
nf_ct_ftp: registering helper for pf: 2 port: 21
nf_ct_ftp: registering helper for pf: 10 port: 21
ip_tables: (C) 2000-2006 Netfilter Core Team, Type=Restricted Cone
ipt_time loading
说明ftp helper 确实被注册了,也没有出错。

但是,有LAN到WAN的ftp 连接时,且LAN端client 发出PORT命令,ftp help 函数竟没有输出任何东西,调试开关都已打开,奇怪。

请熟悉linux netfilter conntrack 的朋友帮忙释疑!!

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
3 [报告]
发表于 2013-07-12 14:25 |只看该作者
看看alg有没有支持port方法?
我有patch,不过不能给你。

论坛徽章:
0
4 [报告]
发表于 2013-07-12 14:43 |只看该作者
daniel_11:
你所说是否指nf_nat_ftp.c中的PORT方法?
  1. static int (*mangle[])(struct sk_buff **, __be32, u_int16_t,
  2.                        unsigned int, unsigned int, struct nf_conn *,
  3.                        enum ip_conntrack_info, u32 *seq)
  4. = {
  5.         [NF_CT_FTP_PORT] = mangle_rfc959_packet,
  6.         [NF_CT_FTP_PASV] = mangle_rfc959_packet,
  7.         [NF_CT_FTP_EPRT] = mangle_eprt_packet,
  8.         [NF_CT_FTP_EPSV] = mangle_epsv_packet
  9. };
复制代码
因为对netfilter conntrack整体框架不熟,所以里面的来龙去脉搞不清楚,以我的理解是:
nf_nat_ftp.c 中的函数 nf_nat_ftp 赋给指针nf_nat_ftp_hook,应该被nf_conntrack_ftp.c 中的help 函数在某个时间调用,如果是PORT命令,最终由 mangle_rfc959_packet 调用 nf_nat_mangle_tcp_packet来修改包。

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
5 [报告]
发表于 2013-07-12 14:48 |只看该作者
peruke 发表于 2013-07-12 14:43
daniel_11:
你所说是否指nf_nat_ftp.c中的PORT方法?因为对netfilter conntrack整体框架不熟,所以里面的来 ...

因为port方法需要nat开port,需要根据ftp port命令内容建立正确的exp。

论坛徽章:
0
6 [报告]
发表于 2013-07-12 14:54 |只看该作者
本帖最后由 peruke 于 2013-07-12 14:55 编辑
daniel_11 发表于 2013-07-12 14:48
因为port方法需要nat开port,需要根据ftp port命令内容建立正确的exp。

是的,nat所做的工作一个是开放port,另一个是修改私有IP为广域网IP.

如果help 函数中的调试消息可以出来,对调试是很大的帮助,再问一下,什么情况下help 函数中的调试消息出不来呢?
谢谢!

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
7 [报告]
发表于 2013-07-12 15:33 |只看该作者
本帖最后由 daniel_11 于 2013-07-12 15:36 编辑
peruke 发表于 2013-07-12 14:54
是的,nat所做的工作一个是开放port,另一个是修改私有IP为广域网IP.

如果help 函数中的调试消息可以出 ...

连调试信息都没有?你用pasv方法能出来不?用的什么方法看log?
有用conntrack tool来看看conntrack的信息么?
对于ftp alg流程,开个传送门,http://bbs.chinaunix.net/thread-1935787-1-1.html

论坛徽章:
0
8 [报告]
发表于 2013-07-12 16:15 |只看该作者
pasv模式也没有调试信息,我用dmesg看的,相关消息如下:
Netfilter messages via NETLINK v0.30.
nf_conntrack version 0.5.0 (256 buckets, 2048 max)
nf_ct_ftp: registering helper for pf: 2 port: 21
nf_ct_ftp: registering helper for pf: 10 port: 21
ip_tables: (C) 2000-2006 Netfilter Core Team, Type=Restricted Cone
ipt_time loading


我在/proc/net/nf_conntrack 看的连接信息:
ipv4     2 tcp      6 3597 ESTABLISHED src=192.168.1.10 dst=193.162.146.4 sport=8118 dport=21 packets=9 bytes=427 src=193.162.146.4 dst=183.37.243.99 sport=21 dport=8118 packets=9 bytes=730 [ASSURED] mark=0 use=1

谢谢你的门,进去看看!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP