允许子网通过 Linux 路由器 NAT 进行 GRE(IP 协议 47)

允许子网通过 Linux 路由器 NAT 进行 GRE(IP 协议 47)

我的网络设置如下所示: 网络

运行的 VPN 服务器是 Windows 2012 服务器默认 VPN,它使用 GRE 协议。我只能从我的内部网单个 IP 建立到该远程 VPN 服务器的 VPN 连接。但我无法连接内部网 IP 范围 172.16.14.0/24。问题出在 Linux 路由器上,它正在执行 NAT。我的 iptable 的 nat 表如下所示,用于工作 VPN 连接(针对单个 IP),允许 gre 协议:

 iptables -I PREROUTING -t nat -p 47 --src 202.xx.yy.abc  -j DNAT --to-destination 172.16.14.15
 iptables -I POSTROUTING -p 47 -t nat --src 172.16.14.15  -j SNAT --to-source 202.xx.yy.zz
 iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE 
 iptables -A INPUT -p 47 -j ACCEPT

此规则适用于单个 IP 172.16.14.15。如何使其适用于整个 172.16.14.0/24 范围,以便我可以与远程 VPN 服务器建立 VPN 连接?

答案1

我找到了解决方案。

我这样做了:

 sysctl -w net.netfilter.nf_conntrack_helper=1

然后加

modprobe ip_nat_pptp

我使用的是 Ubuntu 18.04.2 LTS,内核版本为 4.15.0-45-generic。iptables PREROUTING、POSTROUTING 表中无需执行与 GRE 协议相关的任何操作。只需添加以上两行即可。

答案2

您是否加载了nf_nat_proto_gre内核模块?如果加载了,那么前两行可能就不再需要了。

答案3

GRE 不像 UDP 和 TCP 协议那样具有“端口”的概念。任何 NAT 设备可以利用的唯一映射信息是数据包的源和/或目标 IP 地址。

为了实现您想要做的事情,您要么需要在 WAN 链路上配置一个公共 /24 网络,然后在每个公共 IP 地址和每个内部 IP 地址之间创建单独的 GRE NAT 映射。或者,您可以在 WAN 接口上配置一个地址,但让 VPN 提供商为您提供多个公共 IPv4 地址以连接到他们的服务。在一种情况下,NAT 映射由 GRE 数据包的目标地址决定,在另一种情况下,NAT 映射由源地址决定。这两种方法都可以。

您很可能只有一个 WAN 地址,并且 VPN 提供商也只有一个地址,这意味着您只能为任何 GRE 流量创建到一个内部主机的单个 NAT 映射。

相关内容