我有一台通过永久 GRE 隧道连接到另一台主机的机器。我已将机器放在 Linux 防火墙 (Smoothwall) 后面,并使用以下规则将所有 GRE 数据包通过 NAT 发送到机器:
/sbin/iptables -t nat -A PREROUTING -p 47 --src $tunnel_server_ip -j DNAT --to-destination $false_ip
/sbin/iptables -t nat -A POSTROUTING -p 47 --src $false_ip -j SNAT --to-source $real_ip
/sbin/iptables -t nat -A INPUT -p 47 -j ACCEPT
(看Linux 路由器上的 NAT GRE(IP 协议 47))
一切正常,但在隧道处于大约 15 分钟的不活动状态后,我无法通过隧道从互联网连接到机器。在我将任何数据包从机器发送到互联网、ping、在浏览器中打开网页后,隧道再次激活。作为一种解决方法,我现在使用一个 cron 脚本来启动 curl 到互联网上的页面。
请帮助我了解导致隧道停止运行的原因,并告诉我该怎么做才能取代 curl hack。
答案1
您可能遇到了 conntrack 超时问题。我不知道是否如此,似乎您的规则在不使用 conntrack 的情况下就足够了,但无论如何,您可能希望在隧道中保留一些流量以保持其打开状态。您不需要使用 curl 加载网页,简单的 ping 就足够了。
如果您想尝试更大的 conntrack 超时,请尝试以下操作:
sysctl net.netfilter.nf_conntrack_generic_timeout=7200
sysctl net.ipv4.netfilter.ip_conntrack_generic_timeout=7200
其他一般说明:
-i <eth>
通常,向 PREROUTING 规则添加一个参数,-o <eth>
向 POSTROUTING 规则添加一个参数是一种很好的做法。避免规则失败并减少防火墙的负载。- INPUT 链规则毫无用处。此外,在 nat 表中使用 ACCEPT 目标也毫无意义。也许您要找的是 filter(默认)表的 FORWARD 链中的类似规则。
答案2
也许您有一个动态或共享的 IP 或者它是由您的 ISP 重新分配的?
如果是这样的话,我担心你必须继续类似的黑客攻击