VPN Nedir? Dünyada Network Filtrelemesi 101

Bu yazımda VPN konusuna teknik anlamda çok detaylı şekilde girmeyeceğim (o yüzden her teknik detayı ideal doğru haliyle anlatmayacağım), ama umarım teknik olmayan kullanıcıların VPN‘in ne olduğu ve dünyada ne şekilde kullanıldığı hakkında fikir oluşmasına yardımcı olur.

Öncelikle VPN ne değildir?

VPN aslında sadece Twitter, Facebook vs. bloklamasını geçmek için geliştirilmiş bir sistem değildir.

Peki ne amaçla tasarlanmıştır?

Bu sistemin temel amacı güvenli olması gereken bir ağa giren kullanıcıların, herhangi güvensiz bir internet bağlantısı (mesela otel odası) üzerinden güvenli bir şekilde ulaşmalarını sağlamaktır. Yani diyelim ki iş yeriniz İstanbul’da, şirketinizdeki tüm sunuculara ofisinizden fiziksel kablolama ile erişiyorsunuz. Peki yurtdışına çıkarsanız, laptopunuz ile tıpkı ofisinizdeki gibi, şirketinizin yerel ağında (tabii internet bağlantı hızları limitiyle) olmak istemez misiniz? Böyle bir teknoloji var, ve adı da VPN!

VPN neden esas amacı dışında da kullanılmaya başlandı?

En başta bazı servislerin: sadece Amerikan Kredi kartı olacak, Amerika IP bloğu dışında bağlantı olmayacak diyenlerin (eskiden Netflix) gönlünü hoş etmek için kullananlar olsa da, dünyada (internet bağlantılarının filtrelendiği bazı ülkelerde) esas popülerliğini Facebook, Twitter vs. bloklanmasını geçmek için kazanmıştır.

VPN Nasıl çalışır?

Kullandığınız bilgisayara, kullanacağınız VPN servisine özel bir yazılım yüklersiniz. Bu yazılım bilgisayarınızdaki tüm network bağlantılarının arasına girer, ve mesajları bilgisayarınızda çalışan VPN yazılımının standartları ile şifreleyerek, bağlı olduğu sunucuya internet üzerinden aktarır. Yani aradaki mesajlar bu şifreleme sistemi kırılmadan dinlenemez, çözülemez, değiştirilemez. Böylece VPN’iniz üzerinden nereye ne bağlantısı yaptığınız, ne veri gönderip aldığınız aradaki internet servis sağlayıcıları tarafından bilinemez. Zaten VPN’in esas amacı da budur. Dünyanın herhangi bir yerindeki otel odasından, şirketinizin özel sunucularına, aradaki verilerin dinlenmesine imkan vermeden bağlanmak.

VPN Üzerinden Internet’e Nasıl Bağlanıyorum?

Diyelim ki şirketiniz Amerika’da. VPN yazılımınızı kurarak şirketinizdeki bilgisayarların bulunduğu ağa bağlandınız. Artık tüm internet bağlantınızı da aslında Amerika’daki ofisinizdeymiş gibi yapabilirsiniz. Yani aslında masanızda oturuyor olmanızla uzaktan VPN’le girmeniz arasındaki tek fark (neredeyse) network hızıdır. Yani bulunduğunuz ülkeye servis vermeyen, ya da bulunduğunuz ülkeden bağlantı yasağı olan bir servise, Amerika’daki ofisinizin erişim kuralları ile erişebilirsiniz. Örneğin Amerika’daki şirketiniz ofisinizden Facebook erişimini engellerse, Facebook’a yine erişemezsiniz.

VPN Servisi Veren Şirketler Kimdir?

Normalde böyle bir 3. parti bir servise ihtiyaç duyulmaması gerekir. Bu tür servisleri kullananlar çoğunlukla yasal bazı engelleri aşmak için bu yola başvuruyorlar. Ya Netflix ülkelerine servis vermiyordur, ya ülkelerinden Twitter bağlantısı engellenmiştir ya da yasal olmayan şekilde kopyalanmış film, yazılım vs. indiriyorlardır. VPN servisleri tüm bunlara araya girerek kılıf (bazen maşa) olabilirler. Diyelim ki bir VPN servisi bir çok uluslararası yasanın tanınmadığı bir ülkede olsun, bu durumda kendi servisi üzerinden yapılan yasadışı indirmeler ya da internet dolandırıcılıklarında, kullanıcılarına bir kimlik görünmezliği sağlayabilirler. (Bunun için görevlilerin VPN servisi kayıtlarına erişim izni vermemeleri ya da bu kayıtları yanlışlıkla(!) kaybetmeleri yeterli olur.)

