TPROXY与ip_conntrack

本文探讨了如何通过TPROXY模块实现与IP_TRANSPARENT选项相似的功能,同时避免了使用ip_conntrack带来的开销。TPROXY提供了一种更轻量级的解决方案,通过为每个数据包的五元组进行查找来确定是否属于本地socket,从而在保持IP_TRANSPARENT优势的同时,减少资源消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

socket的IP_TRANSPARENT选项实现代理》中,介绍了IP_TRANSPARENT可以使得保留源IP地址的方法,但是使用了ip_conntrack,我们知道ip_conntrack是要么全部conntrack,要么一个不conntrack的,除非你使用了notrack target,但是判决到底使不使用notrack也需要一番功夫,有没有什么办法可以不使用ip_conntrack却又可以使用IP_TRANSPARENT的呢?因为写到了这里,答案显然是有的,那就是TPROXY,这个TPROXY其实也是一个Netfilter模块,它就是平添了一次查找,那就是一个流是不是本地socket相关的,和ip_conntrack没有关系,不过依然要针对每一个数据包的五元组来查找一下是否属于本地的一个socket,看起来显然这是一个轻量级的ip_conntrack(这只是第一印象,到底怎么回事,这里不说,测试了才知道ip_conntrack是多么的高效)。
root@ImmortalWrt:~# lsmod | grep ipv6 nf_defrag_ipv6 16384 3 nf_conntrack,xt_TPROXY,nft_tproxy nf_reject_ipv6 12288 2 nft_reject_ipv6,nft_reject_inet nf_tables 237568621 nft_redir,nft_nat,nft_masq,nft_fullcone,nft_flow_offload,nft_fib_inet,nft_ct,nft_chain_nat,nf_flow_table_inet,nft_tproxy,nft_reject_ipv6,nft_reject_ipv4,nft_reject_inet,nft_reject,nft_quota,nft_numgen,nft_log,nft_limit,nft_hash,nft_fib_ipv6,nft_fib_ipv4,nft_fib,nft_compat nf_tproxy_ipv6 12288 2 xt_TPROXY,nft_tproxy nft_fib 12288 3 nft_fib_inet,nft_fib_ipv6,nft_fib_ipv4 nft_fib_ipv6 12288 1 nft_fib_inet nft_reject 12288 3 nft_reject_ipv6,nft_reject_ipv4,nft_reject_inet nft_reject_ipv6 12288 0 root@ImmortalWrt:~# ip -6 addr show | grep -v "fe80" 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000 inet6 ::1/128 scope host proto kernel_lo valid_lft forever preferred_lft forever 5: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 state UNKNOWN qlen 500 inet6 fd7a:115c:a1e0::e01:7872/128 scope global valid_lft forever preferred_lft forever valid_lft forever preferred_lft forever 10: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000 inet6 fd22:2c09:bdd5:1::1/64 scope global noprefixroute valid_lft forever preferred_lft forever valid_lft forever preferred_lft forever root@ImmortalWrt:~# nft list ruleset | grep ip6 table ip6 filter { iifname "lo*" ip6 saddr fd7a:115c:a1e0::e01:7872 counter packets 0 bytes 0 accept table ip6 nat { ip6 saddr fe80::/10 icmpv6 type . icmpv6 code { mld-listener-query . 0, mld-listener-report . 0, mld-listener-done . 0, mld2-listener-report . 0 } counter packets 0 bytes 0 accept comment "!fw4: Allow-MLD"
最新发布
03-14
### 配置 `ip_conntrack` 参数 为了优化和调整 Linux 系统中的网络连接跟踪功能,可以修改内核参数来适应不同的需求。对于 `ip_conntrack_in` 相关的配置,主要涉及以下几个方面: #### 增大跟踪的最大条目数量 通过设置 `net.netfilter.nf_conntrack_max` 可以增加系统能够追踪的最大并发连接数。这有助于防止因连接表溢出而导致丢包或其他性能问题。 ```bash echo "3276800" > /proc/sys/net/netfilter/nf_conntrack_max ``` 或者永久化此更改到 `/etc/sysctl.conf` 文件中并应用: ```bash sysctl -w net.netfilter.nf_conntrack_max=3276800 ``` #### 调整协议超时时间 减少某些类型的连接在建立后的最大存活期限可以帮助释放不再活跃的会话记录,从而提高资源利用率。例如,TCP 已建立状态下的默认超时时长可以从常规值缩短至更短的时间间隔。 ```bash sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1200 ``` 同样适用于 UDP 和 ICMP 协议: ```bash sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=180 sysctl -w net.netfilter.nf_conntrack_icmp_timeout=30 ``` 这些操作可以通过编辑 `/etc/sysctl.conf` 来实现持久化的效果[^1]。 #### 故障排查技巧 当遇到 `ip_conntrack` 相关的问题时,可采取如下措施进行诊断: ##### 查看系统统计信息 利用 `netstat` 或者更为现代的替代品如 `ss` 命令来获取有关当前活动连接的信息,并过滤掉特定错误条件的数据。 ```bash netstat -s | grep "dropped because of missing route" ``` ##### 使用 dmesg 日志分析 结合管道命令 (`|`) 对 `dmesg` 输出的日志消息进行筛选,以便快速定位可能存在的警告或错误提示。 ```bash dmesg | less ``` 也可以直接使用 `grep` 结合关键词搜索具体的异常情况。 ##### 安装必要的工具集 如果发现缺少一些常用的网络调试工具,则可通过软件包管理器安装它们,比如 `traceroute`, `ifconfig`, `netstat` 等等。 ```bash yum -y install traceroute net-tools lrzsz ``` 以上步骤能帮助更好地理解和解决 `ip_conntrack` 机制相关的各种挑战[^3][^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值