求助:如何通过iptables配置让响应流量返回至对应的GRE原接口
求助:如何通过iptables配置让响应流量返回至对应的GRE原接口
嗨,我明白你的问题了——你现在需要让从两个GRE接口进来的流量转发到本地1111端口后,响应能精准回到对应的GRE隧道,而不是全都走同一个接口对吧?之前用单一标记的方案只能处理一个隧道,用CONNMARK没成功,那我给你一套完整的配置流程,应该能解决这个问题:
第一步:准备专属路由表
我们需要给每个GRE接口单独配置路由表,这样后续可以根据标记让流量走对应表的路由:
- 先编辑路由表配置文件(持久化配置,可选但推荐):
这里我们给gre1分配表号10(命名GRE1),gre2分配表号20(命名GRE2)。echo "10 GRE1" >> /etc/iproute2/rt_tables echo "20 GRE2" >> /etc/iproute2/rt_tables - 给每个路由表添加默认路由,指向对应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
相关产品推荐
相关产品推荐

