openwrt ile mwan3 kullanarak domaine göre trafik yönlendirme

mwan3 ile birden fazla wan bağlantısını kurallara göre load balance/failover olarak ayarlayabiliyorsunuz. bu kurallarla ip adreslerine göre yönlendirme yapmak kolay ama domainlere göre kolay değil. bu yazıda openwrt modemimdeki mwan3 setupımda nasıl domaine göre yönlendirme yaptığımı anlatıcam.

Düzeltme: Buraya dnsmasq’ın kendi içinde ipset fonksiyonu olduğunu onu kullanabileceğinizi yazmıştım. Kullanamıyormuşsunuz

Tue Jun 27 13:13:47 2023 daemon.crit dnsmasq[1]: recompile with HAVE_IPSET defined to enable ipset directives at line 38 of /etc/dnsmasq.conf
Tue Jun 27 13:13:47 2023 daemon.crit dnsmasq[1]: FAILED to start up

luci’de de ipset koyma seçeneği var fakat openwrtdeki dnsmasqda ipset yokmuş. ayrıca evet dnsmasq-full yükledim zaten.

Fakat openwrtnin içindeki çalışmadığı için scriptten devamke

—orijinal yazının başlangıcı—

öncelikle ipset ve ipset-dns kurmanız lazım.

ipset işte ip seti ip listesi gibi bişey. ipset diye komutu var

ipset -L derseniz mwan3’ün zaten dahili oluşturduğu bir sürü ipset çıkacaktır karşınıza

ipset -N zartzort ile kendiniz de oluşturaibliyonuz ama mevzu o değil siktir et şimdi

ipset-dns için yapacağınız config: /etc/config/ipset-dns

örnek olarak sallıyom mesela

config ipset-dns
        option ipset 'youtube-ipv4'
        option ipset6 'youtube-ipv6'
        option port '53001'

config ipset-dns
        option ipset 'googlevideo-ipv4'
        option ipset6 'googlevideo-ipv6'
        option port '53002'
....

burda yaptığı şey şu: porttan bir dns serverı açıyor, ve bu porta gelen dns sorgularına cevap olarak verdiği ipv4 ve ipv6 adreslerini belirtilen ipsetlere ekliyor. dns sorgularını hangi dnsden cevaplayacağını belirtme de var da ben onları sildim sanırım nextdns falan kullanıyor yine ama gidip de modemin kendisini göstermeyin resolver olarak, modemin resolverı da ipsete yönlendireceği için kısır döngü oluşur.

ipset-dns’e bir şey eklemenize gerek yok. isterseniz default ipset-dns’i silebilirsiniz ona da gerek yok. boş bırakmayın ama

bu programcığa dns sorgularını yönlendirmek için dnsmasq’a şöyle bişeyler yapabilirsiniz.

no-resolv
bogus-priv
strict-order
server=2a07:a8c1::
server=45.90.30.0
server=2a07:a8c0::
server=45.90.28.0
add-cpe-id=##### nextdns cpe id
server=/youtube.com/127.0.0.1#53001
server=/googlevideo.com/127.0.0.1#53002
server=/tivibu.com/127.0.0.1#53003
server=/tivibu.com.tr/127.0.0.1#53004
server=/speed.hetzner.de/127.0.0.1#53005

işte o domainlere gelenleri o portlardaki dns şeyciklerine yolluyor falan.

dnsmasq’a bir şey eklemenize gerek yok.

bir de son olarak bu ipsetlerin oluşturulması lazım boottan sonra onun için de bitane service koyuyoruz /etc/init.d/manage_ipsets’e şöyle bişi koyun

#!/bin/sh /etc/rc.common

START=98
BOOT=98

start() {
    sleep 5
}

dipnot: sleep 5 bir işe yaramasa da silmeyin kullanılıyor

tabi bunların hepsini ipsetlere domainlere göre düzenlemek lazım dimi? bide her yeni ipset ekledigimizde gidip bunları elle düzenlemekle mi uğraşcaz?

hyr. işte bunların hepsini kendi yapan bir script:

#!/bin/ash
read -p "Enter policy name: " policy
read -p "Enter domain: " domain
echo "Available mwan3 policies:" && uci show mwan3 | grep "=policy" | cut -d'.' -f2 && read -p "Enter mwan3 policy: " mwan_policy

#gerekirse confgleri değştir bazen -opkg oluyor sonunda aptal modem ananın amına koyayım
dnsmasq_conf="/etc/dnsmasq.conf"
ipset_conf="/etc/config/ipset-dns"
manage_ipset_script="/etc/init.d/manage_ipsets"
mwan3_conf="/etc/config/mwan3"


#upstream dns selection
upstream_dns = "1.1.1.1"
read -p "Enter upstream dns(empty for 1.1.1.1): " upstream_dns

if [ -z "$upstream_dns" ]; then
    upstream_dns=1.1.1.1
fi

# Parse last port from /etc/config/ipset-dns
last_port=$(grep "option port" /etc/config/ipset-dns | awk '{print $3}' | tail -n 1 | tr -d "'")
echo "The last port is: $last_port"

