본질적으로 라우팅 문제가 있으며 네트워크 요구 사항을 효과적으로 해결하고 설정하기 위한 라우팅 및 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 에서 VPN1
iptables에는 다음 규칙이 있습니다.
# 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에 추가할 수 있습니다.