Evde kullandığımız bilgisayardan internete açık bir şekilde bir servisin (örneğin web sunucu) nasıl yayınlanabileceği konusu üzerine uzun süredir yazmak istiyordum. Bu konu ile ilgili bir mail grubunda soru gelince “fırsat bu fırsat” diyerek bu blog yazısına başladım. Sunucuların özel veri merkezlerinden bile çıkarılıp, konsolide edilmiş paylaşılan veri merkezlerine (public cloud - AWS, Azure, Google Cloud, DigitalOcean, vb) taşındığı, A’dan Z’ye bütün hizmetlerin (web sayfası sunma, veri tabanı, in-memory cache) cloud’da maliyet etkin bir biçimde sağlandığı bu devirde evden servis sağlamak da nereden çıktı dediğinizi duyar gibiyim :-)
MotivasyonBu blog yazısını yazmak istememin temel sebebi modem arkasından bir servisi internete açarken yapılması gereken ayarların ve problem çözme adımlarının birçok konseptin tanıtılması ve anlaşılmasına olanak tanımasıdır. Buna ek olarak aşağıdaki kullanım senaryolarında bu işlemi gerçekten yapmaya ihtiyaç duyabiliriz.
- Bilgisayarınızda geliştirdiğiniz ve henüz dışarıdan erişilebilir bir sunucuya deploy etmediğiniz bir web uygulamasını müşterinize veya iş arkadaşlarınıza göstermek istediğinizde
- Evinize kurduğunuz bir akıllı ev sistemi ya da güvenlik kamera sistemine internet üzerinden erişmek istediğinizde
- Evinizdeki bilgisayarınızı iş yerinden veya yakınlarınızın bilgisayarını, TeamViewer vb programlar olmadan direkt erişim ile yönetmek istediğinizde
Bu blog’da macOS yüklü bir bilgisayarda basit bir web sunucu çalıştırılacak ve internete açılacaktır. Windows ve Linux yüklü bilgisayarlarda işletim sistemi bazlı olarak bazı değişiklikler yapmak gerekecektir. İlerleyen zamanlarda bu yazıya macOS’e ek olarak, Windows ve Linux işletim sistemlerinde yapılması gereken ayarlar ile ilgili eklemeler yapılacaktır.
Hazırlık
Öncelikle internete açılacak bir test web sunucusunun kurulumunu bilgisayarımıza yapalım. Test web sunucusu olarak NPM paketi olarak dağıtılan basit [/url]
Kod:
http-server
Uygulamayı global olarak kullanabilmek için komut satırından
Kod:
npm install -g http-server
Kod:
http-server
Kod:
html
Kod:
for i in {1..5}; do echo "Hello World $i" > $i.html; done
Komut satırında
Kod:
http-server -p 8080
Kod:
8080
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!Çıktıdan görüldüğü üzere web sunucu
Kod:
8080
Kod:
localhost
Kod:
loopback
Kod:
127.0.0.1
Şimdi
Kod:
curl
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!Örneğimizde web sunucu her ne kadar bütün IP’leri dinliyor olsa da bazı durumlarda sadece belirli arayüzlerden belirli IP’leri dinlemek isteyebiliriz. Örneğin, şu anda yapmak istediğimizin tam aksi durumda, yani web sunucumuza dış dünyadan erişilmesini istemediğimizde web sunucuyu sadece
Kod:
localhost
Kod:
127.0.0.1
Kod:
http-server
Kod:
-a
Kod:
127.0.0.1
Kod:
localhost
Kod:
http-server
Kod:
localhost
Kod:
curl
Kod:
192.168.1.36
Kod:
172.16.44.1
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!Kod:
http-server
Kod:
Ctrl+C
Kod:
-a
Son hazırlık adımı olarak internet üzerinden sunucuya erişmek üzere ISP’nin (Internet Service Provider - internet servis sağlayıcı) bize verdiği IP adresini bulalım. IP adresimizi Google’a
Kod:
what is my ip
Kod:
$ dig +short myip.opendns.com @resolver1.opendns.com.
88.253.21.56
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!Tam bu noktada kazara internetten servisinize ulaşıp ulaşamadığınızı test etmek için
Kod:
curl http://88.253.21.56:8080
Kod:
curl http://<public_ip_adresi>:8080
Güçlü ve Doğru Alternatif
Aşağıda detaylandıracağımız adımlarla hiç uğraşmadan bilgisayarınızda çalıştırdığınız servisleri İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
Kod:
ngrok
Kod:
ngrok
Kod:
8080
Kod:
ngrok http 8080
Kod:
ngrok
Kod:
8080
Kod:
http://a44c3a39.ngrok.io
Kod:
https://a44c3a39.ngrok.io
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!Kod:
http://a44c3a39.ngrok.io
Kod:
https://a44c3a39.ngrok.io
Kod:
curl
Kod:
ngrok
Kod:
http
Kod:
https
Topoloji
İlerleyen aşamalarda çıkması muhtemel problemleri çözmek için evimizden internete ulaşmamızı sağlayan cihazlar, cihazların rolleri ve ağ topolojisine kısmen hakim olmamız gerekir. Şimdi bu kısımları biraz irdeleyelim.
Genel olarak evlerimizden internete bir ADSL, VDSL, kablo vb modem vasıtasıyla bağlanırız. Bu modemin temel görevi paketleri telefon kablosu üzerinden iletilmek üzere modüle/demodüle etmektir. Zaten
Kod:
MoDem
Kod:
modulation
Kod:
demodulation
Evimizin içerisinde bir public IP adresi üzerinden birden fazla cihazı (cep telefonlarımız, bilgisayarlarımız, vb) ağa bağlamak isteriz. Modem içinde bulunan Router’lar birden fazla cihaza internet sağlayabilmek için bağlı bulunan cihazlarla kendi arasında yeni bir ağ oluşturur. Bu ağdaki cihazlar genellikle 192.168.1.x’li IP’ler alırlar, Router’a ise DHCP’den 192.168.1.1 IP’sini atanır, bu nedenle modem arayüzüne girmek için genellikle 192.168.1.1 IP’sini kullanırız. İşte modem, içerisinde bulunan Router ile ISP’de dahil olduğu dış ağ ve evimizdeki cihazlarla birlikte dahil olduğu ev ağı arasında geçişi sağlar. Zaten Router’ların asıl görevi iki farklı ağ arasında paket geçişini sağlamaktır.
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!Router’ın evdeki cihazlarla kurduğu küçük ağ’dan üzerinden cihazları internete çıkarabilmesini sağlayan özellik NAT’tır (Network Address Translation). Yukarıdaki şekilde görüldüğü gibi Router üzerinde bulunan NAT modulü dış dünya ile ev ağımız arasındaki cihazların konuşmasını sağlar. Normalde ev ağına bağlı cihazlardan internetteki servislere (haber siteleri, WhatsApp, Facebook, vb) erişiriz. Bu senaryoda istek bizim tarafımızdan başlatıldığı için akıllı Router’lar güvenli ortamdan (ev ağından) çıkan isteklere verilen cevaplar için gerekli anahtarlamayı yapar. Ancak ev ağı içerisinde sunduğumuz servisler için elimizde tek bir public IP ve birden çok cihaz bulunduğu için Router’a gelen isteklerin hangi cihaza yönlendirilmesi gerektiğini söylememiz gerekir. İşte bu noktada
Kod:
Port Forwarding
Kod:
NAT arkası - Behind the NAT
Ev ağındaki bütün cihazlar
Kod:
NAT arkasındaki cihazlar
Kod:
Port Forwarding
Adımlar
Şimdi tekrar bilgisayarımızdaki web sunucuyu dışarı açma işlemlerine devam edelim.
Bilgisayarın Ev Ağı IP’sini Bulma
Hazırlık adımında
Kod:
http-server
Kod:
ipconfig
Kod:
ifconfig
Port Yönlendirme
Port yönlendirme ile dış IP’den
Kod:
8080
Kod:
Port Forwarding - Port Yönlendirme
Kod:
WAN interface
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!Kuralı ekledikten sonra tekrar
Kod:
curl http://<public_ip_adresi>:8080/1.html
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!Bilgisayarımda Firewall’u açık hale getirip tekrar deneyince aşağıdaki gibi bir çıktı alarak web sunucuya internet üzerinden erişimim tekrar kesildi.
Kod:
$ curl 88.253.21.56:8080/2.html
curl: (7) Failed to connect to 88.253.21.56 port 8080: Operation timed out
Bilgisayar Üzerinde Firewall Ayarı (macOS)
Kod:
Security & Privacy
Kod:
Firewall
Kod:
Firewall Options
Kod:
node
Kod:
http-server
Kod:
node
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
İndirme linklerini görebilmek için sitemize üye ol manız veya giriş yapmanız gerekiyor.Sitemize üyelikler ücretsizdir!
[url=https://gokhansengun.com/resource/img/HostingFromComputer/block_incoming_conns_mac_firewall.png]İlgili değişikliği yaptıktan sonra
Kod:
curl http://<public_ip_adresi>:8080/1.html
Problem Çözme
- Sizin durumunuzda, çalıştırdığınız servis örnek olarak kullandığımız
http-server
- gibi ilgili portun hangi IP’ler tarafından dinlendiğini söylemeyebilir. Bu durumda
127.0.0.1
- ve bilgisayarımızın modemden aldığı
192.168
- ile başlayan IP’lere
curl
- ile istekler göndererek portun gerçekten dinlenip dinlenmediğine emin olmanız gerekir.
- Yine ilgili servisin doğru IP’ler tarafından dinlenip dinlenmediğini anlamak için
netstat
- programını kullanabiliriz. macOS işletim sistemi için
netstat -ap tcp | grep -i "listen"
- komutu ile ilgili portun hangi IP’lerde dinlendiğini görebiliriz. Çıktıda görülen
*.8080
- ve
0.0.0.0:8080
- portun bütün IP’ler tarafından dinlendiğini belirtecektir.
- Yukarıdaki bütün ayarları yapmanıza rağmen uzak bir ihtimal de olsa ISP’niz kendi ağında modeminizin önüne koyduğu bir network cihazı ile modeminize gelen istekleri bloklayabilir. Bu durumda ISP ile bağlantı kurulup istenen portlara izin vermesi talep edilebilir.
- Router üzerinde yapılan port yönlendirme ayarı ile -varsa- Router üzerindeki Firewall’da ilgili portlara otomatik olarak izin verilmesi beklenir. Yine çok uzak bir ihtimal olmakla birlikte standart dışı bir modem bu basit kuralı görmezden gelerek yönlendirilen portları Firewall’da bloklayabilir. Bu durumda modem üzerinde manuel olarak ilgili porta gelen isteklerin bloklanmaması sağlanmalıdır.
Biz KiMSeNiN CaNiNi YaKMaDıK oNLaR BiZiM AteŞ oLDuğuMuZu BiLe BiLe GeLdiLeR