通过 GRE 隧道将一台机器的流量路由到远程 NAT

通过 GRE 隧道将一台机器的流量路由到远程 NAT

我必须为朋友解决以下难题,并想在这里记录我们是如何做到的......

情况如下:

  • 他的家庭网络192.168.1.0/24位于执行 NAT 并具有公共 IP 地址的 Linux 路由器后面A.A.A.A。Linux 路由器运行 openSUSE 15.3。
  • 在家庭网络上,地址为 处有一个特别令人感兴趣的设备192.168.1.17
  • 他有一台远程 Linux 机器,它独立位于 Internet 上的地址B.B.B.B。这台机器是一台托管服务器,位于该国的另一个地方。这台机器还运行 openSUSE 15.3。

他想要的是让所有192.168.1.17流量都通过远程机器进行路由和 NAT B.B.B.B,但家庭网络上的所有其他机器不受影响(即,仍然A.A.A.A像往常一样通过家庭路由器进行路由)。

其效果是,对于外界来说,所有的192.168.1.17流量似乎都来自B.B.B.B而不是A.A.A.A

这是 NAT/网络等同于“发出你的声音“针对您网络上的某台特定机器。

答案1

以下是我们的操作方式。

A.A.A.A我们在和B.B.B.B(两台服务器的接口)之间设置了 GRE 隧道gre1,内部点对点隧道 IP 地址分别10.0.0.1为和10.0.0.2。请注意,无需加密,因为隧道中的数据包将被解包并通过 Internet 按原样发送。

接下来,我们必须配置以在其外部接口上B.B.B.B启用。这可以通过完成。然后我们必须添加自定义规则以不阻止传入的 GRE 数据包。我们将接口放入区域,以便允许所有到达隧道内的数据包,并将进行 NAT。NATeth0firewalldfirewalldgre1trusted

在家庭网络上,我们已经通过firewalldNAT 路由器进行了设置,因此剩下要做的只有 (a) 创建 GRE 隧道的另一端,以及 (b) 让 Linux 将192.168.1.17传出的流量转移到隧道中。最后一步是稍微棘手的部分。

详情如下...

设置B.B.B.B(远程服务器)

添加接口gre1

    # /etc/sysconfig/network/ifcfg-gre1
    STARTMODE='onboot'
    BOOTPROTO='static'
    TUNNEL='gre'
    TUNNEL_LOCAL_IPADDR='B.B.B.B'
    TUNNEL_REMOTE_IPADDR='A.A.A.A'
    IPADDR='10.0.0.2'
    REMOTE_IPADDR='10.0.0.1'
    TUNNEL_TTL='64'
    ZONE=trusted

通过以下方式添加家庭网络和 P2P 链接远程端的路由gre1

    # /etc/sysconfig/network/ifroute-gre1 
    # Destination   Gateway     Netmask     Interface   Options
    192.168.1.0/24  -           -           -
    10.0.0.1        -           -           -

firewalld通过配置yast2 firewall

  • 将接口eth0放入区域external
  • 将接口gre1放入区域trusted
  • 将自定义防火墙规则添加到external允许来自以下来源的传入 GRE 数据包的区域A.A.A.A
  • 添加自定义防火墙规则以将 TCP MSS 限制在externaltrusted区域(需要firewalld >= 1.0.0

区域文件位于/etc/firewalld/zones

    # /etc/firewalld/zones/external.xml    
    <zone>
        <short>External</short>
        <service name="ssh"/>
        ...
        <masquerade/>
        <rule family="ipv4">
          <source address="A.A.A.A"/>
          <accept/>
        </rule>
        <rule>
          <tcp-mss-clamp value="1420"/><!-- requires firewalld >= 1.0.0 -->
        </rule>
        <interface name="eth0"/>
    </zone>
    # /etc/firewalld/zones/trusted.xml    
    <zone target="ACCEPT">
      <short>Trusted</short>
      <description>All network connections are accepted.</description>
      <rule>
          <tcp-mss-clamp value="1420"/><!-- requires firewalld >= 1.0.0 -->
      </rule>
      <interface name="gre1"/>
    </zone>

设置A.A.A.A(家庭网络服务器)

这假定A.A.A.A已经设置了 NAT192.168.1.0/24网络等等。

添加接口gre1

    # /etc/sysconfig/network/ifcfg-gre1
    STARTMODE='onboot'
    BOOTPROTO='static'
    TUNNEL='gre'
    TUNNEL_LOCAL_IPADDR='A.A.A.A'
    TUNNEL_REMOTE_IPADDR='B.B.B.B'
    IPADDR='10.0.0.1'
    REMOTE_IPADDR='10.0.0.2'
    TUNNEL_TTL='64'
    ZONE='trusted'

通过以下方式添加至 P2P 链接远端的路由gre1

    # /etc/sysconfig/network/ifroute-gre1 
    # Destination   Gateway     Netmask     Interface   Options
    10.0.0.2        -           -           -

配置firewalld方式yast2 firewall

  • 将接口gre1放入区域trusted
  • 接口eth0应该已经在区域中external

激活重新路由

这是最后的“棘手部分”,它导致的192.168.1.17出站流量通过 GRE 隧道转移。

要打开重定向,请运行以下命令A.A.A.A

$ ip route flush table 10
$ ip route add table 10 to default via 10.0.0.2 dev gre1
$ ip rule add from 192.168.1.17 table 10 priority 10

要撤消上述命令:

$ ip rule del from 192.168.1.17 table 10 priority 10
$ ip route flush table 10

相关内容