Kendi VPN Servisinizi kurmak zor mudur?

Kolay değildir ama, tabii ki mümkündür. Bir çok açık kaynak kodlu VPN yazılımı bulmak mümkündür. Örneğin: Amerika’daki bir arkadaşınız bu tür bir yazılımı kendi evindeki bilgisayarına kurarsa, siz onun evinden bağlanıyormuş gibi internete bağlanabilirsiniz. Ancak bu servisi kendi ülkenizdeki evinize kurarsanız, evinizdeki bağlantınızın erişim limitleriyle aynı şekilde sınırlandırılırsınız. Yani VPN sihir değildir!

VPN Servisleri bloklanabilir mi?

Tabii ki evet! Bunun birkaç yolu olsa gerek. Bir kere en sık kullanılan VPN servislerinin IP bloklarına erişim engellenirse, artık o VPN’i kullanamazsınız. Başka bir yolu da kullanılan portları ve/veya iletişim protokollerini engellemek olabilir.

Peki VPN Servisleri bloklanmışsa yine de sansürsüz internet erişimi yapılabilir mi?

Aslında sansürleme yöntemlerinde teknik limit neredeyse yok gibidir. Ancak her teknoloji “anti”sini de yanında geliştirmektedir. İnsanlar DNS‘lerini değiştirmeyi (8.8.8.8) öğrenmişse, o zaman artık IP filtrelersiniz. Eğer VPN kullanımı yeterince yaygınlaşmışsa VPN servislerini de engellersiniz. Diğer başka teknik yollara başvururlarsa onu da emin olun engelleyebilirsiniz. Her ne metod geliştirirseniz geliştirin, mutlaka önü kesilebilir. Bu tür bir filtreleme için kullanılabilecek en uç yöntemlerden birini anlatayım (Bu aslında basitçe bir firewall kuralı listesi, en üstteki kural en önce uygulanır eğer erişim sağlanamazsa bir alttakine bakılır. Not: Bu kural listesi arttıkça firewall’un çalışma hızı düşebilir.):

  1. Öncelikle en başta tüm network erişimini engellersiniz.
  2. Sadece yurt içindeki IP bloğuna http (şifresiz) ile erişim izni verirsiniz.
  3. Yurt içindeki sadece şifreli iletişime ihtiyaç duyan onaylı kurumlara (mesela bankalara) https (şifreli) erişim izni verirsiniz.
  4. Yurt içinde özel protokol gerektiren onaylı kurumlara http https dışında erişim izni verirsiniz.
  5. Yurt dışında sadece onaylı sitelere http (şifresiz) erişim verirsiniz, ancak aradaki tüm paketleri kaydeder, dinler ve gerektiğinde filtrelersiniz.
  6. Yurt dışında SSL sertifikalarını devletinizle paylaşmış sitelere (tabii bir çoğu bunu kabul etmeyecektir, kabul edenler de durumu yalanlayabilirler) aradaki trafiği dinleyerek https (şifreli) erişim sağlarsınız. Yani gmail’e https ile erişmek mümkün olsa da, aslında bu erişimi yerel internet servis sağlayıcınızın araya şifreyi çözerek girmesiyle erişirsiniz.

