ipv4를 라우팅 가능한 ipv6 주소(OpenVPN, NAT, iptables, nftables)에 매핑

ipv4를 라우팅 가능한 ipv6 주소(OpenVPN, NAT, iptables, nftables)에 매핑

네트워크 범위가 겹치는 여러(아마도 수백) 네트워크(지사)를 단일 "핵심" 네트워크에 연결하려면 OpenVPN을 사용해야 합니다. 단일 ipv6 주소 범위 내에서 ipv4 주소를 정적으로 매핑하는 데 도움이 되는 도구가 있는지 궁금합니다.

다음 주소 범위를 가진 4개의 분기가 있다고 가정해 보겠습니다.

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 핵심 네트워크에 들어오고 나가는 각 위치는 IPv6 주소의 일부인 위치 ID로 식별됩니다.

따라서 핵심 네트워크와 각 사이트 간에 라우팅 가능한 IPv6 트래픽이 필요합니다. 사이트 간 트래픽이 필요하지 않습니다.

이것이 가능한지, 그리고 iptables/nftables와 같은 Linux 도구나 다른 소프트웨어를 사용하여 이를 달성하는 방법에 대한 힌트를 제공해 주시겠습니까?

매우 감사합니다!

답변1

당신이 찾고 있는 것은 SIIT라고 합니다. 이를 사용하여 IPv4와 IPv6 주소 간에 상태 비저장 매핑을 수행할 수 있습니다. Linux 모듈을 확인하세요.https://jool.mx.

답변2

IPv4에서 IPv6로의 변환을 시작하려면 간단한 bash 스크립트를 사용하는 것이 좋습니다. 입력 파일(ipv4.txt)에는 사이트 ID와 IPv4 서브넷(CIDR 표기법)이 포함됩니다. 사이트 ID와 서브넷은 콜론(:)으로 구분됩니다. 단일 IPv6 4중주 길이가 2바이트이므로 사이트 ID는 2바이트(2자만)로 제한됩니다. 즉, 각 IPv6 4비트 그룹은 4개의 16진수 숫자로 표시됩니다.

$ 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 명령

관련 정보