클라이언트를 두 번째 네트워크에 연결하는 OpenVPN 서버

클라이언트를 두 번째 네트워크에 연결하는 OpenVPN 서버

두 개의 분리된 홈 네트워크가 있습니다. 하나는 인터넷에 연결되어 있고, 두 번째는 연결이 끊긴 IOT 장치용입니다.

별도의 네트워크 카드를 사용하여 Ubuntu 서버를 두 네트워크 모두에 연결했습니다.

나는 이 서버의 두 네트워크에 있는 장치의 데이터에 액세스할 수 있음을 확인했습니다(http 요청을 가져오는 데 좋은 이전 버전을 사용함 curl). 그리고 나는 또한 그것에서 인터넷에 접속할 수 있습니다.

그런 다음 OpenVPN을 설치하고 다음 지침을 사용하여 설정했습니다.서버 공간.

다음 단계에서는 클라이언트를 구성하고 인터넷에서 이 VPN 서버에 연결할 수 있었습니다.

클라이언트가 연결되면 인터넷과 내부 네트워크 중 하나에 액세스할 수 있지만 다른 네트워크에는 액세스할 수 없습니다.

VPN 서버에서 실행하면 다음을 route -n얻습니다.

0.0.0.0         12.12.1.1       0.0.0.0         UG    100    0        0 eno1
0.0.0.0         13.13.0.1       0.0.0.0         UG    200    0        0 eno2
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
12.12.1.0       0.0.0.0         255.255.255.0   U     100    0        0 eno1
12.12.1.1       0.0.0.0         255.255.255.255 UH    100    0        0 eno1
13.13.0.0       0.0.0.0         255.255.255.0   U     200    0        0 eno2
13.13.0.1       0.0.0.0         255.255.255.255 UH    200    0        0 eno2

VPN 클라이언트가 네트워크에 연결되고 10.8.0.0IP 주소가 할당됩니다 10.8.0.2.

연결된 VPN 클라이언트:

  • 네트워크에 액세스할 수 있습니다12.12.1.0
  • 인터넷에 접속할 수 있습니다.
  • 다음에서 어떤 ipaddress에도 액세스할 수 없습니다 13.13.0.0...

VPN 클라이언트가 이 두 번째 네트워크에 액세스할 수 있도록 구성에서 누락된 것은 무엇입니까?

업데이트

eno2(13.x)용 스크립트에서 NAT 명령을 추가해 보았지만 여전히 작동하지 않습니다... 생성된 파일을 /etc/iptables/add-openvpn-rules.sh다음 내용으로 수정했습니다(스크립트에 의해 공간이 자동으로 생성되기 전 부분).

#!/bin/sh
iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eno1 -j MASQUERADE
iptables -I INPUT 1 -i tun0 -j ACCEPT
iptables -I FORWARD 1 -i eno1 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o eno1 -j ACCEPT
iptables -I INPUT 1 -i eno1 -p udp --dport 1194 -j ACCEPT

iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eno2 -j MASQUERADE
iptables -I FORWARD 1 -i eno2 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o eno2 -j ACCEPT
iptables -I INPUT 1 -i eno2 -p udp --dport 1194 -j ACCEPT

실행 중 iptables -S 재부팅 후 다음을 얻었습니다.

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i eno2 -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i eno1 -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A FORWARD -i tun0 -o eno2 -j ACCEPT
-A FORWARD -i eno2 -o tun0 -j ACCEPT
-A FORWARD -i tun0 -o eno1 -j ACCEPT
-A FORWARD -i eno1 -o tun0 -j ACCEPT

답변1

첫째, VPN 서버의 방화벽(예: iptables "FORWARD" 체인)은 패킷 전송 및 수신을 허용해야 합니다.

둘째, 모든 장치에 경로가 있어야 합니다.뒤쪽에그렇지 않으면 VPN 클라이언트로부터 패킷을 수신하기만 하고 응답할 방법은 없습니다.

예를 들어, 12.12.* 네트워크의 장치(또는 더 일반적으로 장치 자체가 아니라 해당 네트워크의 게이트웨이)에는 "12.12.1.1을 통한 10.8.0.0/24" 경로가 필요합니다.

이것이 가능하지 않은 경우 VPN 서버가 두 네트워크 간에 SNAT(즉, 소스 주소 "가장")를 수행하도록 하는 것이 대안입니다. SNAT를 사용하면 VPN 클라이언트의 모든 패킷이처럼 보인다이는 실제로 VPN 서버 자체(예: 12.12.1.1)에서 제공됩니다. 귀하의 경우 이는 장치와 동일한 네트워크에 있으므로 장치가 이미 연결 방법을 알고 있는 것입니다.

사용하고 있던 VPN 설치 스크립트인 것 같습니다(많이등) 실제로 하나의 인터페이스에 대해 iptables SNAT 규칙을 추가합니다. /etc/iptables/add-openvpn-rules.sh( 에서 찾을 수 있습니다 .라인 963-977스크립트에서). 관련 규칙은 다음과 같습니다 - iptables MASQUERADE작업을 사용합니다:

iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o $NIC -j MASQUERADE

물론 전달된 패킷이 일반적으로 통과하도록 허용하는 규칙도 있습니다.

iptables -I FORWARD 1 -i $NIC -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o $NIC -j ACCEPT

두 개의 인터페이스에 두 개의 네트워크가 있으므로 해당 규칙을 복제해야 합니다(또는 다른 방식으로 다시 작성해야 합니다).

관련 정보