You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

特定端口透明代理模式下无法捕获流量的技术咨询

让我来帮你解决这个透明代理的问题吧!针对你只需要拦截HostA上发往HostB的10001端口HTTP流量、且不影响其他服务的需求,我整理了两个可行的方案,分别解决你之前遇到的超时和无响应问题:

方案一:HostA本地部署mitmproxy(推荐,更简单易维护)

你之前遇到「能捕获请求但无法获取响应」的问题,大概率是iptables规则不完整或者mitmproxy的启动参数不对。按照以下步骤配置:

  1. 开启IP转发
    透明代理需要系统支持IP转发,临时生效可以执行:

    echo 1 > /proc/sys/net/ipv4/ip_forward
    

    要永久生效的话,编辑/etc/sysctl.conf,设置net.ipv4.ip_forward=1,然后执行sysctl -p加载配置。

  2. 配置iptables NAT规则
    只针对目标端口10001的出站流量做重定向,确保只有这部分流量经过mitmproxy:

    # 重定向所有发往10001端口的流量到mitmproxy监听的8080端口
    iptables -t nat -A OUTPUT -p tcp --dport 10001 -j REDIRECT --to-port 8080
    # (可选)如果只想拦截发往HostB的10001端口流量,加一条IP限定规则
    # iptables -t nat -A OUTPUT -p tcp -d <HostB的IP> --dport 10001 -j REDIRECT --to-port 8080
    
  3. 启动mitmproxy透明模式
    必须加上--mode transparent参数,否则mitmproxy无法正确处理透明代理的流量转换:

    mitmproxy --mode transparent --listen-port 8080
    

    补充:如果需要捕获HTTPS流量
    在HostA上安装mitmproxy的CA证书:

    • 确保mitmproxy运行时,在HostA的浏览器访问http://mitm.it,下载对应Linux的证书文件
    • 将证书复制到/usr/local/share/ca-certificates/目录,执行update-ca-certificates更新系统信任列表

    这样配置后,mitmproxy就能正确处理请求和响应的转发,不会出现无响应的情况。

方案二:跨主机HostC部署mitmproxy(适合需要隔离代理环境的场景)

你之前的跨主机方案出现「客户端连接超时、TCP traceroute不可达」,问题出在路由规则和iptables的组合配置上,以下是正确的步骤:

HostC上的配置

  1. 开启IP转发
    echo 1 > /proc/sys/net/ipv4/ip_forward
    sysctl -p
    
  2. 配置iptables规则
    重定向来自HostA的10001端口流量到mitmproxy的8080端口,并允许流量转发:
    # 重定向HostA发往10001端口的流量到8080
    iptables -t nat -A PREROUTING -p tcp -s <HostA的IP> --dport 10001 -j REDIRECT --to-port 8080
    # 允许流量在HostC上转发
    iptables -A FORWARD -p tcp -d <HostA的IP> --sport 10001 -j ACCEPT
    iptables -A FORWARD -p tcp -s <HostA的IP> --dport 8080 -j ACCEPT
    
  3. 启动mitmproxy透明模式
    mitmproxy --mode transparent --listen-port 8080
    

HostA上的配置

  1. 添加定向路由规则
    只让发往10001端口的流量路由到HostC,不影响其他服务的正常路由:
    # 创建自定义路由表100,指定默认网关为HostC
    ip route add default via <HostC的IP> dev <HostA的网卡名> table 100
    # 添加规则:带有0x1标记的流量使用路由表100
    ip rule add fwmark 0x1 lookup 100
    # 给发往10001端口的流量打标记
    iptables -t mangle -A OUTPUT -p tcp --dport 10001 -j MARK --set-mark 0x1
    
  2. 开放防火墙端口
    确保HostA允许到HostC的相关流量:
    iptables -A OUTPUT -p tcp -d <HostC的IP> --dport 8080 -j ACCEPT
    iptables -A OUTPUT -p tcp -d <HostC的IP> --dport 10001 -j ACCEPT
    

常见排查技巧

如果还是遇到问题,可以用以下方法定位:

  • tcpdump在对应的主机上抓包,比如本地方案在HostA抓8080端口的流量,看mitmproxy是否收到响应;跨主机方案在HostC抓PREROUTING的流量,确认是否收到HostA的数据包
  • 查看mitmproxy的控制台日志,是否有错误提示(比如证书问题、连接失败)
  • 检查路由表和iptables规则是否生效:执行ip route show table 100iptables -t nat -L -n查看规则

内容的提问来源于stack exchange,提问作者shikn

火山引擎 最新活动