** 전용 ** 포트 80 및 443을 리디렉션하기위한 새로운 VPN 연결을위한 라우팅 및 IP 테이블 설정


8

일부 ISP 제한 사항을 라우팅 할 수있는 새로운 VPN 연결 (openvpn 사용)이 있습니다. 제대로 작동하지만 VPN을 통해 모든 트래픽을 처리하고 있습니다. 이로 인해 다운로드 및 인터넷 액세스가 VPN에서 허용하는 것보다 훨씬 빠릅니다. ssh 서버를 실행하고 전화를 통해 다운로드를 예약 할 수있는 데몬이 실행 중입니다.

eth0에 기존 이더넷 연결이 있고 tun0에 새로운 VPN 연결이 있습니다.

192.168.0.0/24 네트워크에서 기존 eth0 연결을 사용하기 위해 기본 경로를 설정하고 기본 게이트웨이를 192.168.0.1로 설정해야한다고 생각합니다 (수년 동안 이것을하지 않았으므로 지식이 흔들립니다. ). 그것이 맞다면, 어떻게 해야할지 확실하지 않습니다!. 내 현재 라우팅 테이블은 다음과 같습니다

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface    MSS   Window irtt
0.0.0.0         10.51.0.169     0.0.0.0         UG    0      0        0 tun0     0     0      0
10.51.0.1       10.51.0.169     255.255.255.255 UGH   0      0        0 tun0     0     0      0
10.51.0.169     0.0.0.0         255.255.255.255 UH    0      0        0 tun0     0     0      0
85.25.147.49    192.168.0.1     255.255.255.255 UGH   0      0        0 eth0     0     0      0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0     0     0      0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0     0     0      0

라우팅을 수정 한 후에는 iptables를 사용하여 tun0을 통해 대상 포트 80 또는 443에 대한 모든 것을 강제하기 위해 사전 라우팅 또는 마스 쿼 레이 딩을 구성해야한다고 생각합니다. 다시 말하지만,이 작업을 수행하는 방법을 정확히 모르겠습니다!

내가 인터넷에서 찾은 모든 것은 훨씬 더 복잡한 것을 시도하고 있으며 나무에서 나무를 분류하는 것은 어렵다는 것을 증명합니다.

도움을 주시면 감사하겠습니다.

최신 정보

지금까지 다양한 출처에서 다음을 함께 모았습니다.

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

이제 이것은 작동하는 것 같습니다 . 그렇지 않다면!

차단 된 웹 사이트에 대한 연결 진행 중이며 포트 80 및 443 없는 연결은 비 VPN 연결을 사용하고 있습니다.

그러나 차단 된 웹 사이트에 연결 되지 않은 포트 80 및 443 연결 은 비 VPN 연결도 사용하고 있습니다!

일반적인 목표에 도달함에 따라, 나는 상대적으로 행복 하지만 왜 그것이 정확히 작동하지 않는지 아는 것이 좋을 것입니다.

어떤 아이디어?

참고로, 이제 3 개의 라우팅 테이블 (main, internet 및 vpn)이 있습니다. 그 목록은 다음과 같습니다.

본관:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 

인터넷:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 
192.168.0.1 dev eth0  scope link  src 192.168.0.73

VPN :

default via 10.38.0.205 dev tun0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1

위 스크립트는 예상대로 작동합니다. netstat의 10. 주소에서 트래픽이 발생하는 것으로 나타났습니다. 그러나 모든 트래픽은 192에서 시작되지만 포트 80 및 443은 VPN을 통해 전송됩니다. 나는 전체 솔루션을 답에 넣을 것이지만, iproute2와 fwmark를 제안하기 위해 @anttir에 props. 나는 그것들을 보지 못했고, 그들 없이는 여전히 벽돌 벽에 머리를 부딪 칠 것입니다!
Steve

답변:


4

따라서 대부분이 위에 있지만 전체 솔루션은 다음과 같습니다.

/ etc / iproute2 / rt_tables를 편집하고 하단에 2 줄을 추가하십시오 :

101 internet
102 vpn

이 표에 더 이해하기 쉬운 다른 이름을 지정할 수 있습니다.

그런 다음 /etc/init.d에 스크립트 (rt_setup이라고 함)를 작성해야합니다.

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

그런 다음 분명히 /etc/rc2.d에서 링크하십시오 (우분투를 사용하면 실행 레벨이 다를 수 있습니다). openvpn 링크보다 높은 S 번호를 부여 하십시오!

스크립트는 여러 가지 작업을 수행합니다. 맨 위 부분은 동적 IP 및 게이트웨이 주소를 선택하는 데 사용되는 일부 perl 및 awk 문으로 변수를 설정합니다. 두 번째 섹션은 ipruote2에서 설정 한 테이블을 정리하고 현재 라우팅 테이블을 복사합니다. 그런 다음 VPN 하나는 VPN을, 인터넷 하나는 내 로컬 네트워크를 통해 두 개의 새로운 경로와 두 개의 기본 게이트웨이를 만듭니다.

다음 두 줄이 필요하다고 확신하지는 않지만 iptables에서 사용하기 위해 ip 전달을 활성화합니다.

다음으로 스크립트는 관련 IP 주소에서 발생하는 트래픽을 찾을 수있는 위치와 트래픽이 구체적으로 표시되어 있는지 확인할 위치에 대한 규칙을 만듭니다.

