Linux'ta Bir Arayüzden Tüm Trafiği Nasıl Yapabilirsiniz


12

Ben var kendinden yazılı arayüz tun0 ( TUN / TAP bazlı), aldığı neyi çıkışları söyledi.
Bu arayüzden akabilmek için sistemin tüm trafiğine ihtiyacım var.
Arayüzün rolü:

  1. Sansürlenmesi muhtemel paketleri bulmak ve tünellemek.
  2. Diğer tüm trafiği el değmeden geçirin.

Tahmin edeceğiniz gibi, bir sansür aracı oluşturmaya çalışıyorum.
Tünel oluşturma ile ilgili karar tun0 işlemi içinde alınmalıdır
çünkü sadece orada güvenilir DNS kullanabiliriz.

Kendi kendine yazılan bir arayüz tun0 üzerinden tüm trafik akışını nasıl yapacağımı göstermek için yardımınıza ihtiyacım var. Tun0 değişikliklere ihtiyaç duyarsa, sizden bu değişiklikleri sağlamanızı istiyorum.

Aşağıda tüm trafiği tun0'dan geçmeye çalıştım ve başarısız oldum (pingler başarısız oldu).

Derleme

  1. gcc tun0.c
  2. sudo ./a.out

yapılandırma

  1. sudo ip addr add 10.0.0.1/24 dev tun0
  2. tablo oluştur John

    $ cat /etc/iproute2/rt_tables 
    #
    # reserved values
    #
    255     local
    254     main
    253     default
    0       unspec
    #
    # local
    #
    #1      inr.ruhep
    
    200 John
    

Sipariş önemlidir:

  1. sudo ip rule add from all lookup John
  2. sudo ip route add default dev tun0 table John
  3. sudo ip rule add iif tun0 lookup main priority 500

    $ ip rule
    0:      from all lookup local 
    500:    from all iif tun0 lookup main 
    32765:  from all lookup John 
    32766:  from all lookup main 
    35000:  from all lookup default 
    

Sorun giderme

  1. sudo tcpdump -i wlp2s0 -qtln icmpve daha sonra ping -I tun0 8.8.8.8hiçbir paketin yakalanmadığını gösterir, bu, iif tun0 lookup mainkural yoluyla tun0'dan wlp2s0'a hiçbir paket aktarılmadığı anlamına gelir .

  2. Ben yerini zaman tun0ile loher yerde o zaman benim için çalıştı.

Ayrıca Denendi

  1. , Ters yol filtreleme kapatma rp_filter=0içinde/etc/sysctl.conf

Yanıt Sorunlarını Giderme

iptables -I FORWARD -j LOG --log-prefix "filter/FORWARD " 
iptables -t nat -I OUTPUT -j LOG --log-prefix "nat/OUTPUT " 
iptables -t nat -I PREROUTING -j LOG --log-prefix "nat/PREROUTING " 
iptables -t nat -I POSTROUTING -j LOG --log-prefix "nat/POSTROUTNG "
tail -f /var/log/syslog

Yanıttan değiştirilmiş kaynaklar da burada .

Yanıtlar:


10

Bu nedenle yapılandırmanızda, başlangıçta ağa göndermeye çalıştığınız tüm paketler 10.0.0.1( tun0arayüzden geçtikleri ve yerel adresleri olduğu için 10.0.0.1). Paketleri yakalarsınız, şimdiye kadar her şey yolunda.
Şimdi, tun0paketleri daha da gönderir. Kaynak adres olduğu 10.0.0.1ve paketlerin (farklı arayüz aracılığıyla bırakmak istiyorum wlp2s0senin durumunda). Yani ediyor yönlendirme ilk yönlendirme etkinleştir izin böylece:

sysctl -w net.ipv4.ip_forward=1

Eğer bakacağız eğer Bundan sonra, tcpdumpiçin wlp2s0fark edebilir paketlerin kaynak adresi ile ayrılmak 10.0.0.1değil, wlan arabiriminin kaynak adresi ile (sanırım ne beklenir). Bu yüzden kaynak adresini değiştirmemiz gerekiyor ve buna kaynak NAT deniyor . Linux'ta netfilter / iptables yardımıyla kolaydır :

iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.1 -j MASQUERADE

Lütfen FORWARDzincirinizin ACCEPTpolitikaya sahip olup olmadığını veya aşağıdaki gibi bir şeyle yönlendirmeye izin vermeniz gerekip gerekmediğini kontrol edin :

iptables -A FORWARD -i tun0 -o wlp2s0 -s 10.0.0.1 -j ACCEPT
iptables -A FORWARD -i wlp2s0 -o tun0 -d 10.0.0.1 -j ACCEPT

Her şey şimdi çalışmalı: Linux çekirdeği yönlendirmeyi yapıyor, paketleri tun0arayüzden arayüze taşıyor wlp2s0. netfilter kaynak IP değişmelidir 10.0.0.1sizin için wlp2s0çıkış paketleri için arayüz atanan adrese. Tüm bağlantıları ezberler ve yanıt paketleri geri döndüğünde (eğer varsa), wlp2s0atanan arabirimin hedef adresini 10.0.0.1("bağlantı" özelliği) olarak değiştirir.
Peki, olmalı ama değil. Görünüşe göre, netfilter bu karmaşık yönlendirme konfigürasyonu ve aynı paketin önce OUTPUTzincirden geçip daha sonra yönlendirilmesinden ve PREROUTINGzincire gelmesi ile karıştırılıyor . En azından Debian 8 kutusuyla çalışmıyor.
Gidermek için en iyi yolu netfilter olan TRACEözellik:

modprobe ipt_LOG
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE

