OpenVPN poliçe tabanlı yönlendirme düzgün çalışmıyor


0

ArchIinux’ta PrivateInternetAccess’le bir OpenVPN istemcisi kurmaya çalışıyorum. Varsayılan olarak PIA böyle rotaları iter. herşey trafik VPN'den geçer. Sadece istiyorum bazı VPN kullanmak için uygulamaları

Bunu yapmak için, "politika bazlı yönlendirme" kullanıyorum. "Vpn" adlı yeni bir yönlendirme tablosu oluşturdum ve seçmeli olarak kullanıcıları bu yönlendirme tablosuna gönderir.

Bu komutlardan sonra, "ortam" kullanıcısı "vpn" yönlendirme tablosuna yönlendirilir:

$ echo 100 vpn >> /etc/iproute2/rt_tables
$ iptables -t mangle -I OUTPUT -m owner --uid-owner media -j MARK --set-mark 0x1
$ ip rule add fwmark 0x1 table vpn

OpenVPN istemcisi yapılandırmamı, yönlendirme tablolarımın doğru şekilde yerleştirilmesini sağlayacak şekilde değiştirdim:

$ cat /etc/openvpn/client.conf
    client
    dev tun
    proto udp
    remote us-newyorkcity.privateinternetaccess.com 1194
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca /etc/openvpn/ca.crt
    tls-client
    remote-cert-tls server
    auth-user-pass /etc/openvpn/login.conf
    comp-lzo
    verb 1
    reneg-sec 0
    crl-verify /etc/openvpn/crl.pem

    # This will override PIA so that traffic will route through our normal gateway
    route 0.0.0.0 192.0.0.0 net_gateway
    route 64.0.0.0 192.0.0.0 net_gateway
    route 128.0.0.0 192.0.0.0 net_gateway
    route 192.0.0.0 192.0.0.0 net_gateway

    # Calling these scripts will add the PIA routes to the vpn table
    script-security 2
    up /etc/openvpn/up.sh
    down /etc/openvpn/down.sh

$ cat /etc/openvpn/up.sh
    #!/bin/sh
    ip route add table vpn default via $ifconfig_remote

$ cat /etc/openvpn/down.sh
    #!/bin/sh
    ip route flush table vpn

İşte çalıştırdıktan sonra yönlendirme tablolarım openvpn /etc/openvpn/client.conf:

$ ip route show table main
    0.0.0.0/2 via 192.168.1.1 dev eth0
    0.0.0.0/1 via 10.197.1.5 dev tun0
    default via 192.168.1.1 dev eth0  src 192.168.1.124  metric 202
    10.197.1.1 via 10.197.1.5 dev tun0
    10.197.1.5 dev tun0  proto kernel  scope link  src 10.197.1.6
    64.0.0.0/2 via 192.168.1.1 dev eth0
    128.0.0.0/2 via 192.168.1.1 dev eth0
    128.0.0.0/1 via 10.197.1.5 dev tun0
    192.0.0.0/2 via 192.168.1.1 dev eth0
    192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.124  metric 202
    209.95.50.86 via 192.168.1.1 dev eth0

$ ip route show table vpn
    default via 10.197.1.5 dev tun0

İşler normalde "vpn" tablosuna yönlendirilemeyen bir kullanıcı olarak çalışır:

$ whoami
    jordan

$ ping -c 2 8.8.8.8
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=46 time=38.9 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=39.0 ms

    --- 8.8.8.8 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 38.952/38.999/39.047/0.203 ms

Ancak, DOES "vpn" tablosuna yönlendirilen bir kullanıcı için işler başarısız oluyor:

$ whoami
media

$ ping -c 2 8.8.8.8
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

    --- 8.8.8.8 ping statistics ---
    2 packets transmitted, 0 received, 100% packet loss, time 999ms

Bir baktım tcpdump -i tun0 neler olduğunu görmek için. İcmp isteği tun0 üzerinden çıkıyor, fakat geri gelmiyor ?

