iptables: VPN 서버를 사용하여 LAN에서 연결된 openvpn 클라이언트에 액세스합니다.

iptables: VPN 서버를 사용하여 LAN에서 연결된 openvpn 클라이언트에 액세스합니다.

본질적으로 라우팅 문제가 있으며 네트워크 요구 사항을 효과적으로 해결하고 설정하기 위한 라우팅 및 iptables에 대해 충분히 익숙하지 않습니다.

무슨 일이 일어나고 있나요?

openVPN 네트워크가 설정되어 작동 중입니다. 클라이언트는 인터넷을 통해 LAN에 연결할 수 있습니다.

내가 원하는 일이 일어났으면 좋겠어

...클라이언트가 특정 서브넷의 VPN에 연결될 때.

  • 클라이언트는 VPN 네트워크에서 액세스할 수 있어야 합니다.

규칙이 다음 중 하나 이상을 수행할 수 있는 경우 보너스 포인트:

  • 클라이언트는 VPN에 대한 연결을 시작할 수 없어야 합니다.
  • 클라이언트가 DNS에 나타나야 합니다.

토폴로지

네트워크 토폴로지는 다음과 같습니다.

   ______        ____________________
 /        \     /                    \
| internet |---| client (10.8.8.0/24) |
 \________/     \____________________/
     |
   ______
 /        \
| gateway  |
 \________/
     |
-----LAN------ (10.10.10.0/24)
|    |   |   |
             L_____VPN Server `VPN1` 10.10.10.2 (fictional name/subnet)

현재 설정

게이트웨이에는 다음과 같은 경로가 정의되어 있습니다.

10.8.8.0    255.255.255.0   10.10.10.2  LAN & WLAN

On 에서 VPN1iptables에는 다음 규칙이 있습니다.

# Flush the filter and nat tables
iptables -t filter -F
iptables -t nat -F

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE

현재 무슨 일이 일어나고 있나요?

명령 mtr 10.8.8.1(VPN에 연결된 클라이언트의 IP)을 실행하면 현재 경로가 VPN1과 게이트웨이 사이를 오가는 것을 볼 수 있습니다.

답변1

iptables 온라인 학습의 또 다른 힘든 라운드 후에 저는 해결책을 발견했습니다.

그러나 첫째, iptables에 관한 잘못된 가정이 있습니다. 규칙에 대한 나의 초기 접근 방식은 패킷이 수신되면 INPUT 및 OUTPUT 체인을 통해 실행되는 것이었습니다. 별로; 규칙이 패킷과 일치하는 순간 테이블에서 사라집니다. 지정하지 않는 한(예: "-t nat") 필터 테이블이 가정되므로 나열된 대부분의 규칙은 필터 테이블에서 실행됩니다.

체인 관련

  • 입력: 서버로 향하는 패킷에서 실행
  • 산출: 서버에서 발생하는 패킷에서 실행
  • 앞으로: 그 밖의 모든 것 - 규칙이 여기에 일치하는 경우 "점프"(나는 다음과 같이 생각하고 싶습니다.-제이"job" ;)이 ACCEPT이면 패킷이 적절하게 라우팅됩니다.

규칙의 분석

아래의 규칙에 대한 설명입니다.현재 설정~ 위에

iptables -t filter -F
iptables -t nat -F

이 규칙은 단순히필터그리고테이블. iptables 규칙을 지우는 더 많은 테이블과 더 철저한 방법이 있습니다.

iptables -A INPUT -i tun+ -j ACCEPT

이 규칙은 다음과 같은 이유로 아무 작업도 수행하지 않습니다.

  • 다른 네트워크가 아닌 VPN1로 향하는 트래픽에서 실행됩니다.
  • 들어오는 트래픽에 대해 설정된 정책이 없으므로 기본적으로 허용됩니다.

계속하다...

iptables -A FORWARD -i tun+ -j ACCEPT

이 규칙은 10.8.8.0/24에서 들어오는 트래픽이 라우팅되도록 허용합니다. 규칙테이블은 이 규칙과 일치하는 패킷에서 실행됩니다.

iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24

10.8.8.0/24 트래픽이 VPN1 서버를 향하지 않기 때문에 이 규칙은 원하는 라우팅에도 영향을 미치지 않습니다.

iptables -A FORWARD -i eth0 -j ACCEPT

이 규칙은 10.10.10.0/16의 트래픽이 라우팅되도록 허용합니다.

iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE

이 규칙을 사용하면 10.10.10.0/16에서 VPN으로 향하는 트래픽이 VPN1에서 온 것처럼 보이게 되므로 VPN1이 게이트웨이처럼 보이게 됩니다.

뭐가 문제 야?

한 네트워크에서 다음 네트워크로 트래픽을 가져오는 것처럼 규칙은 "정상"이어야 합니다. 기본 "DROP" 정책 등과 같은 실제 보호 기능은 없지만 이것이 문제의 핵심은 아닙니다.

VPN을 통해 트래픽을 라우팅할 수 있도록 iptables가 설정된 경우 VPN을 통해 다시 전송되는 원인은 무엇입니까?eth0게이트웨이로? VPN1이 10.8.8.0/24에 대해 몰랐던 경우. VPN 서버가 해당 네트워크를 인식하지 못한 경우 인터넷 트래픽으로 처리되어 게이트웨이로 다시 전송됩니다.

수정 사항

해결책은 VPN 서버에 네트워크(openvpn 서버)에 대해 알려주는 것이었습니다. 이를 수행하는 방법에는 두 가지가 있습니다. 서버가 하나의 네트워크에만 서비스를 제공하는 경우 이는 간단한 구성 설정입니다.

server 10.8.8.0 255.255.255.0

제 경우에는 서버 경로를 설정해 놓았는데, 추가 네트워크에 대해 알기 위해 필요했습니다. 구성은 다음과 같습니다.

server 10.5.5.0 255.255.255.0
route 10.8.8.0 255.255.255.0

그게 다야! VPN1에 네트워크 경로가 있으면 FORWARD 체인이 트래픽을 라우팅할 수 있습니다.

더 나은 iptables 설정

iptables를 플러시한 후 더 나은 구성은 다음과 같습니다.

# Forward established traffic so that (in the above case) VPN1 doesn't
# drop responses from the client, A.K.A. "the magic"
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t filter -A FORWARD     -s 10.10.10.0/16 -d 10.8.8.0/24  -j ACCEPT
iptables -t nat    -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24  -j MASQUERADE

# Drop everything else that wants to be forwarded
iptables -P FORWARD DROP

10.8.8.0/24에서 들어오는 트래픽에 대한 명시적인 규칙은 없습니다. 즉, 기본적으로 트래픽은 10.10.10.0/16 네트워크에 도달하지 않습니다. 단, 10.10.10.0/16에서 보낸 트래픽에 대한 응답 트래픽은 제외됩니다. . 이제 iptables가 설정되었으므로 VPN 구성에서 클라이언트에 IP를 할당하고 완전한 솔루션을 위해 DNS에 추가할 수 있습니다.

관련 정보