![如何通过备用网关将流量从私有 LAN 路由到特定的公共远程主机?](https://linux22.com/image/791105/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%A4%87%E7%94%A8%E7%BD%91%E5%85%B3%E5%B0%86%E6%B5%81%E9%87%8F%E4%BB%8E%E7%A7%81%E6%9C%89%20LAN%20%E8%B7%AF%E7%94%B1%E5%88%B0%E7%89%B9%E5%AE%9A%E7%9A%84%E5%85%AC%E5%85%B1%E8%BF%9C%E7%A8%8B%E4%B8%BB%E6%9C%BA%EF%BC%9F.png)
概述
我正在尝试处理以下情况:
+------+ (Internet) 50.a.b.c +---------+
| edge + eth0 <-----------------------------> + outpost |
+--+---+ 25.u.v.w (Secured by IPSec) +---------+
| enp ^
| 10.0.0.1 |
| |
| enp |
| 10.0.0.2 |
+--+---+ |
| node + eth0 <----- XXX (FORBIDDEN) XXX -----+
+------+ 160.r.s.t
接口上有一个edge
具有公网IP的主机,接口上有一个LAN内的私有IP 。25.u.v.w
eth0
10.0.0.1
10.0.0.0/24
enp
node
同样,在同一个 LAN 中,有一台主机在该 LAN上10.0.0.0/24
具有不同的公网 IP 。160.r.s.t
eth0
10.0.0.2
edge
edge
在和之间维护 IPSec 安全链接outpost
。
outpost
只能通过公共 IP 访问50.a.b.c
。outpost
绝不能通过互联网访问,仅确保来自 IPSec 连接edge
(iptables 开启outpost
约束)。
node
不是网络中的单个节点,网络中有多个节点。为了简单起见,我只描述了一个节点(应该对所有节点都一样)。
所有主机均运行 Ubuntu 22.04。
任务
我如何确保通过 通过然后通过路由其数据包来node
进行访问?outpost
edge
enp
outpost
eth0
关于edge
路由表edge
以下有评论
# ip r
default via 172.16.1.1 dev eth0 proto dhcp src 25.u.v.w metric 100
# Default route intended for unspecific internet access. 172.16.1.1 seems to be the VM bridge of the cloud service provider.
10.0.0.0/16 via 10.0.0.254 dev enp
# access to LAN via gateway
10.0.0.254 dev enp scope link
# no idea why this is needed
172.16.1.1 dev eth0 proto dhcp scope link src 25.u.v.w metric 100
# Seems to define the next hop to the VM bridge gateway
接口edge
仅显示相关条目:
# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 25.u.v.w/32 metric 100 scope global dynamic eth0
valid_lft 57218sec preferred_lft 57218sec
inet6 e:f:g:h::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::9400:2ff:fea1:8068/64 scope link
valid_lft forever preferred_lft forever
3: enp: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc fq_codel state UP group default qlen 1000
link/ether yy:yy:yy:yy:yy:yy brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/32 brd 10.0.0.1 scope global dynamic enp
valid_lft 86280sec preferred_lft 86280sec
inet6 fe80::8400:ff:fe61:cc98/64 scope link
valid_lft forever preferred_lft forever
关于node
原始路由表node
更改尝试前的路由表
# ip r
default via 172.16.1.1 dev eth0 proto dhcp src 160.r.s.t metric 100
# Default route intended for unspecific internet access. 172.16.1.1 seems to be the VM bridge of the cloud service provider.
10.0.0.0/16 via 10.0.0.254 dev enp
# access to LAN via gateway
10.0.0.254 dev enp scope link
# no idea why this is needed
172.16.1.1 dev eth0 proto dhcp scope link src 160.r.s.t metric 100
# Seems to define the next hop to the VM bridge gateway
如您所见,node
其配置相同,edge
因为它通过默认网关路由互联网流量(按预期)。
接口node
# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether mm:mm:mm:mm:mm:mm brd ff:ff:ff:ff:ff:ff
inet 160.r.s.t/32 metric 100 scope global dynamic eth0
valid_lft 55654sec preferred_lft 55654sec
inet6 i:j:k:l::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::9400:2ff:fea1:91a3/64 scope link
valid_lft forever preferred_lft forever
3: enp: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc fq_codel state UP group default qlen 1000
link/ether 86:00:00:61:d1:48 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/32 brd 10.0.0.2 scope global dynamic enp
valid_lft 52529sec preferred_lft 52529sec
inet6 fe80::8400:ff:fe61:d148/64 scope link
valid_lft forever preferred_lft forever
尝试将流量路由outpost
至node
edge
node
我在路由表中插入了一条看似无害的规则:
ip r a 50.a.b.c via 10.0.0.1 dev enp proto static onlink
对于任何发往前哨的流量,将其发送到edge
。 edge
的路由表将执行到 的实际路由outpost
。
然而,这条规则使得从及其公共 IPnode
完全无法访问。edge
160.r.s.t
我不明白为什么这条规则会影响传入流量。它应该会影响针对的传出流量outpost
。
我需要 SNAT 后路由吗?
edge
在做了更多的研究之后,似乎我可能需要一个规则
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to 25.u.v.w
我还没有应用这条规则,因为它不能解决node
上面提到的路由表更改导致无法访问的实际问题。
正确的路由表是什么样的node
?
参照上面描述的任务,恰当的路由表是node
什么样的?
限制:
- 访问
outpost
必须路由到edge
(通过 LAN 10.0.0.0/24),然后从那里使用公共源 IP 进行 NAT25.u.v.w
以outpost
- 访问任何其他互联网主机都必须通过默认网关并使用
node
公共 IP160.r.s.t
。 - 对 LAN 10.0.0.0/24 内的节点的访问必须在本地进行路由。
为了使路由正常outpost
工作,我是否必须考虑其他的事情?
有更多网络经验的人可以解释一下这个问题吗?
答案1
最后我找到了罪魁祸首。iptables
规则和路由表条目基本上是正确的。然而,云提供商10.0.0.254
在私有局域网中有一个不透明的网关。
我在云提供商的 Web 配置中缺少一个条目,该条目将所有流量从不透明网关重定向10.0.0.254
到。edge
10.0.0.1
一旦我这样做了,规则
ip r a 50.a.b.c via 10.0.0.1 dev enp proto static onlink
仍然node
立即无法联系。仍然必须将流量引导到不透明网关,然后以edge
某种方式将其重定向回去。
所以正确的路线是
ip r a 50.a.b.c via 10.0.0.254 dev enp proto static onlink
由于该解决方案是特定于云提供商的并且并未回答实际问题,因此我不会将自己的答案标记为解决方案。