동일한 LAN이 여러 개인 1 : 1 NAT


13

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

  1. 중앙 사이트의 LAN 번호는 192.168.0.0/24입니다.
  2. 여러 원격 사이트에도 번호가 192.168.0.0/24입니다.
  3. 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로 paquet을 보내면됩니다.

VPN 운영은 문제가되지 않습니다. 현재 60 개 이상의 사이트를 연결하고 있습니다. 그러나이 1 : 1 NAT를 수행하는 간단한 방법을 찾지 못했습니다.

다음은 중앙 사이트에서 원격 사이트로 전송 된 패킷 및 해당 응답 패킷의 예입니다.

여기에 이미지 설명을 입력하십시오

iptables NETMAP으로 몇 가지 테스트를했지만 라우팅 결정 후 소스 + 대상을 수정할 수있는 방법을 찾지 못했기 때문에 작동시킬 수 없습니다.
새로운 --client-natOpenVPN의 기능 을 피하고 싶습니다 .
어쩌면 내가 강제로 라우팅해야 ip route합니까? 또는 veth? 를 사용하여 네트워크 스택에 두 번 반복합니다 .

참고 : 가장 무도회를 사용하고 싶지 않습니다. 1/1 NAT 만

편집 :
정기적 인 openVPN 설정으로는 불가능합니다. 원격 사이트의 패킷은 다른 사이트의 패킷과 구별 할 수 없기 때문에 소스 및 대상 주소가 비슷하며 모두 동일한 툰 (또는 탭) 인터페이스에서 가져옵니다. 따라서 소스 NAT를 사용할 수 없습니다.

해결 방법 1 : 원격 사이트에서 NAT를 수행하십시오. 내 경우에는 불가능합니다. 나는 중앙 사이트에서만해야합니다.

해결 방법 2 : 각 원격 사이트에 대해 하나의 VPN을 설정하십시오. 그래서 나는 각각에 대해 하나의 툰을 가질 것입니다. 나는 이것이 괜찮을 것이라고 생각한다. 메모리 효율성은 좋지 않지만 괜찮습니다.

해결 방법 3 : 각 사이트의 VPN 내에 (암호화되지 않은) 터널을 설정하십시오. 이것은 각각에 대해 하나의 인터페이스를 제공합니다. 간단한 터널은 크로스 플랫폼이 아닙니다 (내 지식으로). 예를 들어 Linux의 경우 GRE 또는 ipip 또는 sit가 정상이지만 일부 원격 사이트는 하나의 Windows 컴퓨터 만 실행하므로 openVPN이 설치되어 있습니다. 간단한 터널을 설정하는 것은 불가능합니다. 다른 옵션은 더 복잡한 터널을 사용하는 것인데 (?) 시스템과 sysadmin의 오버 헤드는 여러 VPN을 사용하는 것보다 클 수 있습니다

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


1
솔루션 4의 경우 컴파일 할 필요가 없습니다. 대부분의 주요 Linux 배포판은 공식 openVPN 웹 사이트에서 패키지를 컴파일했습니다. --client-nat 기능은 푸시 가능한 옵션이기 때문에 이것은 효과가 없습니다. 따라서 클라이언트는 최신 RC 버전도 사용해야합니다 (원격 사이트를 제어 할 수 없다고 말합니다).
Gregory MOUSSAT

1
글쎄, 내가 틀렸다 : --client-nat 기능은 OpenVPN 내부에서 100 %입니다 (ipfilter를 사용하고 있다고 생각했습니다). 방금 테스트했습니다 : Windows에서도 작동합니다. 아래 내 솔루션을 참조하십시오.
Gregory MOUSSAT

나는 당신 이이 일을하고 있는지 당신이 무엇을했는지 알고 싶습니다.
마이클 그랜트

답변:


2

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

