将 ipv4 映射到可路由 ipv6 地址(OpenVPN、NAT、iptables、nftables)

将 ipv4 映射到可路由 ipv6 地址(OpenVPN、NAT、iptables、nftables)

我必须使用 OpenVPN 将多个(可能有数百个)具有重叠网络范围的网络(分支机构)连接到单个“核心”网络。我想知道是否有一个工具可以帮助我在单个 ipv6 地址范围内静态映射 ipv4 地址。

假设我有四个分支机构,地址范围如下:

Location A: 192.168.1.x/24
Location B: 192.168.1.x/24  (not a typo, same as A)
Location C: 12.14.1.0/8

例如,对于任何给定的 ipv4 地址a.b.c.d,我想将其“嵌入”到它自己的 ipv6 范围中2a03:1000:{location}:ab:cd (本例随机选择 2a03:1000)

Location A would be mapped to 2a03:1000:0001::c0a8:01xx  (c0=192, a8=168, 01=1, xx=host part)
Location B would be mapped to 2a03:1000:0002::c0a8:01xx  (c0=192, a8=168, 01=1, xx=host part)
Location B would be mapped to 2a03:1000:0003::0c0c:0100 
                                        ^^^^  ^^^^^^^^^
                                          |       |
                                          |       | ipv4 address range
                                          |
                                          | location or site id

我想你明白了……这样,重叠就不再是问题了,因为这些都是唯一的有效 ipv6 地址。每个位置内部的通信仍然是 ipv4,并且进出 ipv6 核心网络的每个位置都由其位置 id 作为 ipv6 地址的一部分来标识。

因此,我需要核心网络和每个站点之间可路由的 ipv6 流量。站点之间不需要有流量。

您能否提示一下这是否可行以及如何使用 Linux 工具(例如 iptables/nftables 或任何其他软件)实现这一点?

非常感谢!

答案1

您正在寻找的称为 SIIT。您可以使用它在 IPv4 和 IPv6 地址之间进行无状态映射。查看 Linux 模块:https://jool.mx

答案2

我建议使用简单的 bash 脚本开始 IPv4 到 IPv6 的转换。输入文件 (ipv4.txt) 将包含站点 ID 和 IPv4 子网(采用 CIDR 表示法)。站点 ID 和子网以冒号 (:) 分隔。站点 ID 仅限于两个字节(仅限两个字符),因为单个 IPv6 四重奏的长度为两个字节。这意味着每个 IPv6 四位组都由四个十六进制数字表示。

$ cat ipv4.txt
US:192.168.1.0/28
C2:10.20.30.224/29
NL:172.30.50.128/28
UK:192.168.1.0/28

从上面的输出中,我们可以看到存在Site-US子网Site-UK冲突,但 IPv6 转换将解决问题。获得具有相应子网的所有缩写站点 ID 后,您可以执行以下脚本:

#!/bin/bash
# Read IPv4 subnets from a text file ipv4.txt
echo "Converted IP addresses" > ipv6.txt
echo "======================" >> ipv6.txt
while read x; do
        # Declare site as TEXT value
        a=$(echo -n "$x" | cut -d ":" -f 1)
        # Declare site as HEX value
        b=$(echo -n "$a" | xxd -p)
        # Declare subnet
        subnet=$(echo -n "$x" | cut -d ":" -f 2)
        # Expand an IPv4 subnet using prips command and replace periods (.)
        # with single space and store the results in temp.txt file
        # We must remove periods (.) before we convert IPv4 to HEX values
        prips $subnet | awk '{print "'$site' " $0}'| tr '.' ' ' > temp.txt
        # Convert all single IPv4 addresses to HEX using a while loop
        echo >> ipv6.txt
        echo "Site: $a" >> ipv6.txt
        echo "=========================" >> ipv6.txt
        while read y; do
        # Append results to a text file ipv6.txt (Note: I have hardcoded 2a03:1000)
        ip=$(echo $y | tr ' ' '.')
        printf '%x\n' $y | tr '\n' ':' | awk '{print "'$ip' - " "2a03:1000:'$b'::" $0}' | sed 's/.$//' >> ipv6.txt
        done < temp.txt
done < ipv4.txt

您的输出应类似于以下内容:

$ cat ipv6.txt
Converted IP addresses
======================

