我必须为朋友解决以下难题,并想在这里记录我们是如何做到的......
情况如下:
- 他的家庭网络
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。NAT
eth0
firewalld
firewalld
gre1
trusted
在家庭网络上,我们已经通过firewalld
NAT 路由器进行了设置,因此剩下要做的只有 (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 限制在
external
和trusted
区域(需要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