Yalnızca ICMP paketleri için izlemeyi etkinleştiriyorum, hata ayıklamak için başka bir filtre kullanabilirsiniz.
Paketin hangi tablo ve zincirlerden geçtiğini gösterecektir. Ve paketin daha fazla FORWARDzincir gitmediğini görebiliyorum (ve nat/POSTROUTINGaslında zincir tarafından yakalanmıyor SNAT).
Aşağıda bu çalışmayı gerçekleştirmek için çeşitli yaklaşımlar bulunmaktadır.

YAKLAŞIM # 1

Netfilter'ı karıştırmanın en iyi yolu , tun0.cuygulamadaki paketlerin kaynak IP adresini değiştirmektir . Aynı zamanda en doğal yol. Biz gerek 10.0.0.2 için 10.0.0.1 değiştirmek yolu dışa açık ve 10.0.0.1 'ya 10.0.0.2 yolu arkasında.
Ben modifiye ettik tun0.ckaynak adresi değişikliği koduyla. İşte yeni dosya ve burada sizin için patchfiletun0.c . IP üstbilgisindeki değişiklikler de sağlama toplamı düzeltmesini içerir , bu yüzden OpenVPN projesinden bazı kodlar aldım . Temiz bir yeniden başlatma ve tun0_changeip.cbaşlattıktan sonra yürüttüğüm komutların tam listesi :

ifconfig tun0 inet 10.0.0.1/30 up
sysctl -w net.ipv4.ip_forward=1
ip route add default dev tun0 table John
ip rule add from all lookup John
ip rule add from 10.0.0.2 lookup main priority 500
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.2 -j MASQUERADE

Bu durumda ters yol filtresini kapatmanız gerekmediğini lütfen unutmayın , çünkü her şey yasaldır - tun0yalnızca alt ağına ait paketleri alır ve gönderir. Ayrıca, arayüz tabanlı yerine kaynak tabanlı bir yönlendirme de yapabilirsiniz.

YAKLAŞIM # 2

SNATPaket erişim tun0arayüzünden önce yapmak mümkündür . Yine de çok doğru değil. Bu durumda kesinlikle ters yol filtresini kapatmanız gerekecektir :

sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0

Şimdi yapın SNAT: iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT - to-source ip.address.of.your.wlan.interface

Burada paketler cihaza ulaşmadan hemen önce kaynak adresini değiştiriyoruz tun0. tun0.ckodu, bu paketleri "olduğu gibi" (yeniden değiştirilmiş kaynak adresiyle) yeniden gönderir ve başarıyla wlan arabirimi üzerinden yönlendirilir. Ancak wlan arabiriminde dinamik bir IP'niz olabilir ve kullanmak isteyebilirsiniz MASQUERADE(arabirim adresini açıkça belirtmemek için). Şunlardan nasıl faydalanabilirsiniz MASQUERADE:

iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source 10.0.55.1
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.55.1 -j MASQUERADE

Lütfen " 10.0.55.1" IP adresini not edin - farklı. Burada herhangi bir IP kullanabilirsiniz, önemli değil. Kaynak IP'sini daha önce değiştirirsek paketler arabirimde nat/POSTROUTINGzincire ulaşır wlp2s0. Ve şimdi wlan arabirimi için statik bir IP'ye bağlı değil.

YAKLAŞIM # 3

Ayrıca kullanabilirsiniz fwmark. Bu yolla gerekmez SNATancak yalnızca giden paketleri yakalamak edeceğiz:
Önce devre dışı gerekir filtreleme ters yol için tun0başka bir ağa ait paketleri yönlendireceğinden:

sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0

Now let's alter the routing rules a bit:
# Delete old rules
ip rule del iif tun0 lookup main
ip rule del from all lookup John

# Packets will start going from wlan interface so they will have source address of it
iptables -t mangle -A OUTPUT -o wlp2s0 -j MARK --set-mark 1
ip rule add fwmark 0x1 lookup John

Bu , Debian 8 kutumda çalışan yönlendirme ve netfilter için başka bir "hack" , ancak yine de daha doğal ve herhangi bir hack kullanmadığı için ilk yaklaşımı almanızı öneririm.


Uygulamanızı şeffaf bir proxy olarak oluşturmayı da düşünebilirsiniz . Tun cihazından paketleri analiz etmek yerine çok daha kolay olacağını düşünüyorum.


Ben kullanmak zorunda -j SNATdeğil-s SNAT
ilyaigpetrov

Çalışıyor ama performans çok aralıklı (10 saniye durabilir ve çalışmaya devam edebilir). Neden olduğunu ve bunu nasıl çözeceğimizi anlayacağım.
ilyaigpetrov

1
Üzgünüm, bu benim yazım hatasıydı. Cevabıma başka bir yaklaşım ekledim. Performans sorunu hakkında hiçbir fikriniz yok. Bu arada, trafiği filtrelemek ve yönlendirmek için neden iptables DNAT ile şeffaf bir proxy kullanmıyorsunuz?
tifssoft

Mark yaklaşımınızı yeniden üretemiyorum, sadece sudo ip rule add iif tun0 lookup main priority 500ona ekledim ama yine de işe yaramadı. Bu yaklaşımı seviyorum, onu üretememem üzücü.
ilyaigpetrov

1
Yeni yaklaşımınız için teşekkür ederim, adım adım takip ettim ve mükemmel çalıştı. Yine de ips'i neden değiştirmemiz gerektiğini anlamıyorum, en önemlisi işe yarıyor. TCP proxy ile planlarımın başarısız olması durumunda cevabınıza geri dönebilirim. Burada çok fazla ağ becerisi gösterdiniz ve becerilerinizin göz ardı edileceğinden şüphem yok. İyi şanslar!
ilyaigpetrov
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.