Günümüzde yukarıda anlattığıma benzer kurallar Çin’in Harika Internet Seddi  (https://en.wikipedia.org/wiki/Great_Firewall_of_China) projesinde uygulanmaktadır. Ayrıca 2013 yılı itibariyle, Çin’de 2 milyon civarında internet polisi bulunduğu iddia edilmektedir (kaynak: http://www.bbc.com/news/world-asia-china-24396957). Dolayısıyla yukarıda listelediğim yöntemlerin bir çoğu farazi değil, gerçek bir biçimde uzun zamandır uygulanan yöntemlerdir.

VPN-Blocked-in-China-The-Great-Firewall-Strikes-Again.png

Kendi Internet servisimi alabilir miyim, mesela uydudan?

Kendi çanak anteninizi koyarak uyduya direk sinyal gönderip almak teknik olarak mümkündür. Ancak ülkenizdeki yasalar itibariyle böyle bir radyo iletişimi kullanmanız da kanunlara tabii olabilir. Yani resmi görevliler uyduya sinyal gönderdiğinizi tespit edilebilir ve bu konuda kanunen engellenebilirsiniz. Tabii ayrıca teknik olarak da istenirse bu tip uyduların frekansı belirli bölgelerden bozulabilir.

Bunun dışında uzun dalga telsiz sinyali ile çok düşük hızla veri transferi yapmak mümkün olabilir, ancak bu da bir çok ülkede kanuni izne tabiidir. Ayrıca sinyalleri gönderen cihazların yeri de tespit edilebilir.

Benim bildiğim kadarıyla, geriye kendi fiber optik ağ kablonuzu çekmek kalıyor. Ya sınırlardan ya da uluslararası sulardan, ama her ikisi de bana oldukça zor görünüyor.

Sonuç

Özetle vardığım sonuç şudur:
Bir ülke isterse tüm iletişimi (buna sadece internet olarak bakmayın), gerek teknik gerekse hukuki yollardan engelleyebilir, ne kadar hacker vs. olsanız da bu duvarları aşamayabilirsiniz.

Remounting a USB drive, after ejecting it on OSX

Normally after I eject a USB drive from an OSX machine, to remount it, I simply plug it out, and then back in. But this is an annoying process, and simply wears connectors mechanically. So here is my workaround. Now open a terminal window, but first, you need to become root!
(Be aware that, the following command will disconnect any other USB storage devices as well. So when calling this command, make sure that you don’t have any other filesystems loaded via USB connection.)

kextunload /System/Library/Extensions/IOUSBMassStorageClass.kext

Then again type:

kextload /System/Library/Extensions/IOUSBMassStorageClass.kext

Now OSX will rescan your USB ports and detect your USB storage devices without physically unplugging/replugging!
Hope this works for you as well. I tested this on yosemite 10.10.5, and it worked.

MacOSX Assembly, 255 byte Hello World

For a long time, I wanted to code in assembly on OSX. Today I started to look at some “Hello World” examples. I came across some of them. After making my asm code work, I looked at the size. Woow, it was above 8Kbytes! Since I know that my asm code is not that long, I needed to make it smaller. No matter how I worked with “ld” options or “strip” executable commands, I could not go to smaller sizes.

Then searching a little bit more, I came accross this example:

http://osxbook.com/blog/2009/03/15/crafting-a-tiny-mach-o-executable/

It could create a 248 byte executable, which returns 42 (Thanks Douglas Adams) as the exit code. Now we are talkin!

Then I took it, and added my asm code for Hello World. And I made some shameless optimizations, and illegal programming. But it is tested to work on my 10.10.3 laptop!

; Hello World example for OSX asm code
; kuban.altan@gmail.com
; Tested on OSX 10.10.3 (might fail after 10.10.5, since Apple now limited min. mach-o file to 4K)

; To make it run, just type these in Terminal (you might need Xcode installed)
; nasm -f bin -o Hello255bytes Hello255bytes.s
; chmod 755 Hello255bytes
; ./Hello255bytes
; Hello world.
; So the code below is typing "Hello world." in just 255 bytes of executable

; Inspired by the document below:
; http://osxbook.com/blog/2009/03/15/crafting-a-tiny-mach-o-executable/

BITS 32
	org	0x1000

	db	0xce, 0xfa, 0xed, 0xfe			; magic number for mach-o executable
	dd	7								; cputype (CPU_TYPE_X86)
	dd	3								; cpusubtype (CPU_SUBTYPE_I386_ALL)
	dd	2								; filetype (MH_EXECUTE)
	dd	2								; ncmds
	dd	_start - _cmds					; cmdsize
	dd	0								; flags
_cmds:
	dd	1								; cmd (LC_SEGMENT)
	dd	124								; cmdsize
 _hello:
	db	"Hello world.   ", 10			; Overwrite segname
	dd	0x1000							; vmaddr
	dd	0x1000							; vmsize
	dd	0								; fileoff
	dd	filesize						; filesize
	dd	7								; maxprot
	dd	5								; initprot
	dd	1								; nsects
	dd	0								; flags
	db	"__text"						; sectname
	db	0, 0, 0, 0, 0, 0, 0, 0, 0, 0 	; sectname
	db	"__TEXT"						; segname
	db	0, 0, 0, 0, 0, 0, 0, 0, 0, 0 	; segname
	dd	_start							; addr
	dd	_end - _start					; size;
	dd	_start - 0x1000					; offset
	dd	2								; align
	dd	0								; reloff
	dd	0								; nreloc
	dd	0								; flags
	dd	0								; reserved1
	dd	0								; reserved2

	dd	5								; cmd (LC_UNIXTHREAD)
	dd	80								; cmdsize
	dd	1								; flavor (i386_THREAD_STATE)
	dd	16								; count (i386_THREAD_STATE_COUNT)
	dd	0, 0, 0, 0, 0, 0, 0, 0 			; state
	dd	0, 0, _start, 0, 0, 0, 0, 0		; state

; Our code starts here, and it assumes eax=0 and ebx=0, when kernel jumps to _start:
; I tested this on my 10.10.3 machine and it works!

_start:
	inc		ebx 			; ebx = 1
	shl		ebx,4			; ebx = 16
	push	ebx 			; We push 16 as parameter to stack, which represents string length

	push	dword _hello	; We push the address of our Hello world string

	inc		eax 			; eax = 1
	push	dword eax 		; push 1 as the parameter file descriptor (stdout)

	shl		eax, 2 			; eax = 4 so we will syscall (write)
	sub		esp, eax
	int		0x80			; syscall

	xor	eax, eax 			; eax = 0 (nosys) This is really a hack! Normally I should
							; call (exit) which needs eax = 1, but it would consume 2 more bytes
							; So I just call nosys, and exit my Hello world.
							; I know it is not legal. But I had to fit under 256 bytes!
	int	0x80 				; syscall

_end:
filesize equ	$ - $$

To make it run, just type:

nasm -f bin -o Hello255bytes Hello255bytes.s

Then make it executable:

chmod 755 Hello255bytes

Then run it:

./Hello255bytes

So this is the smallest “Hello world.” executable I have seen to be assembled directly using nasm. Anyone liked this?

MacOS’ta Spotlight aramasını istenilen Volume’ler için devre dışı bırakmak

MacOS’taki Spotlight araması çok kullanışlı bir araç olsa da, formatlanan her volume için default olarak açık olması dert olabiliyor. Örneğin yedekleme yapılan, ya da Autodesk Smoke, Flare, Flame yazılımları için kullanılan bir disk için Spotlight indexleme çok anlamlı olmayacaktır. Bu indexleme CPU’nun zamanını boşa harcayacağı gibi, aynı zamanda disk sistemini de yavaşlatacaktır. İyisi mi hiç gerekmeyeceği durumlar için iptal etmenin iyi olacağını düşündüm. Terminali açıp su olduktan sonra:

sh-3.2# mdutil -as
/:
Indexing enabled.
/Volumes/metaData:
Indexing enabled.
/Volumes/stoneMedia:
Indexing enabled.

Bu şu demek oluyor, mdutil’in raporuna göre sistemde 3 adet filesystem var. Bunların hepsinde de Indexing enabled durumda. Bense metaData ve stoneMedia için indexing’i kapatmak istiyorum.

sh-3.2# mdutil -i off /Volumes/metaData/ /Volumes/stoneMedia/
/Volumes/metaData:
Indexing disabled.
/Volumes/stoneMedia:
Indexing disabled.

Bu komutla tek satırda indexlemeyi kapatmış olduk. Bunu da bir daha kontrol edelim:

sh-3.2# mdutil -as
/:
Indexing enabled.
/Volumes/metaData:
Indexing disabled.
/Volumes/stoneMedia:
Indexing disabled.

Bundan sonra eğer çok mükemmeliyetçiysek .Spotlight-V100 klasörünü de altındakilerle birlikte silebiliriz. Eğer herhangi bir Volume için indexlemeyi bir daha açmak istersek:

sh-3.2# mdutil -i on /Volumes/metaData/

yazmamız durumunda indexleme tekrar devreye girecektir. Eğer .Spotlight-V100 klasörünü silmişsek de, mdworker tarafından tekrar oluşturalacaktır.

Mac OSX’te seçili dosyaları rar’lamak

Ne kadar aradıysam da MacOS‘ta çalışan, GUI‘si olan güncel bir RAR dosya oluşturma programı bulamadım. Amacım da şu idi: büyük miktarda dosyaların bulunduğu klasörleri, 1GByte‘lık segmentler halinde RAR dosyalarına sıkıştırmak istiyordum.

Bunu yapmak için, komut satırı ile haşır neşir olanlar için, http://rarlabs.com/rar/rarosx-5.1.1.tar.gz adresinde, rarlabs‘ın MacOSX için sağladığı komut satırı yazılım mevcut. Ben de bu dosyayı indirerek işe başladım. Ve bu .tar.gz dosyasını açtım:rar directory list

Görüldüğü üzere aslında çok da küçük bir dosya. Sonra da bu rar klasörünü /Applications klsörüne taşıdım. Artık sistemimde /Applications/rar/rar adı altında komut satırından çalıştırabileceğim bir rar aplikasyonum oldu.

rar

Şimdi sıra buna bir GUI geliştirmek kısmına geldi. Çünkü şirketteki birçok kullanıcı için komut satırı yeterince konforlu değildi. Bunun için de http://stuffforlife.blogspot.com.tr/2009/03/data-compression-in-mac-os-x-how-to.html adresinde bir dosyaya rar oluşturan bir automator scripti gördüm. Hemen kurup denedim. Ama bu script, sadece seçili klasör ya da dosyadan 1 tane büyük rar dosyası oluşturuyordu. Bu da büyük bir klasör sıkıştırıldığında, 50-100GByte büyüklüğünde dosyalar oluşması sorununu beraberinde getiriyordu. Bu büyüklükte dosyalar gerek network transferlerinde, gerekse FAT32 tipi filesystemlerde soruna neden olmakta. Benim amacım bu büyük arşiv dosyalarını 1GB’lık parçalar halinde 50 adet dosyayı, aynı ismin sonuna ‘_rar’ eklenmiş yeni bir klasör açarak oluşturmaktı.

applescript

Bu automator dosyasını da /Users/myuser/Library/Services/ klasörü altına koyup, Finder’da sağ tıklayarak menüyü açtığımda: ‘RAR selected files’ menüsü gelmiş oluyor.

Aslında uzun lafın kısası https://drive.google.com/file/d/0B5o2czrPOPIwQVFITHZhdHVlWnM/view?usp=sharing adresinden bu .zip dosyasını çıkarıp, sonra double click yapıp:

service_installe

Install dediğimiz anda dosya kullanıcımız için sistemimize kuruluyor.

Bununla yetinmeyenler için, ayrıca Automator‘daki code ise aşağıda:

on run {input, parameters}
	
	set nbFiles to count input
	
	if nbFiles = 0 then
		display dialog "No files selected!" buttons {"OK"} default button 1
		return
	end if
	
	tell application "Finder"
		
		set archiveDir to (container of (item 1 of input) as string)
		if nbFiles = 1 then
			set archiveName to (name of (item 1 of input) as string)
			set archiveDirName to (name of (item 1 of input) as string)
		else
			set archiveName to "archive"
		end if
		
		if exists folder (archiveDir & archiveName & "_rar") then
			set i to 2
			repeat while exists folder (archiveDir & archiveName & "-" & i & "_rar")
				set i to i + 1
			end repeat
			set archiveDirName to archiveName & "-" & i
		end if
		
		set archiveDir to quoted form of POSIX path of archiveDir
		set archiveDirName to quoted form of (archiveDirName & "_rar")
		set archiveName to quoted form of (archiveName & ".rar")
		
		set listFiles to " "
		repeat with i in input
			set listFiles to listFiles & quoted form of ("." & POSIX path of (name of i as string)) & " "
		end repeat
		
		set finalTargetName to archiveDirName&"/"&archiveName
		
	end tell
	
	tell application "Terminal"
		activate
		do script "cd " & archiveDir & ";mkdir " & archiveDirName &";/Applications/rar/rar a -y -s -m4 -v1024m " &finalTargetName & listFiles
	end tell
	
	return input
end run

Burada .rar dosyaların segment büyüklükleri değiştirilmek istenirse, -v1024m parametresi, mesela 10MByte için -v10m yapılabilir.

MacOS 10.10 Yosemite için USB installer yapmak

MacOS Partition

MacOS Partition

MacOS .dmg dosyasını indirdikten sonra, bunu eğer Mac’inizi sıfırdan kurmak için kullanmak istedim. Bunun için 8GB büyüklüğünde bir USB memory buldum. Bunu da GUID şekilde partitionladım.

Sonra da bu USB sticki MacOS Extended Journaled filesystem ile “MacOS10” ismiyle formatladım.macosextended

Sonra da Yosemite .dmg imajını double click yaparak mount ettim. Sonra önce superuser olup (ya da sisteminizde root enabled değilse en başa sudo ekleyerek) komut satırında şunları yazdım:

cd /Volumes/OS\ X\ Yosemite\ 10.10\ \[Mac\ App\ Store\]/Install\ OS\ X\ Yosemite.app/
./createinstallmedia --volume /Volumes/MacOS10/ --applicationpath /Volumes/OS\ X\ Yosemite\ 10.10\ \[Mac\ App\ Store\]/Install\ OS\ X\ Yosemite.app --nointeraction

Buran sonra USB memorynin hızına göre yaklaşık 15-20dk. bekledim. Artık bootable Yosemite USB medianız hazır!

 

Bir klasördeki tüm MP4 dosyaları DNXHD36 Quicktime MOV formatına çevirmek

for f in *.MP4 ; do ffmpeg -i "$f" -vcodec dnxhd -b:v 36M -pix_fmt yuv422p -acodec pcm_s16le -s 1920x1080 "${f%.MP4}.mov" ; done