신뢰할 수없는 네트워크를 통한 고급 Linux 라우팅을 통한 중복 OpenVPN 연결


9

저는 현재 많은 웹 사이트를 차단하고 외부 세계에 신뢰할 수없는 네트워크 연결을 가지고있는 국가에 살고 있습니다. 방화벽을 우회하는 데 사용하는 Linux 서버에 두 개의 OpenVPN 엔드 포인트 (예 : vpn1 및 vpn2)가 있습니다. 이 서버에 대한 모든 권한이 있습니다. 내 VPN 연결에서 높은 패키지 손실을 제외하고는 매우 잘 작동합니다. 이 패킷 손실은 시간에 따라 1 %에서 30 % 사이이며, 상관 관계가 낮은 것 같습니다.

두 끝점 모두에 OpenVPN 연결을 유지하고 모든 패킷을 두 끝점 모두에 두 번 보내는 홈 라우터 (Linux에서도)를 설정하려고합니다. vpn2는 모든 패킷을 집에서 vpn1로 보냅니다. 리턴 트래픽은 vpn1에서 집으로 직접 전송되거나 vpn2를 통해 전송됩니다.

       +------------+
       |    home    |
       +------------+
        |          |
        | OpenVPN  |
        |  links   |
        |          |
     ~~~~~~~~~~~~~~~~~~ unreliable connection
        |          |
+----------+   +----------+
|   vpn1   |---|   vpn2   |
+----------+   +----------+
        |
       +------------+
       | HTTP proxy |
       +------------+
             |
         (internet)

명확성을 위해 : 홈과 HTTP 프록시 사이의 모든 패킷이 복제되어 다른 경로를 통해 전송되어 패킷 중 하나가 도착할 가능성이 높아집니다. 둘 다 도착하면 첫 번째 두 번째 항목은 자동으로 버릴 수 있습니다.

대역폭 사용량은 홈 측과 엔드 포인트 측 모두에서 문제가되지 않습니다. vpn1과 vpn2는 서로 가깝고 (3ms 핑) 안정적으로 연결되어 있습니다.

Linux에서 사용할 수있는 고급 라우팅 정책을 사용하여이를 달성하는 방법에 대한 조언이 있습니까?

답변:


8

'home'및 'vpn1'측에서 본딩 인프라를 사용하고 본드에 속하는 모든 인터페이스에서 트래픽을 브로드 캐스트하는 mode = 3 설정으로 지정하십시오.

본딩 구성 방법에 대한 자세한 내용은 http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.37.y.git;a=blob;f 에서 훌륭한 매뉴얼을 참조하십시오. = Documentation / networking / bonding.txt; h = 5dc638791d975116bf1a1e590fdfc44a6ae5c33c; hb = HEAD


이 설정을 테스트했으며 환상적으로 작동합니다. 단 하나의 서버에 대한 중복 연결로 패키지 손실이 약 5 %에서 0.0-0.1 %로 줄었습니다!
konrad

7

@ user48116에서 제공 한 답변을 사용했으며 매력처럼 작동합니다. 설정은 실제로 매우 쉽습니다!

참고 : 하나의 단일 서버에 두 번 연결 하여이 문제를 이미 해결했기 때문에 이것을 구현했습니다. 두 서버로 설정을 시도하려면 가장 쉬운 방법은 포트 전달을 사용하여 UDP 포트를 두 번째 서버에서 첫 번째 서버로 전달하고 여기에 설명 된 것과 동일한 레시피를 사용하는 것입니다. 나는 이것을 직접 테스트하지 않았다.

먼저, 본딩을 지원하는 2.6 커널 (모든 최신 배포판의 기본값)이 있고 ifenslave가 설치되어 있는지 확인하십시오.

다음으로 이것을 /etc/rc.local 또는 원하는 다른 장소에 넣으십시오. 그러나 openvpn을 시작 하기 전에 실행하십시오 (bond0에 바인딩하려고하기 때문에).

