我有两个克隆网络(局域网1和局域网2) 用于测试目的,每个具有相同的地址空间10.20.80.0/22
:
# 10.20.80.0/22
10.20.80.0 # first address
...
10.20.83.254 # last address
它们没有连接,也不打算以开关的方式连接。
但我希望有办法通过 SSH 在 lan1 和 lan2 之间移动。(从主机 alpha 上的 lan1 执行 ,ssh mars
然后从那里执行ssh alpha.lan2
。)因此,我使用一个名为 (CentOS 7) 的 Linux 主机mars
作为 SSH 跳转:
mars
连接到两个局域网lan1
,lan2
并在两个局域网中列出,/etc/hosts
地址为10.20.80.55 mars
- 拥有两个网卡
em1
且em2
.
em1
属于 lan1。
em2
属于 lan2。
/etc/hosts
所有计算机的开启lan1
情况lan2
:
10.20.80.1 alpha
10.20.80.2 beta
...
10.20.80.55 mars # ssh gateway connected to lan1 and lan2
方法 1:ip netns(有效)
(快速阅读者跳至方法 3)
我使用 ip 网络命名空间来分离网络接口
它看起来像这样:
Host 'mars' with 3 network namespaces
|------------------------------------------------------------------------|
|[default/root netns] |
| |
| lo |
| 127.0.0.1|
|------------------------------------------------------------------------|
|---------------------------------| |---------------------------------|
|[netns lan1] | |[netns lan2] |
| lo | | lo |
| 127.0.0.1| | 127.0.0.1|
| sshd1 | | sshd2 |
| | | |
|10.20.80.55/22 em1 (physical) | |10.20.80.55/22 em2 (physical) |
|----------|----------------------|----|----------|----------------------|
| |
Network 10.20.80.0/22 (lan1) Network 10.20.80.0/22 (lan2)
这基本上是可行的,现在我可以从 lan1 中的主机 alpha 执行以下操作:
ssh mars
ip netns exec lan2 bash # Opens a bash in the network namespace 'lan2'
ssh alpha
瞧!我到达了 lan2 的主机 alpha!
缺点:
- 主机 mars 上的服务(例如 ntpd)在默认网络命名空间中运行,该命名空间仅具有环回接口
lo
,因此无法联系任何其他 ntp 对等体。 - 必须为每个命名空间启动 sshd
- 使用 ssh 从 lan1 到 lan2 无需代理跳转
代码:
删除所有 netns(重复尝试):
#!/bin/bash
for netns in $(ip netns | awk '{print $1}'); do
for pid in $(ip netns pids $netns); do
kill $pid
done
ip netns del $netns
done
设置netns lan1
:
ip netns add lan1
ip link set em1 netns lan1
ip netns exec lan1 ip addr add 10.20.80.55/22 dev em1
ip netns exec lan1 ip link set em1 up
ip netns exec lan1 link set lo up
ip netns exec lan1 /usr/sbin/sshd -o PidFile=/var/run/sshd.lan1.pid
设置netns lan2
:
ip netns add lan2
ip link set em1 netns lan2
ip netns exec lan2 ip addr add 10.20.80.55/22 dev em1
ip netns exec lan2 ip link set em1 up
ip netns exec lan2 link set lo up
ip netns exec lan2 /usr/sbin/sshd -o PidFile=/var/run/sshd.lan2.pid
这创建了两个网络命名空间(netns lan1 和 netns lan2),为每个 netns 添加了一个环回接口,并将硬件接口 em1 和 em2 移动到各自的 netns(网络命名空间)。此外,它还启动了一个 SSH 守护进程,以便每个 NIC 都可以访问。
方法 2:在中间主机上使用 NAT
我不想使用网络命名空间,而是想ssh mars
从 lan1 和 mars 继续从另一个ssh alpha.lan2
进入 lan2(反之亦然)。因此,我可以使用主机“mars”作为 ssh 的代理,并使用 进行 ssh 跳转ssh -J mars alpha.lan2
,也可以进行 scp 或 X-forwarding。
Host 'mars'
|------------------------------------------------------------------------|
|[default/root netns] |
| lo |
| 127.0.0.1|
| |
|192.168.4.55 em1 (physical) 192.168.8.55 em2 |
|iptables NAT to 10.20.80.55/22? iptables NAT to 10.20.80.55/22? |
|----------|--------------------------------------|----------------------|
| |
Network 10.20.80.0/22 (lan1) Network 10.20.80.0/22 (lan2)
我想在火星上使用 NAT 来实现这一点。
/etc/hosts
在火星上(而不是在 lan1 和 lan2 上的主机上):
192.168.4.1 alpha.lan1
192.168.4.2 beta.lan1
192.168.4.55 mars.lan1 # ssh gateway connected to lan1 and lan2
192.168.8.1 alpha.lan2
192.168.8.2 beta.lan2
192.168.8.55 mars.lan2 # ssh gateway connected to lan1 and lan2
我的想法是将 lan1 和 lan2 映射到两个不同的网络:
# 10.20.80.0/22 (lan1) -> 192.168.4.0/22 via NIC em1
# 10.20.80.0/22 (lan2) -> 192.168.8.0/22 via NIC em2
iptables -A PREROUTING -i em1 -j NETMAP --to 192.168.4.0/24
iptables -A POSTROUTING -o em1 -j NETMAP --to 10.20.80.0/24
这失败了。问题:
- 可以这样吗?我应该为 em1 和 em2 分配哪些 IP 地址?我认为我不能
10.20.80.55
同时为em1 和 em2 分配实际 IP 地址和em2 不使用网络命名空间,因此我尝试分配“映射”地址 192.168.4.55(给 em1)和 192.168.8.55(给 em2)。但这意味着 NIC 无法从 lan1 和 lan2(10.20.80.0/22)访问。
或者执行以下操作是否有意义?
ip address add 192.168.4.55/22 dev em1
ip address add 192.168.8.55/22 dev em2
ip address add 10.20.80.55/22 dev em1
ip address add 10.20.80.55/22 dev em2
- 我需要哪些 iptables 规则?
- 我最终要设置哪些路线?
- 或者我应该遵循方法 3 (如下)?
方法 3:使用带有网络命名空间的 NAT
我想我可能需要以下方法:我需要 3 个网络命名空间(两个局域网各一个,还有一个根命名空间),方式如下:
3 network namespaces on host 'mars':
|------------------------------------------------------------------------------------------------------|
|127.0.0.1 lo [default/root netns]|
| |
|192.168.4.0/22 192.168.8.0/22 |
| ↓↑ (NAT with iptables NETMAP) ↓↑ (NAT with iptables NETMAP) |
|10.20.80.0/22 10.20.80.0/22 |
| |
|192.168.0.1/24 v-root-em1 (virtual) 192.168.0.2/24 v-root-em2 (virtual) |
|-------|----------------------------------------------------|-----------------------------------------|
| |
|-------|-----------------------------------------| |-------|-----------------------------------------|
|192.168.1.1/24 v-peer-em1 (virtual) [netns lan1]| |192.168.1.1/24 v-peer-em2 (virtual) [netns lan2]|
| | | |
| 127.0.0.1 lo| | 127.0.0.1 lo|
| | | |
|192.168.1.2/24 | |192.168.1.2/24 |
| ↓↑ (NAT) | | ↓↑ (NAT) |
|10.20.80.55/22 em1 (physical) | |10.20.80.55/22 em2 (physical) |
|----------|--------------------------------------| |----------|--------------------------------------|
| |
Network 10.20.80.0/22 (lan1) Network 10.20.80.0/22 (lan2)
使用代码来设置此方法:
# Setup netns lan1:
ip netns add lan1
ip link set em1 netns lan1
ip netns exec lan1 ip addr add 10.20.80.55/22 dev em1
ip netns exec lan1 ip link set em1 up
ip netns exec lan1 link set lo up
# Create virtual interfaces and bridges to connect the namespace lan2 to the default (root) namespace:
ip link add v-root-em1 type veth peer name v-peer-em1
ip link set v-peer-em1 netns lan1
ip addr add 192.168.0.1/24 dev v-root-em1
ip netns exec lan1 addr add 192.168.1.1/24 dev v-peer-em1
ip link set v-root-em1 up
ip netns exec lan1 link set v-peer-em1 up
# Setup netns lan2:
ip netns add lan2
ip link set em2 netns lan2
ip netns exec lan2 ip addr add 10.20.80.55/22 dev em2
ip netns exec lan2 ip link set em2 up
ip netns exec lan2 link set lo up
# Create virtual interfaces and bridges to connect the namespace lan2 to the default (root) namespace:
ip link add v-root-em2 type veth peer name v-peer-em2
ip link set v-peer-em2 netns lan2
ip addr add 192.168.0.2/24 dev v-root-em2
ip netns exec lan2 addr add 192.168.1.1/24 dev v-peer-em2
ip link set v-root-em2 up
ip netns exec lan2 link set v-peer-em2 up
# Configure lan1:
ip route add 192.168.4.0/22 via 192.168.0.1 dev v-root-em1
ip netns exec lan1 ip route add 192.168.4.0/22 dev em1 # Outgoing to lan1 (10.20.80.0/22)
ip netns exec lan1 ip route add 192.168.0.0/24 via 192.168.1.1 dev v-peer-em1 # Route into default/root namespace
# Configure lan2:
ip route add 192.168.8.0/22 via 192.168.0.2 dev v-root-em2
ip netns exec lan2 ip route add 192.168.8.0/22 dev em1 # Outgoing to lan1 (10.20.80.0/22)
ip netns exec lan2 ip route add 192.168.0.0/24 via 192.168.1.1 dev v-peer-em2 # Route into default/root namespace
### Code missing to set up NAT
- 那么我需要如何以及在哪里设置 iptables 规则?
- 我是否也需要为两个命名空间“lan1”和“lan2”使用 /22 网络而不是 /24 网络?
感谢您的贡献。
备注:
我建议在使用网络命名空间时禁用在“mars”上保存 ssh 主机密钥,因为来自 lan1 的主机密钥将与来自 lan2 的主机密钥冲突。
答案1
可以有单独的堡垒主机,一个连接到 lan1,另一个连接到 lan2。但是,如果您想直接从 lan1 路由到 lan2,这无济于事。
或者重新编号。如果每个主机都有唯一的 IP 地址,那就容易多了。不妨使用路由并跳过 NAT。
无论如何,自动 IP 重新编号是一项有用的技能。数据中心迁移或合并和收购可能会与您的 IPv4 地址计划发生冲突。
如果您没有太多连续的地址空间,请考虑 IPv6。每个 LAN 都有自己的子网,也许2001:db8:20:80::/64
和2001:db8:20:90::/64
。一些主机配置允许来自 SLAAC 的前缀,加上静态主机地址。即 Linuxip 令牌。