运行的 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 映射。