Bu nedenle yapılandırmanızda, başlangıçta ağa göndermeye çalıştığınız tüm paketler 10.0.0.1
( tun0
arayüzden geçtikleri ve yerel adresleri olduğu için 10.0.0.1
). Paketleri yakalarsınız, şimdiye kadar her şey yolunda.
Şimdi, tun0
paketleri daha da gönderir. Kaynak adres olduğu 10.0.0.1
ve paketlerin (farklı arayüz aracılığıyla bırakmak istiyorum wlp2s0
senin 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, tcpdump
için wlp2s0
fark edebilir paketlerin kaynak adresi ile ayrılmak 10.0.0.1
değ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 FORWARD
zincirinizin ACCEPT
politikaya 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 tun0
arayüzden arayüze taşıyor wlp2s0
. netfilter kaynak IP değişmelidir 10.0.0.1
sizin 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), wlp2s0
atanan 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 OUTPUT
zincirden geçip daha sonra yönlendirilmesinden ve PREROUTING
zincire 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 FORWARD
zincir gitmediğini görebiliyorum (ve nat/POSTROUTING
aslı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.c
uygulamadaki 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.c
kaynak 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.c
baş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 - tun0
yalnı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
SNAT
Paket erişim tun0
arayü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.c
kodu, 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/POSTROUTING
zincire 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 SNAT
ancak yalnızca giden paketleri yakalamak edeceğiz:
Önce devre dışı gerekir filtreleme ters yol için tun0
baş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.
-j SNAT
değil-s SNAT