Site: US
=========================
192.168.1.0 - 2a03:1000:5553::c0:a8:1:0
192.168.1.1 - 2a03:1000:5553::c0:a8:1:1
192.168.1.2 - 2a03:1000:5553::c0:a8:1:2
192.168.1.3 - 2a03:1000:5553::c0:a8:1:3
192.168.1.4 - 2a03:1000:5553::c0:a8:1:4
192.168.1.5 - 2a03:1000:5553::c0:a8:1:5
192.168.1.6 - 2a03:1000:5553::c0:a8:1:6
192.168.1.7 - 2a03:1000:5553::c0:a8:1:7
192.168.1.8 - 2a03:1000:5553::c0:a8:1:8
192.168.1.9 - 2a03:1000:5553::c0:a8:1:9
192.168.1.10 - 2a03:1000:5553::c0:a8:1:a
192.168.1.11 - 2a03:1000:5553::c0:a8:1:b
192.168.1.12 - 2a03:1000:5553::c0:a8:1:c
192.168.1.13 - 2a03:1000:5553::c0:a8:1:d
192.168.1.14 - 2a03:1000:5553::c0:a8:1:e
192.168.1.15 - 2a03:1000:5553::c0:a8:1:f

Site: C2
=========================
10.20.30.224 - 2a03:1000:4332::a:14:1e:e0
10.20.30.225 - 2a03:1000:4332::a:14:1e:e1
10.20.30.226 - 2a03:1000:4332::a:14:1e:e2
10.20.30.227 - 2a03:1000:4332::a:14:1e:e3
10.20.30.228 - 2a03:1000:4332::a:14:1e:e4
10.20.30.229 - 2a03:1000:4332::a:14:1e:e5
10.20.30.230 - 2a03:1000:4332::a:14:1e:e6
10.20.30.231 - 2a03:1000:4332::a:14:1e:e7

Site: NL
=========================
172.30.50.128 - 2a03:1000:4e4c::ac:1e:32:80
172.30.50.129 - 2a03:1000:4e4c::ac:1e:32:81
172.30.50.130 - 2a03:1000:4e4c::ac:1e:32:82
172.30.50.131 - 2a03:1000:4e4c::ac:1e:32:83
172.30.50.132 - 2a03:1000:4e4c::ac:1e:32:84
172.30.50.133 - 2a03:1000:4e4c::ac:1e:32:85
172.30.50.134 - 2a03:1000:4e4c::ac:1e:32:86
172.30.50.135 - 2a03:1000:4e4c::ac:1e:32:87
172.30.50.136 - 2a03:1000:4e4c::ac:1e:32:88
172.30.50.137 - 2a03:1000:4e4c::ac:1e:32:89
172.30.50.138 - 2a03:1000:4e4c::ac:1e:32:8a
172.30.50.139 - 2a03:1000:4e4c::ac:1e:32:8b
172.30.50.140 - 2a03:1000:4e4c::ac:1e:32:8c
172.30.50.141 - 2a03:1000:4e4c::ac:1e:32:8d
172.30.50.142 - 2a03:1000:4e4c::ac:1e:32:8e
172.30.50.143 - 2a03:1000:4e4c::ac:1e:32:8f

Site: UK
=========================
192.168.1.0 - 2a03:1000:554b::c0:a8:1:0
192.168.1.1 - 2a03:1000:554b::c0:a8:1:1
192.168.1.2 - 2a03:1000:554b::c0:a8:1:2
192.168.1.3 - 2a03:1000:554b::c0:a8:1:3
192.168.1.4 - 2a03:1000:554b::c0:a8:1:4
192.168.1.5 - 2a03:1000:554b::c0:a8:1:5
192.168.1.6 - 2a03:1000:554b::c0:a8:1:6
192.168.1.7 - 2a03:1000:554b::c0:a8:1:7
192.168.1.8 - 2a03:1000:554b::c0:a8:1:8
192.168.1.9 - 2a03:1000:554b::c0:a8:1:9
192.168.1.10 - 2a03:1000:554b::c0:a8:1:a
192.168.1.11 - 2a03:1000:554b::c0:a8:1:b
192.168.1.12 - 2a03:1000:554b::c0:a8:1:c
192.168.1.13 - 2a03:1000:554b::c0:a8:1:d
192.168.1.14 - 2a03:1000:554b::c0:a8:1:e
192.168.1.15 - 2a03:1000:554b::c0:a8:1:f

获得所有 IPv6 地址后,您可以将它们输入 Linux iptables / OpenVPN 或商业防火墙 / VPN 解决方案。

资源:IPv6 解释, 普利普斯命令, xxd 命令

相关内容