Linux GRE 隧道有两个参数,本地地址和远程地址。假设我有两个路由器,左边的路由器在 NAT 之外,右边的路由器在 NAT 之内,那么我想在左右路由器之间创建一个 GRE 隧道。我很清楚右边的地址,其中本地地址应该是自己的地址,而远程地址应该是对等公共地址。但是左边的地址,我认为路由器在连接之前不会知道对等地址,那么我该如何为其设置“远程”地址呢?
提前致谢。-woody
答案1
您应该按照对其他协议的预期进行操作:仅为远程设备放置公共 IP。
例子:
left
:192.0.2.10
NAT 系统:198.51.100.20 / 192.168.0.1
right
(NAT 后面):192.168.0.30
left
(例如,您正在为10.10.10.1/24 和10.10.10.2/24设置隧道的 IP right
,这里这并不重要)
你需要告诉left
路由器的remote
是198.51.100.20,而对于right
路由器来说,的remote
是192.0.2.10。
现在需要注意的是:这实际上取决于 NAT 系统的设置如果它运行的是 Linux。
如果此 NAT 系统也是 Linux,
right
当然,如果没有通用规则,它至少必须对 gre 协议 (47) 执行 SNAT/MASQUERADE (但见下文)。- 虽然通常协议的 NAT 会自动拉取相关的 conntrack 模块,但 GRE 不会发生这种情况。你必须手动执行
modprobe nf_conntrack_proto_gre
,否则将不会发生 NAT,隧道将无法工作。奇怪的是,从测试来看,nf_nat_proto_gre
似乎不需要(单独使用也不够)。 - 如果没有
DNAT
与 等效的SNAT/MASQUERADE
,则只right
应发起到 的流量left
。如果在不活动后将left
流量发送到right
(实际上是发送到 NAT 系统),则此方法不起作用,并且 conntrack 条目可能会阻止最多 30 秒(在尝试结束后)right
建立到 的流量left
。一旦“建立”,“OK”计时器将上升到 180 秒。因此,您确实应该考虑添加从到 的DNAT
规则以完成相反的规则。left
right
SNAT/MASQUERADE
在这样的 Linux NAT 系统上,您可以使用来验证发生了什么conntrack -L -p gre
,它必须在 GRE 隧道活动后有一个条目,或者缺少正确的模块。