You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何通过iptables配置让响应流量返回至对应的GRE原接口

求助:如何通过iptables配置让响应流量返回至对应的GRE原接口

嗨,我明白你的问题了——你现在需要让从两个GRE接口进来的流量转发到本地1111端口后,响应能精准回到对应的GRE隧道,而不是全都走同一个接口对吧?之前用单一标记的方案只能处理一个隧道,用CONNMARK没成功,那我给你一套完整的配置流程,应该能解决这个问题:

第一步:准备专属路由表

我们需要给每个GRE接口单独配置路由表,这样后续可以根据标记让流量走对应表的路由:

  1. 先编辑路由表配置文件(持久化配置,可选但推荐):
    echo "10     GRE1" >> /etc/iproute2/rt_tables
    echo "20     GRE2" >> /etc/iproute2/rt_tables
    
    这里我们给gre1分配表号10(命名GRE1),gre2分配表号20(命名GRE2)。
  2. 给每个路由表添加默认路由,指向对应GRE隧道的对端IP:
    # gre1的对端是10.0.0.1,对应你之前的配置
    ip route add default via 10.0.0.1 dev gre1 table GRE1
    # gre2的对端请根据实际GRE配置修改,这里假设是10.0.0.5
    ip route add default via 10.0.0.5 dev gre2 table GRE2
    

第二步:标记并保存连接标记(CONNMARK)

我们需要在流量进入时,给来自不同GRE接口的连接打上专属标记,并把标记保存到连接跟踪里,这样后续响应能识别这个连接的来源:

# 处理gre1的入站流量:打标记10,并存入CONNMARK
iptables -t mangle -A PREROUTING -i gre1 -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -i gre1 -p tcp --dport 80 -j CONNMARK --save-mark

# 处理gre2的入站流量:打标记20,并存入CONNMARK
iptables -t mangle -A PREROUTING -i gre2 -p tcp --dport 80 -j MARK --set-mark 20
iptables -t mangle -A PREROUTING -i gre2 -p tcp --dport 80 -j CONNMARK --save-mark

第三步:配置DNAT转发流量到本地端口

把来自两个GRE接口、目标端口80的流量转发到本地eno1的1111端口:

iptables -t nat -A PREROUTING -i gre1 -p tcp --dport 80 -j DNAT --to 192.168.0.100:1111
iptables -t nat -A PREROUTING -i gre2 -p tcp --dport 80 -j DNAT --to 192.168.0.100:1111

第四步:恢复连接标记用于路由决策

当本地daemon发送响应时,我们需要从连接跟踪里恢复之前保存的CONNMARK到MARK,这样路由规则能识别该走哪个路由表:

iptables -t mangle -A OUTPUT -p tcp --sport 1111 -j CONNMARK --restore-mark

第五步:配置IP规则绑定标记与路由表

让带有对应标记的流量走我们之前配置的专属路由表:

ip rule add fwmark 10 table GRE1
ip rule add fwmark 20 table GRE2

第六步:配置SNAT让响应源IP符合需求

根据你的描述,响应数据包的源IP需要是请求里的目标IP(X.X.X.X),所以我们需要在出站时做SNAT转换:

# 针对gre1的响应流量,把源IP改成X.X.X.X
iptables -t nat -A POSTROUTING -o gre1 -m state --state ESTABLISHED,RELATED -j SNAT --to-source X.X.X.X
# 针对gre2的响应流量,同样修改源IP
iptables -t nat -A POSTROUTING -o gre2 -m state --state ESTABLISHED,RELATED -j SNAT --to-source X.X.X.X

额外注意事项

  • 确保内核开启IP转发:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    # 持久化的话可以编辑/etc/sysctl.conf,添加net.ipv4.ip_forward=1,然后执行sysctl -p
    
  • 所有命令里的IP、端口、GRE对端地址都要根据你的实际环境修改,比如gre2的对端IP如果不是10.0.0.5,要换成你实际的配置。

这个方案的核心是用CONNMARK把每个连接的来源接口信息绑定到连接跟踪里,响应时再恢复标记,从而让路由系统能精准选择返回的GRE接口,解决你之前单一标记只能走一个隧道的问题。

备注:内容来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 11:59:51