Turkcell/Superonline’ın Wireguard bant sınırlaması çözümü

SON GÜNCELLEME: Hem Turkcell/Superonline, Hem de Türk Telekom/TTNet şimdilik geri adım atmış gibi görünüyor. Wireguard protokolüne tamamen uyguladıkları bant sınırlaması şimdilik kalktı ve bağlantılar normale döndü. Tabi ki her an her şeyin olabildiği ülkemizde bu durum ne zamana kadar geçerli olacak bilmediğimiz için bu gönderi referans olarak durmaya devam edecek.


GÜNCELLEME: Türk Telekom/TTNet de Nisan 2021‘den itibaren Wireguard bant sınırlamasına başladı. Anlaşılan ülkede “nasıl çalıştığını anlamadığımız her şeyi engelleyelim” mantığı artarak devam edecek. Yakında Çin bize gıptayla bakmaya başlayacak gibi görünüyor.

Turkcell/Superonline, Mart 2021‘de tüm Wireguard protokolüne bant sınırlaması getirdi. Sınırlamanın nedeni olarak 5651 sayılı kanunun 6. maddesinin (ç) bendini bahane ettikleri söyleniyor. Bu bent o kadar ucu açık yazılmış ki, Avrupa İnsan Hakları Sözleşmesi’nin 10. maddesine göre sahip olmamız gereken iletişim özgürlüğünün gasp edilmesi anlamına geliyor ama bu ayrı mesele. Büyük ihtimal ticari VPN servislerinin Wireguard protokolünü kullanmasının artmasıyla, sadece bu servisleri engellemeye çalışmak yerine, nasıl olsa kimse bizimle uğraşamaz diyerek bu teknolojiyi tümden engellemeye karar verdiler. İnsanların kendi işlerinin güvenliği için de Wireguard kullanmak istemesi umurlarında değil, altyapılarını tonlarca para dökerek kullanmaya elimizin mahkum olduğunun farkındalar. Protokolü tamamen engellemedikleri için, sunucunuza bağlanabildiğinizi düşünebilirsiniz, fakat çok ciddi paket kayıpları nedeniyle aslında bağlantınızı tamamen boğarak hiçbir şekilde iş yapamamanızı amaçlıyorlar.

Bu sınırlamaya çözüm olarak yapabileceğiniz tek şey, Wireguard paketlerini bir TCP tüneli içine alarak Turkcell/Superonline’ın sansür mekanizmasından gizlemektir. Bunu yaparken de, minimum overhead, maksimum performans ve sunucuya minimum yük getirmesi amacıyla basit xor şifrelemesine sahip bir tünel içerisinden geçirmeniz en doğrusu olacaktır. Wireguard halihazırda şifreli olduğu için bir güvenlik zaafiyeti oluşmayacaktır. Sınırlama tüm UDP trafiği üzerinde çalıştığı için port değiştirmek vb. denemeleriniz çözümsüz kalacaktır.

Çözümün çalışabilmesi için hem istemci tarafında hem de sunucu tarafında size ait bir linux ağ geçidi bulunması gereklidir. İstemci tarafında ağ geçidiniz yoksa, düşük maliyetli bir Raspberry Pi 4 üzerine Wireguard kurarak bu çözümü kullanabilirsiniz. Bu noktadan sonra vereceğim adımlar, hem istemci, hem de sunucu tarafında systemd altyapısıyla çalışan (Debian/Ubuntu vb.) bir Linux sürümü üzerinde, konfigürasyonu tamamlanmış bir Wireguard kurulumunuz olduğu varsayımıyla devam edecektir:

  • Bu bağlantıdan udp2raw adlı uygulamanın binary arşivini indirin. Tar.gz dosyasını açtıktan sonra farklı mimariler için binary’ler olduğunu göreceksiniz. Hem sunucunuza hem de istemcinize uygun binary’leri, ilgili cihazda /usr/local/bin/ dizini altına udp2raw ismiyle kopyalayın veya linkleyin.
  • Sunucunuzda /etc/udp2raw.conf dosyasını oluşturun ve içine aşağıdaki bilgileri girin. Burada kendi konfigürasyonunuza uygun olarak doğru bilgilerle düzenlemeniz gereken alanlar: TCP_PORT sunucunuzun dinleyeceği boş bir TCP portu, WIREGUARD_PORT sunucunuzun halihazırda dinlediği Wireguard portu ve PASSWORD oluşturacağınız uzun alfanumerik bir şifre.
-s
# Local
-l 0.0.0.0:TCP_PORT
# Remote
-r 127.0.0.1:WIREGUARD_PORT
# Key
-k PASSWORD
--auth-mode hmac_sha1
--raw-mode faketcp
-a
--fix-gro
--cipher-mode xor
  • İstemci ağ geçidinizde yine /etc/udp2raw.conf dosyasını oluşturun ve aşağıdaki bilgileri girin. Burada da düzenlemeniz gereken alanlar: LOCAL_PORT ağ geçidinizin dinleyeceği UDP portu, SERVER_IP sunucu IP adresiniz, SERVER_TCP_PORT yukarıda sunucu için girdiğiniz TCP portu ve PASSWORD yine yukarıda girdiğiniz aynı alfanumerik şifre.
-c
# Local
-l 0.0.0.0:LOCAL_PORT
# Remote
-r SERVER_IP:SERVER_TCP_PORT
# Key
-k PASSWORD
--auth-mode hmac_sha1
--raw-mode faketcp
-a
--fix-gro
--cipher-mode xor
  • Hem sunucuda hem de istemcide /etc/systemd/system/udp2raw.service dosyasını oluşturarak içine aşağıdaki bilgileri girin:
[Unit]
Description=udp2raw service
ConditionFileIsExecutable=/usr/local/bin/udp2raw
ConditionPathExists=/etc/udp2raw.conf
After=network.target
[Service]
Type=simple
User=root
Group=root
#LimitNOFILE=32768
PIDFile=/run/udp2raw.pid
AmbientCapabilities=CAP_NET_RAW CAP_NET_ADMIN
ExecStart=/usr/local/bin/udp2raw --conf-file /etc/udp2raw.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
  • Her iki cihazda da şu komutları çalıştırın:
    systemctl enable udp2raw.service
    systemctl start udp2raw.service
  • Eğer doğru binary’leri kullandıysanız, şu anda udp2raw konfigürasyonunuz tamamlanmış demektir. Yapmanız gereken son şey, istemci ağ geçidinizin Wireguard konfigürasyonunda sunucu bilgisi olarak yine istemci ağ cihazınızın udp2raw konfigürasyonunda yazdığınız LOCAL_PORT bilgisini girmek ve MTU değerini 1280 olarak ayarlamaktır. Yani aşağıdakine benzer bir değişiklik yapmanız gerekiyor:
Endpoint = 127.0.0.1:LOCAL_PORT
MTU = 1280

Ayrıca iOS ve Android üzerinde Wireguard uygulamasını kullanıyorsanız, o uygulamanın konfigürasyonunu da istemci ağ geçidinizin dinlediği udp2raw portuna yönlendirerek o cihazlarınızı da aynı TCP tüneli içinden bağlayabilirsiniz.

Tüm bu değişiklikleri yaptığınızda çok düşük bir performans kaybı ile Wireguard sunucunuza ulaşabilmeye devam edeceksiniz. Bu çözümü de engellemeye başlaması durumunda Turkcell/Superonline’a topluca bir dava açmamızın gerekli olacağını düşünüyorum.

Leave a Comment

Your email address will not be published. Required fields are marked *