문제
하는 OpenVPN 서버 인스턴스 ( tun
, udp
, 포트 1194
) 또한 OpenVPN을 클라이언트 인스턴스 (실행하는 리눅스 기반의 라우터 설정 tun
, udp
포트 1197
에 VPN 제공 업체에 연결을). 클라이언트와 서버 인스턴스 모두 개별적으로 잘 작동합니다 . 그러나 VPN 클라이언트 인스턴스가 활성화 된 경우 클라이언트는 VPN 서버에 연결할 수 없습니다.
VPN 클라이언트 인스턴스가 main
라우팅 테이블을 수정 하여 라우터 OUTPUT
( FORWARD
)와 라우터 ( )를 통한 모든 트래픽 이 VPN 공급자로 라우팅 되기 때문에 이런 일이 발생 한다고 확신합니다 . 이것은 원하는 기본 동작이지만 인터넷에서 시작되는 연결에는 해당되지 않습니다.
iptables
및 / 또는을 사용 ip
하여 인터넷에서 시작된 모든 (또는 최소한 VPN) 연결이 표준 기본 게이트웨이 ( 192.168.1.1
) 를 통해 라우팅되도록 라우팅 정책을 어떻게 설정할 수 있습니까?
설정
LINUX ROUTER
-----------------------------------------
| LAN if: br-lan, 192.168.2.1/24 |
| VPN client if: tun0, 10.63.10.6/32 |
| VPN server if: tun1, 10.255.0.1/24 |
| DMZ if: eth0, 192.168.1.2/24 |
-----------------------------------------
|
GATEWAY ROUTER |
--------------------------
| DMZ if: 192.168.1.1/24 |
| WAN if: x.x.x.x/x |
--------------------------
|
INTERNET | VPN CLIENT OF LINUX ROUTER (public IP: y.y.y.y/y)
----------------- --------------------------------------
| |----| VPN client if: tun1, 10.255.0.6/24 |
----------------- --------------------------------------
|
|
VPN PROVIDER OF LINUX ROUTER
--------------------------------
| VPN server if: 10.63.10.1/32 |
--------------------------------
보시다시피 우리는 여기서 이중 NAT 상황에 있습니다. VPN 클라이언트 인스턴스가 비활성화되었을 때 클라이언트 가 연결할 수 있기 때문에 불편할 수 있지만 문제는 아닙니다 .
VPN 클라이언트 및 서버 인스턴스를 활성화하면 다음과 같이 main
라우팅 테이블 이 됩니다 ip route list table main
.
0.0.0.0/1 via 10.63.10.5 dev tun0 #added by VPN client instance
default via 192.168.1.1 dev eth0 proto static
10.63.10.1 via 10.63.10.5 dev tun0 #added by VPN client instance
10.63.10.5 dev tun0 proto kernel scope link src 10.63.10.6 #added by VPN client instance
10.255.0.0/24 via 10.255.0.2 dev tun1
10.255.0.2 dev tun1 proto kernel scope link src 10.255.0.1
128.0.0.0/1 via 10.63.10.5 dev tun0 #added by VPN client instance
178.162.199.211 via 192.168.1.1 dev eth0 #added by VPN client instance
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
192.168.2.0/24 dev br-lan proto kernel scope link src 192.168.2.1
다음은 다음과 같은 IP 규칙입니다 ip rule list
.
0: from all lookup 128 #a non-existent table
1: from all lookup local
32766: from all lookup main
32767: from all lookup default #empty table
시도
우선 VPN 클라이언트 인스턴스 수정없이 테이블 의 정확한 사본 인 no_vpn_provider
라우팅 테이블 ( echo "2 no_vpn_provider" >> /etc/iproute2/rt_tables
)을 구축했습니다 main
. ip route list table no_vpn_provider
쇼
default via 192.168.1.1 dev eth0 proto static
10.255.0.0/24 via 10.255.0.2 dev tun1
10.255.0.2 dev tun1 proto kernel scope link src 10.255.0.1
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
192.168.2.0/24 dev br-lan proto kernel scope link src 192.168.2.1
1) 이 간단한 ip
규칙을 시도했습니다
ip rule add from 192.168.1.2 table no_vpn_provider priority 2
ip rule add from 10.255.0.1 table no_vpn_provider priority 3
여기서 192.168.1.2
및는 10.255.0.1
외부 인터페이스의 IP 주소이다 eth0
및 VPN 서버 인터페이스의 tun1
각각.
나는 또한 시도 from all iif eth0
하고 from all iif tun1
대신 from 192.168.1.2
하고 from 10.255.0.1
.
2) 인터페이스에 대한 0x1
새로운 연결 ( conntrack
모듈이 설치됨)으로 마킹을 시도 eth0
하고tun1
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -i eth0 -j CONNMARK --set-mark 0x1
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -i tun1 -j CONNMARK --set-mark 0x1
표시된 연결에 새 라우팅 테이블을 사용하도록이 규칙을 추가합니다.
ip rule add fwmark 0x1 table no_vpn_provider priority 2
3) VPN 서버 포트에서 나가는 패킷 을 표시해 보았습니다.1194
iptables -t mangle -A OUTPUT -p udp --sport 1194 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp --sport 1194 -j MARK --set-mark 0x1 # just in case
동일한 규칙을 사용하여
ip rule add fwmark 0x1 table no_vpn_provider priority 2
나는 또한 2)와 3)을 다른 표시로 시도하고 ( -I
)를 추가하는 대신 ( ) 를 삽입했습니다 -A
. 내 방화벽이 전혀 표시하지 않는 것으로 의심됩니다.
iptables -t mangle -A FORWARD -s 192.168.2.0/24 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table no_vpn_provider priority 2
그러나 예상대로 내 LAN의 패킷이 VPN 공급자에게 전달되지 않았습니다.
4) 지금까지 작동 하는 유일한 것은 이 추악한 규칙입니다.
ip rule add from all to y.y.y.y/y table no_vpn_provider priority 2
여기서 yyyy / y는 연결을 시도하는 클라이언트의 공용 IP 주소입니다. 클라이언트가 항상 동일한 네트워크에서 연결되지 않기 때문에 이것은 물론 끔찍한 솔루션입니다.
IP 주소가있는 인터페이스에서 보낸 모든 패킷 192.168.1.2
이 사용자 지정 라우팅 테이블을 no_vpn_provider
사용하도록하려면 다음을 사용하면됩니다.
ip rule add from 192.168.1.2 table no_vpn_provider priority 2
내가 시도한 것처럼 1). 문제는 기본적으로 OpenVPN 서버가 특정 IP 주소에 바인딩되지 않으므로 위의 규칙이 적용되지 않는다는 것입니다 ( https://serverfault.com/a/228258 ).
OpenVPN 서버를 IP 주소에 바인딩하려면 192.168.1.2
이 줄을 구성 파일에 추가하기 만하면됩니다.
local 192.168.1.2
참고 를 사용하여 규칙과 사용자 지정 라우팅 테이블을 생성 ip
하면 라우터를 재부팅 할 때마다 삭제됩니다. openvpn
구성 에 따라 다시 시작할 때마다 사용자 지정 라우팅 테이블이 수정 될 수도 있습니다 openvpn
. 필요할 때마다 규칙 및 사용자 지정 라우팅 테이블을 다시 만드는 스크립트를 작성할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다