# If last_port is empty, default to 53000 (ipset-dns default is 53001 ordan devam etsin işte)
if [ -z "$last_port" ]; then
    last_port=53000
fi

next_port=$((last_port + 1))

echo "Next DNS port is: $next_port"

read -rp "Press Enter to continue if you are sure..."

#Update dnsmasq.conf
echo "server=/$domain/127.0.0.1#$next_port" >> $dnsmasq_conf
/etc/init.d/dnsmasq restart

#Update ipset-dns config
cat <<EOT >> $ipset_conf

config ipset-dns
        option ipset '$policy-ipv4'
        option ipset6 '$policy-ipv6'
        option port '$next_port'
        option dns '$upstream_dns' #upstream dns
EOT
/etc/init.d/ipset-dns restart

#scripte ekle. sleep line'ının üstüne ekle hem de.
sed -i "/^[[:space:]]*sleep/ i\    ipset -N $policy-ipv4 iphash" $manage_ipset_script
sed -i "/^[[:space:]]*sleep/ i\    ipset -N $policy-ipv6 iphash" $manage_ipset_script

#kontrol amacli scripti yazdir
cat $manage_ipset_script

#script bootta ipset acmak icin bize simdi de lazim o yuzden simdi de calistir
ipset -N $policy-ipv4 iphash
ipset -N $policy-ipv6 iphash

echo "Updating mwan3 config and restarting..."
{
    echo "config rule '${policy}_v6'"
    echo "        option family 'ipv6'"
    echo "        option ipset '${policy}-ipv6'"
    echo "        option proto 'all'"
    echo "        option sticky '0'"
    echo "        option use_policy '$mwan_policy'"
    echo
    echo "config rule '${policy}'"
    echo "        option family 'ipv4'"
    echo "        option ipset '${policy}-ipv4'"
    echo "        option proto 'all'"
    echo "        option sticky '0'"
    echo "        option use_policy '$mwan_policy'"
    echo
    echo # silme ananı sikerim
    cat "$mwan3_conf"
} > "$mwan3_conf.tmp"
mv "$mwan3_conf.tmp" "$mwan3_conf"
/etc/init.d/mwan3 restart

read -rp "Press Enter to perform a manual dig"
#nslookup + dig sonra print et bakarım ben
echo dig ve nslookup yukenicek
opkg update
opkg install bind-tools
echo IP Addresses for the Domain are:
nslookup $domain | awk '/^Address: / { print $2 }'
dig $domain AAAA +short
sleep 3
echo IPSets:
ipset -L $policy-ipv4
ipset -L $policy-ipv6
echo Check for yourself if the IP addresses are in the ipset. if no, skill issue :DDDDDD

tabi çalışması için bu dediğim default dosyaları falan koymanız lazım mwan3 nin zaten kurulmuş olması lazım vesaire…

Script last update: 04/07/2023

—orijinal yazının sonu—

Eski dipnot: dnsmasq’ın kendi içinde –ipset fonksiyonu var, ama openwrt’nin dnsmasqında default oalrak yokmuş o yüzden ben bunların hepsini yaparken görmemiştim, buraya ekleyeyim. çok daha basit bir şekilde ipset ve dnsmasq-full yükledikten sonra confige “ipset=/example.com/ipsetadı” koyarak bu sayfanın devamındaki soytarılıktan kurtulabilirsiniz. ipsetleri falan da kendi bootta oluşturuyor yoksa, service a da gerek yok. şöyle diyorlar dnsmasq reposunda:

Services like YouTube and Netflix use tons of ranges of IP addresses
that fluctuate wildly and aren't predictable. However, they're always
from a given subdomain using DNS, like *.c.youtube.com. I'd like to
have firewall rules for these IP addresses -- route them over this
interface, that interface, rate limit them like this, or that, etc. An
efficient way to do this is by adding IP addresses to a netfilter
ipset and using iptables' ipset match support. With services that use
lots of IPs spread out over ranges but instead use DNS, the only way
to do this is to have the DNS forwarder add the resolved IPs to an
ipset before returning the IP to the client.

This series of patches adds an --ipset option to dnsmasq which adds
resolved ips for specified domains to a given list of ipsets using the
netlink on newer kernels and setsockopt on older kernels.

    --ipset=/google.com/yahoo.com/search,vpn

That option will add all resolved IPs for Google and Yahoo domains and
subdomains to two ipsets -- "search" and "vpn". (Sub)-domain matching is
conducted in the same way as with --address.

    --ipset=resolved
    --ipset=/#/resolved

These two options are identical. They each add all resolved domains to
the "resolved" ipset.

FAKAT GEL GÖR Kİ OPENWRTDEKİ RANDOM 180 KİLO NERD BİR OROSPU EVLADI DEMİŞ Kİ BİZ DNSMASQ-FULL’A DA IPSET KOYMAYALIM ÖBÜRÜNE DE KOYMAYALIM LUCIDE BÖLÜMÜ OLSUN AMA KENDİN IPSETİ KOYUP DA PAKET DERLEMEZSEN ÇALIŞMASIN PUH ANANIZIN AMINI SİKEYİM SİZİN