qianguozheng 发表于 2017-11-04 22:30

nf_conntrack_expect 是否必须实现ftp期望模块,才可以传输ftp协议?

大家好, 最近看连接追踪遇到个问题, 就是看到nf_conntrack对于ftp协议处理的时候需要路由器上实现 nf_conntrack_ftp模块,服务器才可以发起到客户端的数据连接,
那么是不是我的路由器上没有nf_conntrack_ftp模块,就无法实现ftp 通信了? 如果可以是通过什么方式实现的呢? 既然可以不实现expect模块,那么为什么还需要expect模块呢?

网络拓扑是:

ftp client(192.168.5.10)--> Router(192.168.5.1) wan---> ftp server(112.113.2.4)


qianguozheng 发表于 2017-11-07 09:43

没有人清楚的嘛?

最近做了点深入研究,发现nf_conntrack_ftp.c是默认编译进入内核的;
那么问题就是, NAT和连接追踪有关系嘛?

nswcfd 发表于 2017-11-07 11:22

本帖最后由 nswcfd 于 2017-11-07 11:23 编辑

1. 看防火墙的规则怎么写,如果使用了类似-m state related相关的功能,就需要expect子系统,它实现了多条连接之间的关联。
如果iptables规则不包含related相关的逻辑,则可以忽略expect子系统。
不过这可能不是楼主想要的,因为引入expect的根本原因在于,ftp等应用协商出来的端口是不能提前得知的,没法固化在规则里。

2. 如果没有开启NAT,也就是说不做地址转换,不需要helper子系统完成ALG(应用层网关,这里指七层nat)的功能。
如果开启了NAT,仅仅依靠conntrack完成ip/port的转换(layer3/4)是不够的,像ftp/sip等应用,在layer7的内容里也包含了ip/port的信息,同样需要做“七层nat”,换成网关的ip。

简单的说,如果只有普通的iptables规则,在非nat的场景下,不加载ftp模块不影响ftp的使用。在nat的场景下,必须加载ftp模块完成额外的七层nat功能。

或者这么总结:
a. 不加载conntrack,ftp正常
b. 加载conntrack,无iptables规则,不加载ftp模块,ftp正常
c. 加载conntrack,仅允许new或related的连接,不加载ftp模块,ftp不正常
d. 加载conntrack,开启nat,不加载ftp模块,ftp不正常
|#|CONNTRACKT|NAT|FTP_HELPER|RELATED_ONLY|FTP_OK|
|a|      NO| NO|      NO|          NO|   YES|
|b|       YES| NO|      NO|          NO|   YES|
|c|       YES| NO|      NO|         YES|    NO|
|d|       YES|YES|      NO|          NO|    NO|

PS,有些协议,普通helper(expect only)和nat_helper(七层nat)是分成两个模块的。

qianguozheng 发表于 2017-11-07 16:52

回复 3# nswcfd

多谢回复{:qq11:}
a. 不加载conntrack,ftp正常
b. 加载conntrack,无iptables规则,不加载ftp模块,ftp正常
c. 加载conntrack,仅允许new或related的连接,不加载ftp模块,ftp不正常
d. 加载conntrack,开启nat,不加载ftp模块,ftp不正常


关于b的结论我有疑问,为什么加载conntrack 没有iptables规则 无ftp helper模块,ftp可以正常工作呢?
有NAT的情况下,ftp怎么找到源主机的ip:port呢?

另外,我有点模糊的是,conntrack是实现NAT的基础吧, 那么是不是说,有NAT就必须得有conntrack ?
conntrack可以单独存在吗? 单独存在的意义是什么,除了netfilter中的 state模块, SNAT, DNAT, 还可以作什么?

qianguozheng 发表于 2017-11-08 09:48

最近的学习总结:

conntrack是 netfilter架构下的连接跟踪模块,是实现NAT的基础, 也是实现iptables 相关模块的基础,如state模块, SNAT, DNAT, CONNMARK等。
最近思考了很久,不知道是不是正确的,但是我认为应该是正确的:
路由器的作用就是实现的NAT的转换,目的就在于解决现网的IPv4地址不足的情况, 基于这种情况 NAT就是路由器的标志,而 conntrack又是NAT实现的基础,因此conntrack模块是比不可少的, 当然还有别的方式实现的conntrack,比如有的大牛提到的ALG 应用层网关实现(在应用层处理连接追踪), 换句话说, 其实是连接追踪是路由器实现NAT的基础。

这样说对吗?

nswcfd 发表于 2017-11-15 17:18

是的,对于linux而言,conntrack是NAT的基础。

不过,不是所有的路由器都需要做NAT,比如一个公司内部两个部门之间的路由器,没有必要伪装地址。
NAT一般部署在公司出口面向Internet的网关上。

nswcfd 发表于 2017-11-15 17:21

对于b,不加载ftp的结果就是conntrack识别不出数据连接和控制连接之间的关联性(无法related),但没有理由影响连通性(非NAT情况下)。

帅绝人寰 发表于 2017-11-15 19:59

ftp协议比较特殊, 必须用expect来 识别connection,才能正确conntrack —— 才能nat。

suiming2005 发表于 2017-12-13 14:30

必须明白,FTP有主动模式是被动模式,主动模式需要server连接到client,此时如果路由做了NAT就需要期望连接来放通这个wan端主动发起的连接,路由一般对wan端主动发起的连接是拒绝的,所以需要期待连接来放通。反之,如果用被动模式,数据和控制请求都由client端发起,那么期待模块就没什么用了。
页: [1]
查看完整版本: nf_conntrack_expect 是否必须实现ftp期望模块,才可以传输ftp协议?