여러 개의 동일한 LAN을 사용하는 1:1 NAT

여러 개의 동일한 LAN을 사용하는 1:1 NAT

원격 건물에 있는 여러 LAN을 연결하고 싶습니다.
"중앙" 사이트에는 OpenVPN을 실행하는 Linux 컴퓨터가 있습니다. 각 원격 사이트도 OpenVPN을 실행합니다.

  1. 중앙 사이트에는 192.168.0.0/24라는 LAN 번호가 있습니다.
  2. 여러 원격 사이트의 번호도 192.168.0.0/24로 지정됩니다.
  3. LAN 번호를 변경할 수 없습니다/하지 않습니다/하고 싶지 않습니다/그러나 LAN 번호는 변경됩니다.
  4. 대부분의 원격 OpenVPN을 제어할 수 없습니다.

그런 다음 다음을 수행해야 합니다.
1. 가상 LAN을 정의합니다
. 2. 각 사이트에 대해 1:1 NAT를 구성합니다.
3. 중앙 라우터에서 1:1 NAT를 구성해야 합니다.

LAN 다이어그램 .
따라서 각 사이트에는 10.10.x.0/24 LAN이 표시됩니다.
예를 들어, 컴퓨터가 사이트 12의 192.168.0.44에 액세스하려고 하면 단순히 10.10.12.44로 패킷을 보냅니다.

VPN을 운영하는 것은 나에게 문제가 되지 않습니다. 현재 60개 이상의 사이트에 연결되어 있습니다. 하지만 1:1 NAT를 수행하는 쉬운 방법을 찾지 못했습니다.

다음은 중앙 사이트에서 원격 사이트로 전송되는 패킷과 이에 대한 응답 패킷의 예입니다.

여기에 이미지 설명을 입력하세요.

iptables NETMAP으로 몇 가지 테스트를 수행했지만 라우팅 결정 후 소스+대상을 수정하는 방법을 찾을 수 없기 때문에 작동하지 않습니다.
새로운 OpenVPN 기능을 사용하지 않는 것이 좋습니다 --client-nat.
강제로 라우팅을 해야 할까요 ip route? 아니면 루프를 사용하여 네트워크 스택에 두 번 들어가나요 veth?

참고: 저는 변장을 사용하고 싶지 않습니다. 1/1 NAT만 가능합니다.

편집:
일반 openVPN 설정은 불가능합니다. 원격 사이트의 패킷은 다른 사이트의 패킷과 구별할 수 없기 때문에 둘 다 유사한 소스 및 대상 주소를 갖고 있으며 둘 다 동일한 tun(또는 탭) 인터페이스에서 나옵니다. 따라서 소스 NATing은 불가능합니다.

해결 방법 1: 원격 사이트의 NAT. 내 경우에는 불가능합니다. 중앙 사이트에서만 이 작업을 수행해야 합니다.

해결 방법 2: 각 원격 사이트에 대해 VPN을 설정합니다. 그래서 나는 모두에게 많은 것을 줄 것입니다. 괜찮을 것 같아요. 메모리 효율적이지는 않지만 괜찮습니다.

해결 방법 3: VPN 내의 각 사이트에 대해 (암호화되지 않은) 터널을 설정합니다. 이는 각각에 대한 인터페이스를 제공합니다. Simple Tunnel은 (내가 아는 한) 크로스 플랫폼이 아닙니다. 예를 들어 GRE, ipip 또는 sit는 Linux에서는 괜찮지만 일부 원격 사이트는 Windows 시스템만 실행하므로 openVPN이 설치됩니다. 따라서 단순 터널을 구축하는 것은 불가능합니다. 다른 옵션은 더 복잡한 터널을 사용하는 것입니다(어떤 것입니까?). 그러나 시스템 및 시스템 관리자에게 드는 오버헤드는 여러 개의 VPN을 사용하는 것보다 클 수 있습니다.

해결 방법 4: 1:1 NAT 기능이 포함된 최신 openVPN을 컴파일합니다. 이번주에 테스트해보겠습니다.

답변1