$ tcpdump -i tun0
    listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
    15:37:30.134399 IP keep > google-public-dns-a.google.com: ICMP echo request, id 10256, seq 1, length 64
    15:37:31.143217 IP keep > google-public-dns-a.google.com: ICMP echo request, id 10256, seq 2, length 64

Düşünceler? :(

==== EDIT # 1 ====

Akıl sağlığı kontrolü olarak, eğer gönderirsek herşey VPN üzerinden trafik (/etc/openvpn/client.conf içindeki "route x.x.x.x 192.0.0.0 net_gateway" satırlarını kaldırarak), icmp yanıtlarını hemen alırız:

$ tcpdump -i tun0
    listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
    16:26:54.401732 IP keep > google-public-dns-a.google.com: ICMP echo request, id 10480, seq 1, length 64
    16:26:54.483122 IP google-public-dns-a.google.com > keep: ICMP echo reply, id 10480, seq 1, length 64
    16:26:55.403465 IP keep > google-public-dns-a.google.com: ICMP echo request, id 10480, seq 2, length 64
    16:26:55.485068 IP google-public-dns-a.google.com > keep: ICMP echo reply, id 10480, seq 2, length 64

==== EDIT # 2 ====

MariusMatutiae’nin tavsiyesine uyarak, --route-noexec Elle rotaları kendim ayarlamak için bayrak /etc/openvpn/up.sh. Ayrıca, içinde ters yol filtrelemeyi devre dışı bıraktık. /etc/openvpn/up.sh ve yeniden etkinleştir /etc/openvpn/down.sh:

$ cat /etc/openvpn/up.sh
    #!/bin/sh
    ip route add table vpn 0.0.0.0/1 via $ifconfig_remote
    ip route add table vpn 128.0.0.0/1 via $ifconfig_remote
    ip route add table vpn $route_network_1 via $ifconfig_remote
    ip route add table vpn $trusted_ip via $route_net_gateway

    ip route add table vpn $ifconfig_remote dev tun0 proto kernel src $ifconfig_local
    ip route add table vpn 192.168.1.0/24 dev eth0 proto kernel src 192.168.1.124 metric 202

    ip route del table main $ifconfig_remote

    # Disable reverse path filtering
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
            echo 0 > $f;
    done

$ cat /etc/openvpn/down.sh
    #!/bin/sh
    ip route flush table vpn

    # Re-enable reverse path filtering
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
            echo 1 > $f;
    done

Daha sonra, yönlendirme tablolarım şöyle görünür:

$ ip route show table main
    default via 192.168.1.1 dev eth0  src 192.168.1.124  metric 202
    192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.124  metric 202

$ ip route show table vpn
    0.0.0.0/1 via 10.173.1.5 dev tun0
    10.173.1.1 via 10.173.1.5 dev tun0
    10.173.1.5 dev tun0  proto kernel  scope link  src 10.173.1.6
    128.0.0.0/1 via 10.173.1.5 dev tun0
    192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.124  metric 202
    209.95.50.133 via 192.168.1.1 dev eth0

Ancak, kullanıcı "medya" hala yapamıyor ping 8.8.8.8. tcpdump -i tun0 yine de hiçbir yanıtın geri gelmediğini bildiriyor :(


Çekirdekte ters yol filtrelemeyi engellemeniz gerekir: bu satırı ekleyin for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done senin için up.sh dosya ve for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done senin için down.sh dosya.
MariusMatutiae

Hey MariusMatutiae, yardımların için teşekkür ederim! Önerinizle "Düzenle # 2" güncellendi. Ben de doğruladım rp_filter ile doğru bir şekilde ayarlandı for f in /proc/sys/net/ipv4/conf/*/rp_filter; do cat $f; done koşular arasında. Bu değişikliklere rağmen, kullanıcı "medya" hala yapamıyor ping 8.8.8.8 :(
user1161657

Tüm trafik VPN üzerinden yönlendirildiğinde her şeyin işe yaraması bana garip geliyor. Yalnızca bazı kullanıcıları farklı bir yönlendirme tablosuna gönderdiğimde işler garipleşiyor.
user1161657

Tam olarak sahip olduğunuz kombinasyonu denedim, bu benim için mükemmel çalışıyor. rp_filter devre dışı, tek kullanıcı modunda denedim dışında. Örneğin, kullanarak ping -I tun0 8.8.8.8veya ssh -b 10.197.1.6 me@remoteserver. Bunu sisteminizden kontrol edebilir misiniz?
MariusMatutiae

Hey MariusMatutiae, test ettim ping -I tun0 8.8.8.8 "Edit # 2" 'den tüm konfigürasyon ile kullanıcı "jordan" olarak. İşe yarıyor ama değil trafiği geçmek tun0 göre tcpdump -i tun0...
user1161657

Yanıtlar:


1

İki yönlendirme tablonuzun üzerinden rotalarınızı yanlış bölümlediniz. Aşağıdaki rotalarda görünen main masa, ait vpn tablosu:

0.0.0.0/1 via 10.197.1.5 dev tun0
128.0.0.0/1 via 10.197.1.5 dev tun0
10.197.1.1 via 10.197.1.5 dev tun0     
10.197.1.5 dev tun0  proto kernel  scope link  src 10.197.1.6
209.95.50.86 via 192.168.1.1 dev eth0

Aşağıdaki rota her iki tabloya aittir:

192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.124  metric 202

Bunun nedeni şudur: ilk dört kural arayüzü içerir tun0, OpenVPN’in getirdiği sanal bir NIC’le açıkça ilgisi yok. main tablo. Beşinci kural, çekirdeğinize PIA sunucunuza nasıl ulaşacağınızı öğretir. Son kural, her iki tablonun yerel parçalara, yazıcılar, NAS vb. Şeylere erişmesine izin verir.

Bunu otomatik olarak nasıl ayarlayacağınızla ilgili olarak, OpenVPN sunucunuzun size bir tun0 Her seferinde farklılık gösteren IP adresi: sunucuyu kontrol etmediğiniz için, sunucunuzu atamak üzere yapılandıramayabilirsiniz. tun0 statik bir adres.

Öyleyse yapmanız gereken, ilk önce seçeneği kullanmayı öğrenmek. --route-no-exec. Kullanım kılavuzu devletler:

--route-no-exec

Otomatik olarak rota eklemeyin veya kaldırmayın. Bunun yerine, çevresel değişkenleri kullanarak --route-up betiğine rotaları iletin.

O zaman nasıl kullanılacağını öğrenmelisin Çevresel değişkenler (yukarıda belirtilen Kılavuzun sonunda bir bölüm var), özellikle ifconfig-- şey.

Ayrıca, çekirdek tarafından ters yol filtrelemeyi devre dışı bırakmanın gerekli olduğunu göreceksiniz,

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done

Bu emri senin yerine koyardım up senaryo ve tersi

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done

senin içinde down senaryo. Bu gereklidir, çünkü ana masada varsayılan bir ağ geçidi vardır, bu da çekirdek bazı sahtekarlık olup olmadığını kontrol ettiğinde, herhangi paket işaretlendi.

Alternatif olarak ve daha kolay bir şekilde, iki tablonun rolünü değiştirmeyi düşünebilirsiniz: OpenVPN'in işini otomatik olarak yapmasına izin verin ve main yönlendirme tablosu ve adı verilen yeni bir yönlendirme tablosu non-vpn normal yapılandırmanıza sahip olan

# ip route show
  default via 192.168.0.1 dev eth0  proto static 
  192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.74  metric 1 

(veya bunun gibi bir şey) paketler için değil yukarıdaki MARK ile eşleştirme. Kurulumu çok daha kolaydır.


Yardım için teşekkürler! Önerinizi aldım ve kullandım --route-noexec bölgemdeki rotaları el ile güncellemek için bayrak up.sh dosya. Ancak, hala yapamıyorum ping 8.8.8.8 -den media kullanıcı. Gönderiyi daha fazla bilgi ile güncelleyeceğim.
user1161657

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.