고객:

modprobe bonding mode=broadcast
ifconfig bond0 10.10.0.2 netmask 255.255.255.0 up

여기에 필요한 경우 라우팅을 추가 할 수 있습니다. 다른 쪽에서도 올바른 라우팅을 모두 수행하십시오.

route add -net 10.7.0.0/24 gw 10.10.0.1

섬기는 사람:

modprobe bonding mode=broadcast
ifconfig bond0 10.10.0.1 netmask 255.255.255.0 up

/etc/openvpn/tap-up.sh 스크립트를 작성하십시오 (그리고 chmod a + x tap-up.sh로 실행 가능으로 표시하는 것을 잊지 마십시오) :

#!/bin/sh
# called as: cmd tap_dev tap_mtu link_mtu ifconfig_local_ip ifconfig_netmask [ init | restart ]
ifenslave bond0 "$1"

그런 다음 공유 키와 함께 bridge0a.conf 및 bridge0b.conf를 / etc / openvpn /에 추가하십시오. 파일은 다른 포트를 제외하고 a와 b에 동일합니다 (예 : b에 3002 사용). 서버의 공용 IP로 11.22.33.44를 바꾸십시오.

고객:

remote 11.22.33.44
dev tap
port 3001
rport 3001
secret bridge.key
comp-lzo
verb 4
nobind
persist-tun
persist-key
script-security 2
up /etc/openvpn/tap-up.sh

섬기는 사람:

local 11.22.33.44
dev tap
port 3001
lport 3001
secret bridge.key
comp-lzo
verb 4
script-security 2
up /etc/openvpn/tap-up.sh

새로운 VPN 구성이 시작되도록 / etc / defaults / openvpn을 편집하는 것을 잊지 마십시오. 머신을 재부팅하거나 rc.local을로드하고 openvpn을 수동으로 다시 시작하십시오.

이제 설정을 테스트 할 준비가되었습니다 :

# ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=50.4 ms
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=51.1 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=51.1 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=1 ttl=64 time=51.1 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=52.0 ms
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=52.2 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=53.0 ms (DUP!)
64 bytes from 10.10.0.1: icmp_req=2 ttl=64 time=53.1 ms (DUP!)
--- 10.10.0.1 ping statistics ---
2 packets transmitted, 2 received, +6 duplicates, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 50.428/51.786/53.160/0.955 ms

모든 것이 잘되고 회선이 양호하면 모든 ICMP 패키지에 대해 네 개의 회신 이 표시 됩니다. 패키지는 로컬쪽에 복제되고이 두 패키지에 대한 회신은 원격쪽에 다시 복제됩니다. TCP는 단순히 모든 중복 항목을 무시하기 때문에 TCP 연결에는 문제가되지 않습니다.

이것은 UDP 패킷의 문제입니다. 중복을 처리하는 것은 소프트웨어에 달려 있습니다. 예를 들어, DNS 쿼리는 예상 된 두 개 대신 네 개의 회신을 생성합니다 (두 번이 아니라 응답에 일반 대역폭의 네 배를 사용함).

# tcpdump -i bond0 -n port 53
listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes
13:30:39.870740 IP 10.10.0.2.59330 > 10.7.0.1.53: 59577+ A? serverfault.com. (33)
13:30:40.174281 IP 10.7.0.1.53 > 10.10.0.2.59330: 59577 1/0/0 A 64.34.119.12 (49)
13:30:40.174471 IP 10.7.0.1.53 > 10.10.0.2.59330: 59577 1/0/0 A 64.34.119.12 (49)
13:30:40.186664 IP 10.7.0.1.53 > 10.10.0.2.59330: 59577 1/0/0 A 64.34.119.12 (49)
13:30:40.187030 IP 10.7.0.1.53 > 10.10.0.2.59330: 59577 1/0/0 A 64.34.119.12 (49)

행운을 빕니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.