매우 기본적인 해결책은 다음과 같습니다.
1. 서버 + 클라이언트에 OpenVPN 2.3 이상을 사용합니다(현재 최신 버전은 2.3-alpha입니다).
2. 아래 OpenVPN 구성 옵션을 사용합니다
. 3. 다른 어떤 것도 사용하지 않습니다(ipfilter 없음, 트릭 없음).

서버 측에서는 VPN 주소를 수동으로 할당해야 합니다(따라서 옵션이 없으므로 또는 를 server사용해야 함 ). ifconfigifconfig-push

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

VPN을 통해 원격 사이트에서 라우터 간에 직접 통신하려면 및 라인이 필요 route합니다 push route. 그렇지 않으면 삭제할 수 있습니다. client-natping 10.99.99.1

.

.

이제 가상 네트워크 주소를 선택해야 합니다. 귀하의 예에서 사용한 것과 동일한 10.10.0.0/16을 유지했으며
이에 대한 라우팅을 허용했습니다.

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

.

.

이제 클라이언트에 1:1 NAT를 사용하도록 지시해야 합니다.

# /etc/openvpn/ccd/client_11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

첫 번째 줄은 원격 라우터 주소를 설정합니다. Windows 드라이버에는 특수 주소가 필요합니다.
두 번째이자 마지막 줄을 사용하면 원격 라우터가 10.99.99.x 인터페이스를 통해 통신할 수 있습니다.
세 번째와 네 번째 줄은 소스 및 대상 1:1 NAT를 수행하고
다섯 번째 줄은 OpenVPN에 해당 패킷을 처리하는 방법을 알려줍니다.

이 방법을 사용하면 섀도우 호스트 없이도 동일한(또는 다른) LAN 주소를 사용하여 사이트를 연결할 수 있습니다.

답변2

실제 인터페이스에서도 비슷한 작업을 해봤는데 왜 VPN 인터페이스에서는 작동하지 않는지 모르겠습니다.

해당 라우터의 서로 다른 인터페이스에서 동일한 서브넷을 사용하면 라우팅이 복잡해진다는 아이디어입니다. 기본적으로 10.10.13.123에 대한 패킷이 라우터에 들어오면 192.168.0.123으로 라우팅되기 전에 DNATed를 받게 되므로 192.168.0.123에 대한 경로를 알 수 있어야 합니다.VPN13 인터페이스.

이는 방화벽 태그와 이러한 태그를 사용하는 라우팅 규칙을 사용하여 수행할 수 있습니다. SNAT 및 DNAT는 NETMAP 방화벽 대상을 통해 수행됩니다. SNAT의 문제도 마찬가지입니다. POSTROUTING에서는 패킷이 이 인터페이스나 저 인터페이스에서 왔으며 둘 다 소스 주소가 192.168.0.x라는 정보를 잃게 됩니다. 따라서 이 정보를 mangle-PREROUTING에서 nat-POSTROUTING으로 전달하려면 태그도 필요합니다. 동일한 태그를 사용할 수 있지만 이는 해당 패킷이 대체 라우팅 테이블을 사용하므로 모든 패킷에 대해 전역 라우팅 테이블을 복사해야 함을 의미합니다.

각 네트워크에 대해 다음을 수행해야 합니다.

lnet=192.168.0.0/24
if10=eth0 if11=tun0 if12=tun1 if13=tun2

n=0
for site in 10 11 12 13; do
  table=$site
  net=10.10.$site.0/24
  n=$(($n + 1))
  eval "interface=\$if$site"
  inmark=$(($n * 2)) outmark=$(($n * 2 + 1))

  iptables -t nat -A PREROUTING -d "$net" -j NETMAP --to "$lnet"
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m mark --mark "$inmark"/0xf -j NETMAP --to "$net"
  iptables -t mangle -A PREROUTING -i "$interface" -j MARK --set-mark "$inmark"/0xf
  iptables -t mangle -A PREROUTING -d "$net" -j MARK --set-mark "$outmark"/0xf
  ip rule add fwmark "$outmark"/0xf table "$table"
  ip route add "$lnet" dev "$interface" table "$table"
done

위에서는 처음 4자리 숫자를 사용했습니다.표시, 최대 7개의 네트워크를 이 방식으로 라우팅할 수 있습니다.

관련 정보