두 개의 분리된 홈 네트워크가 있습니다. 하나는 인터넷에 연결되어 있고, 두 번째는 연결이 끊긴 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.0
IP 주소가 할당됩니다 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
두 개의 인터페이스에 두 개의 네트워크가 있으므로 해당 규칙을 복제해야 합니다(또는 다른 방식으로 다시 작성해야 합니다).