`
javafan_303
  • 浏览: 950024 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ip_conntrack的作用

 
阅读更多

修改应用层协议控制包使用了ip_conntrack,iptables的REDIRECT target也使用了ip_conntrack,另外包括iptables的state模块也是如此,使用ip_conntrack,可见ip_conntrack的重要性,ip_conntrack的一个无比重要的作用是实现nat,可以说REDIRECT target和对诸如ftp的修改以实现server回连client最终都落实到了nat上,比如,所谓的REDIRECT就是内置一个nat规则,将符合matchs的包nat到本机的特定端口,这个和iptables的nat表原理是一样的,不同的是,nat表的配置是显式的nat,而REDIRECT和ip_nat_ftp是隐式的nat而已。它们都是nat,都依赖于原始的ip_conntrack,因此原始的链接流信息并没有丢失,还是可以得到的,事实上,内核就是通过原始的链接流来匹配nat规则的,如果丢弃了原始链接流信息,何谈匹配!如果一个原始链接是a->b,而后不管是显式的nat还是隐式的REDIRECT以及nat_ftp,将a->b改为了a->c,a->b还是可以得到的,内核正是从a->b的流信息中取得了“要转换为a->c”这个信息的。
在init_conntrack中有以下逻辑:
conntrack = kmem_cache_alloc(ip_conntrack_cachep, GFP_ATOMIC);
conntrack->ct_general.destroy = destroy_conntrack;
conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *tuple; //初始化tuple,记录连接地址端口信息,该tuple在nat后不会被改掉,此谓原始流
conntrack->tuplehash[IP_CT_DIR_ORIGINAL].ctrack = conntrack;
conntrack->tuplehash[IP_CT_DIR_REPLY].tuple = repl_tuple; //repl_tuple初始化成和tuple一样的,在nat之后就会被改成nat后的地址,端口信息,此谓修改后的流,repl是replace的意思.
conntrack->tuplehash[IP_CT_DIR_REPLY].ctrack = conntrack;
tuple中就包含了原始流的信息,在随后的nat表的查找后,在alloc_null_binding中初始化conntrack的nat信息,由此就将nat信息和原始流信息统一到了conntrack中了。resolve_normal_ct是ip_conntrack模块使用的,其最后一句:
skb->nfct = &h->ctrack->infos[*ctinfo];
会将连接信息设置到skb中,以备后面的nat或者REDIRECT使用,在nat中,调用ip_conntrack_get取得这个conntrack。在ip_nat_setup_info中会调用ip_conntrack_alter_reply,后者会改变conntrack->tuplehash[IP_CT_DIR_REPLY].tuple的值为一个新的nat后的值。对于REDIRECT target,netfilter提供了一个getsockopt接口可以取得原始流的信息,该接口就是SO_ORIGINAL_DST,最终调用getorigdst,在getorigdst中有以下逻辑:
struct inet_opt *inet = inet_sk(sk);
struct ip_conntrack_tuple_hash *h;
struct ip_conntrack_tuple tuple;
IP_CT_TUPLE_U_BLANK(&tuple);
tuple.src.ip = inet->rcv_saddr; //原始流的源ip
tuple.src.u.tcp.port = inet->sport; //原始流的源端口
tuple.dst.ip = inet->daddr; //本机重定向后的ip
tuple.dst.u.tcp.port = inet->dport; //本机重定向后的端口
...
h = ip_conntrack_find_get(&tuple, NULL); //在既有链接中寻找一个ip_conntrack_tuple_hash的tuple字段和参数tuple一样的,返回ip_conntrack_tuple_hash结构体
...
ip_conntrack_tuple_hash的定义如下:
struct ip_conntrack_tuple_hash
{
struct list_head list;
struct ip_conntrack_tuple tuple;
struct ip_conntrack *ctrack;
};
现在看一下ip_conntrack_find_get如何找到h,在REDIRECT target中,数据肯定要进入本机,而进入本机就要进入NF_IP_LOCAL_IN链,在NF_IP_LOCAL_IN链上注册有一个ip_conntrack_local_in_ops,其HOOK函数为ip_confirm,最终要调用到__ip_conntrack_confirm,__ip_conntrack_confirm有以下逻辑:
unsigned int hash, repl_hash;
...
hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
repl_hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
...
list_prepend(&ip_conntrack_hash[hash], &ct->tuplehash[IP_CT_DIR_ORIGINAL]);
list_prepend(&ip_conntrack_hash[repl_hash], &ct->tuplehash[IP_CT_DIR_REPLY]);
最后的两行将修改后的contrack信息的hash加入了ip_conntrack_hash表,在getorigdst调用ip_conntrack_find_get的时候,所使用的信息就是修改后的contrack信息,因此最终肯定能找到&ct->tuplehash[IP_CT_DIR_REPLY],而tuplehash[IP_CT_DIR_REPLY]和tuplehash[IP_CT_DIR_ORIGINAL]二者统一到了conntrack中,因此getorigdst的后半段:
sin.sin_port = h->ctrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u.tcp.port;
sin.sin_addr.s_addr = h->ctrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip;
将可以得到原始流的信息。
最后看看redirect的HOOK函数:
static unsigned int redirect_target(...)
{
...
ct = ip_conntrack_get(*pskb, &ctinfo);
...
indev = (struct in_device *)(*pskb)->dev->ip_ptr;
newdst = indev->ifa_list->ifa_local;
newrange = ((struct ip_nat_multi_range)
{ 1, { { mr->range[0].flags | IP_NAT_RANGE_MAP_IPS,
newdst, newdst,
mr->range[0].min, mr->range[0].max } } });
return ip_nat_setup_info(ct, &newrange, hooknum); //重定向到本机的地址转换
}
__ip_conntrack_confirm函数不仅仅由NF_IP_LOCAL_IN链上的operations调用,在POSTROUTING链上也有调用,这就是ip_conntrack_out_ops中的HOOK函数ip_refrag,因此不管怎样,只要发生了地址转换,总逃不过将新的转换后的流信息加入到conntrack中。
作罢!

<!-- Baidu Button BEGIN -->
分享到:
评论

相关推荐

    libnetfilter_conntrack-1.0.7.tar.bz2

    conntrack将信息存在内存结构中,包括IP,端口,协议类型,状态以及超时时间。 而且conntrack不仅可以对TCP这种有状态的会话进行状态跟踪,还可以对UDP进行状态跟踪。 conntrack本身并不会对包进行过滤,而是...

    iptables不错脚本

    # 载入相关模块 PATH=/sbin:/bin:/usr/sbin:/usr/bin ...modprobe ip_conntrack_ftp &gt; /dev/null 2&gt;&1 modprobe ip_conntrack_irc &gt; /dev/null 2&gt;&1 modprobe ipt_MASQUERADE &gt; /dev/null 2&gt;&1

    connview.php - [ip_conntrack frontend]-开源

    ConnView是conntrack表查看器。 这是php脚本-ip_conntrack表的前端。 您可以选择过滤,连接排序。 脚本可识别conntrack表中的常见服务。您可以查看连接列表或每个IP的详细信息列表等。

    linux系统报xfs_vm_releasepage警告问题的处理方法

    问题说明 最近的几台机器在同一天的...Mar 26 20:55:03 host1 kernel: Modules linked in: nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack iptable_filter ip_tables ebtable_filter ebtables ip6tab

    CentOS 配置防火墙详解及实例

    CentOS配置防火墙 昨天帮朋友配置CentOS服务器,一开始为了方便测试直接把防火墙关...把文件最后一行IPTABLES_MODULES=”ip_conntrack_ftp” 改为#IPTABLES_MODULES=”ip_conntrack_ftp” ,即注释掉那一行配置项 添加

    Python网络服务框架greenev.zip

    greenev是一个基于greenlet协程,事件驱动,非阻塞socket模型的Python网络服务框架,它使得可以编写同步的代码,却得到异步执行...net.netfilter.nf_conntrack_tcp_timeout_established = 1200 标签:greenev

    连接跟踪conntrack详解

    非常详细的连接跟踪过程讲解 非常详细的连接跟踪过程讲解

    NetfilterConnectionELK:快速的bash脚本记录iptables的netfilter跟踪日志,并将日志发送到ELK堆栈进行图形化和警报

    /bin/bashconns= $( cat /proc/sys/net/netfilter/nf_conntrack_count )echo " $( date ) $( hostname ) $( hostname -i ) nf_conntrack $conns " &gt;&gt; /var/log/conntrack #####在CentOS 7中,脚本略有不同#!...

    分享一个实用的iptables脚本(各种过滤写法参考)

    /bin/sh#modprobe ipt_MASQUERADEmodprobe ip_conntrack_ftpmodprobe ip_nat_ftpiptables -Fiptables -t nat -Fiptables -Xiptables -t nat -X###########################INPUT键#################################...

    commonsec:在默认的 Ubuntu SSH 和防火墙配置上降低舱口

    常识安全 ... 使用 ip_conntrack 限制 SSH 登录尝试 禁用 SSH 密码登录 禁用 root 登录 将用户添加到 sudoers 警告,这将覆盖: /etc/ssh/sshd_config 你的 iptables 设置 在 /etc/sudoers.d 中进行修改

    netlink-notify:通知有关网络链接的更改

    设备收到 IP 地址: 设备收到 IPv6 地址: 一个设备消失了: 要求 要编译和运行netlink-notify您需要: (HTML 文档) (将图标从 SVG 转换为 PNG) 某些系统可能需要额外的库开发包。 寻找libnotify-devel或...

    2、kubernetes的Kubeadm 部署安装

    kube-proxy开启ipvs的前置条件 modprobe br_netfilter cat &gt; /etc/sysconfig/modules/ipvs....modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/module

    nlbwmon:基于简单conntrack的流量统计

    nlbwmon-基于简单conntrack netlink的流量统计 描述 可以在Linux路由器上使用nlbwmon监视网络主机使用的带宽。 收集网络统计信息并将其存储在数据库中。 客户端实用程序(nlbw)可以查询守护程序以获取当前统计信息...

    softap_ap6212a0_tinav2.1_验证通过_旧版本的系统_20170915_1223没有外层目录.7z

    &lt;*&gt; "conntrack" connection tracking match support &lt;*&gt; "state" match support &lt; &gt; IP virtual server support ---&gt; 修改为: &lt;*&gt; IP virtual server support ---&gt; [ ] Netfilter connection tracking (NEW) ...

    linux离线安装包.rar

    包含linux在centos6.5\centos6.6\centos7.3下的snmp离线安装包以及conntrack模块的离线安装包(conntrack模块的相关命令conntrack -L | grep ip,删除conntrack -D –s ip)

    k8s离线安装需要的centos工具rpm离线安装包

    k8s离线安装需要的centos工具rpm离线安装包 :chrony,wget,ipvsadm,net-tools,conntrack-tools,socat,nfs-utils,ipset,tar等

    hanlon-dhcproxy:侦听 DHCP 广播并使用 hanlon 选项对其进行扩充

    简单的第一次尝试将 hanlon 连接到零配置的现有网络。 这个例子是使用现有的、不受我控制的 dhcp 服务器连接到家庭 wifi ...dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n DHCP TFTP conntrack IDN dn

    构筑Linux防火墙之IPtables的概念与用法

    因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。 ...

    glidden:领事 IPTables 接口

    我们动态更新 consul 密钥并启用和禁用 ip 地址 - 然而,我们只检查连接中的第一个数据包,以降低性能要求 - 如果第一个数据包被允许,则后面的所有数据包都将被允许通过(使用IPTables conntrack 功能) ...

    状态检测包过滤技术在Linux下的实现 (2005年)

    系统地介绍了Linux2 4内核对状态检测包过滤技术的支持机制,并且给出了2.4内核中的一种实现方法,即Netfilter+IPconntrack+ IPtables体系。同时,就Linux2. 4环境中的状态检测包过滤技术无法对某些多连接服务进行...

Global site tag (gtag.js) - Google Analytics