POSTROUTING 및 PREROUTING은 주소에서 발생하는 트래픽이 회신을 받도록합니다!

마지막 iptables PREROUTING은 트래픽에 태그를 지정하는 부분이며 포트 80 또는 443으로가는 것은 표 2 (VPN)를 사용하도록 표시됩니다

마지막 두 줄은 기본 라우팅 테이블에서 VPN 게이트웨이를 제거하고 로컬 네트워크 게이트웨이를 다시 추가합니다.

그대로, 프로세스는 훌륭하게 작동합니다. 컴퓨터가 시작되면 VPN이 시작되고이 스크립트는 몇 초 후에 실행됩니다 (이 스크립트를 실행하기 전에 VPN이 완전히 초기화되도록 잠자기 명령문을 추가 할 수 있습니다). 내 원격 액세스 연결 (ssh 등)이 훌륭하게 작동합니다. 포트 80 또는 443으로 이동하지 않는 연결은 로컬 연결을 사용하고 있지만 모든 웹 트래픽은 VPN을 통과하고 있으며 ISP에서 설정 한 컨트롤을 무시하고 있습니다!

내 질문에 대한 내 의견에서 말했듯이 @anttir의 제안 없이이 경로를보기 시작하지 않았을 것입니다. 그 제안 뒤에는 http://blog.khax.net/2009/11/28/multi-gateway-routing-with-iptables-and-iproute2/http://linux-ip.net/ 사이트가 있습니다. html / adv-multi-internet.html 은 매우 유용했습니다 (코드가 100 % 완전하지 않은 경우에도)!


1
마지막 sleep 20으로 openvpn 연결이 제 시간에 완료되지 않아 스크립트 상단에 a 를 추가했습니다 . echo 2 > /proc/sys/net/ipv4/conf/tun0/rp_filtertun0에 대한 역방향 패킷 필터를 비활성화해야하기 때문에 스크립트에 추가 했습니다. 소스 주소 S를 사용하여 tun0에서 응답이 되돌아 오면 리버스 패킷 필터는 "패킷을 주소 S로 라우트하고 tun0을 통과하지 않으면 패킷을 삭제합니다"를 확인합니다. 조회에는 유효한 fwmark가 없으며 경로는 일반적인 기본 경로가 될 것이므로 패킷을 삭제합니다.
Steve

나는 당신을 위해 스크립트를 편집해야했습니다. 마지막 줄 route add default gw 192.168.0.1 eth0은 의도 한대로 tun0 대신 로컬 게이트웨이를 통해 포트 80/443 트래픽을 라우팅하는 것처럼 보였습니다. 마지막 줄을 바꾸는 것은 route add default tun0나를 위해 속임수처럼 보입니다.

1

프로토콜 당 라우팅은 다소 복잡합니다. 일반적으로 라우팅 테이블은 대상 IP에 따라 게이트웨이를 확인하고 openvpn 또는 192.168.0.1 기본 게이트웨이를 사용하는 데 사용됩니다.

VPN의 다른 쪽 끝에 Squid http 프록시를 설정하고 프록시를 사용하도록 브라우저를 설정하는 것이 더 쉬울 것입니다.

iptables는 HTTP 연결의 대상 IP를 변경하고 작동하지 않으므로 iptables를 사용하지 않습니다.

기본 라우팅이 VPN 끝점으로 설정된 새 라우팅 테이블 (/ etc / iproute2 / rt_tables)을 만들고 iptables fwmark (-j MARK)를 사용하여 모든 HTTP 패킷을 표시 한 다음 ip 규칙 을 사용하여 사용자 지정 규칙을 만듭니다. 새 라우팅 테이블을 사용하도록 표시된 패키지.


당신의 도움을 주셔서 감사합니다. 나는 분명히 그것들을 살펴볼 것입니다. 서버 쪽을 제어 할 수없고 내 측면 만 있다는 점에서 조금 까다 롭습니다. 또한 연결을 통해 https 트래픽을 라우팅해야하기 때문에 오징어를 사용할 수 없으며 오징어는 잘 작동하지 않습니다.
Steve

VPN을 통해 몇 개의 IP와 VPN 외부의 다른 세계를 라우팅하는 것은 어떻습니까?
Antti Rytsölä

IP를 몇 개만 라우팅한다고 생각했지만 사이트가 이동함에 따라 목록이 변경되므로 PC의 다른 사용자가 쉽게 사용할 수 있도록해야합니다. 새 라우팅 테이블을 설정하고 패킷을 표시하기 시작했습니다. 마킹 패킷은 쉬운 비트였습니다. 그것은 내가 확실하지 않은 라우팅 테이블입니다. VPN을 올바르게 설정하고 다른 것을 올바르게 설정하도록 설정할 수 있지만 기본 설정이 여전히 기본값으로 설정되어 있기 때문에 main으로 무엇을 해야할지 잘 모르겠습니다 (VPN 인 경우). 아직 재생 중 ...
Steve

linux-ip.net/html/adv-multi-internet.html ip rule show 및 ip rule add fwmark 4 표 4 우선 순위 10000
Antti Rytsölä

내가 지금까지의 세부 사항을 원본에 대한 업데이트를 추가했습니다! 아! 내 질문이 아닌 귀하의 답변을 편집했음을 깨달았습니다. 죄송합니다! 이것을 많이 사용하지 않았고 다른 사람의 답변을 편집 할 수 있다는 것을 몰랐습니다!
Steve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.