서버 측에서, 당신은 (아무 수동으로 VPN 주소를 배포해야 server옵션을 사용해야 ifconfig또는 ifconfig-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"

routepush routeclient-nat당신이 라우터간에 직접 통신 할 경우 라인이 필요합니다 ( ping 10.99.99.1먼 사이트는 VPN을 축복하는). 그렇지 않으면 버릴 수 있습니다.

.

.

이제 가상 네트워크 주소를 선택해야합니다. 나는 당신이 당신의 예제에서 사용했던 것과 동일하게 유지했습니다 : 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 주소로 사이트를 연결할 수 있습니다.


1
간단하고 훌륭합니다.
Bertrand SCHITS

나는 이것을 시도했지만 작동시키지 못했습니다. 나는 양쪽에서 리눅스를 사용하고 있습니다. 뭔가 이상하거나 전혀 이해하지 못합니다. client_11 파일의 첫 번째 ifconfig-push (첫 번째 줄)는 10.99.99.1 대신 두 번째 인수의 넷 마스크가 아니어야합니까? 둘째, 왜이 세 번째 네트워크 10.10.111.0/24를 사용하고 있습니까? 사이트 간 통신에 111 네트워크를 사용하려고하는 것 같습니다. 10.10 네트워크를 직접 사용할 수 없습니까? 마지막으로, 내가 무엇을 시도하더라도 클라이언트의 패킷에 영향을 미치는 snat 및 dnat가 (tcpdump에서) 보이지 않습니다.
Michael Grant

정말 간단하지는 않지만 여전히 훌륭합니다.
신경 전달 물질

4

실제 인터페이스와 비슷한 작업을 수행했지만 VPN 인터페이스에서 작동하지 않는 이유를 알 수 없습니다.

해당 라우터의 다른 인터페이스에서 동일한 서브넷을 사용할 수 있으므로 라우팅이 복잡해집니다. 기본적으로 10.10.13.123에 대한 패킷이 라우터에 들어가면 192.168.0.123으로 라우팅하기 전에 DNATed이므로 인터페이스 VPN13 에서 192.168.0.123 용으로 라우팅되었음을 알릴 수 있어야합니다 .

방화벽 표시 및 해당 표시를 사용하는 라우팅 규칙을 사용하여이를 수행 할 수 있습니다. SNAT 및 DNAT는 NETMAP 방화벽 대상으로 수행해야합니다. SNAT의 경우 POSTROUTING에서 동일한 문제입니다. 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 개의 네트워크가 그렇게 라우팅되도록합니다.


1
답변 주셔서 감사합니다. 테스트했지만 작동하지 않습니다. 하나의 LAN으로 만 테스트했지만 더 이상 결과가 없습니다. 나는 tcpdump를 사용하여 패킷을 모니터링하고 원격에서 중앙 사이트로 패킷을 보낼 때 아무것도 볼 수 없습니다 (?! 어떻게 가능합니까?). 귀하의 지시에 따라 단계별 답변을 구성하려고합니다. 내가 성공할지 모르겠다.
Bertrand SCHITS

2
내 대답은 중앙 사이트에서해야 할 일만 다룹니다. 다른 사이트에서 라우팅을 올바르게 구성했다고 가정합니다. 예를 들어 원격 사이트의 VPN 터널을 통해 10.10.0.0/16에 대한 경로를 추가해야 할 수 있습니다. 해당 패킷을 통과시키기 위해 openvpn에 지시해야 할 수도 있습니다. 어쨌든, tcpdump를 사용하여 어떤 패킷이 어디에서 어떻게 적합한 지 확인하십시오. iptables LOG 대상도 친구입니다.
Stéphane Chazelas

2
패킷이 없으면 openvpn 로그를 살펴 봐야합니다. 손실 된 패킷이있을 수 있습니다. 이 경우 각 클라이언트에 대해 "iroute 192.168.0.0 255.255.255.0"을 client-config-dir에 사용하십시오.
Gregory MOUSSAT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.