Ollama API'sini internete açmadan uzaktan erişim: Ubuntu'da Nginx ters vekil ve kimlik doğrulama
Ollama'nın 11434 portu internete açık mı, nasıl anlaşılır? Ollama'yı yalnız yerelde dinletmeyi, Docker'ın UFW'yi atlatma sorununu kapatmayı, Nginx ile TLS ve Bearer token koruması kurmayı ve Open WebUI ile OpenAI uyumlu istemcileri güvenli uç noktaya bağlamayı adım adım anlatıyoruz.
sunucu.com.tr Ekibi12 dk okuma
Ollama'yı sunucuya kurduktan sonra ekibinizin ya da uygulamalarınızın ona uzaktan bağlanması gerekir. En kısa yol OLLAMA_HOST=0.0.0.0 yapıp 11434 portunu açmaktır. Ancak Ollama API'sinde kimlik doğrulama yoktur, yani portu gören herkes modellerinizi ve GPU'nuzu kullanabilir. Bu rehber, Ollama çalıştıran Ubuntu sunucusu olan sistem yöneticileri için hazırlandı: önce açık olup olmadığınızı kontrol edeceğiz, sonra Nginx, TLS ve token ile korumalı bir uç nokta kuracağız.
Ön koşullar
- Ubuntu 22.04 ya da 24.04 çalışan, sudo yetkili bir sunucu.
- systemd servisi ya da Docker konteyneri olarak kurulmuş Ollama.
- Sunucu IP adresinize yönlendirebileceğiniz bir alt alan adı (örneğin
llm.example.com). - Sağlayıcınızın web konsolu, KVM ya da seri konsol erişimi.
Kendinizi kilitlemeyin: Bu yazının 4. adımında UFW güvenlik duvarı kuralları var. Güvenlik duvarını etkinleştirmeden ve herhangi bir kural uygulamadan ÖNCE SSH portunuza (varsayılan 22/tcp ya da değiştirdiğiniz port) izin vermezseniz SSH bağlantınız kesilir ve sunucuya erişimi tamamen kaybedersiniz. Başlamadan önce konsol erişiminizin çalıştığını doğrulayın; bir hata olursa kuralı yalnız oradan düzeltebilirsiniz.
Ollama neden yalnız yerelde dinler?
Ollama varsayılan olarak 127.0.0.1:11434 adresine bağlanır. Bu bilinçli bir seçimdir: API, yerel makinede çalışan istemciler için tasarlanmıştır ve içinde kullanıcı, parola ya da anahtar kavramı yoktur. Ollama SSS sayfası ağda yayınlamak için OLLAMA_HOST ortam değişkenini değiştirmeyi anlatır, ama bunu yaptığınızda erişim kontrolü tamamen size kalır.
OLLAMA_HOST=0.0.0.0 dediğinizde Ollama tüm ağ arayüzlerinde dinler. Sunucunuzun genel IP adresi varsa ve önünde bir güvenlik duvarı yoksa, API dünyanın her yerinden erişilebilir hale gelir. SentinelLABS ve UpGuard gibi güvenlik ekiplerinin raporları, internette bu şekilde açık kalmış çok sayıda Ollama sunucusu bulunduğunu ve bunların taranıp kullanıldığını gösteriyor.
Sunucunuz şu an açık mı?
Önce sunucunun kendisinde Ollama'nın hangi adreste dinlediğine bakın:
# Ollama'nın dinlediği adresleri gösterir (Ubuntu 22.04 / 24.04, Debian 12)
sudo ss -ltnp | grep 11434
Çıktıda 127.0.0.1:11434 görüyorsanız yalnız yereldesiniz. 0.0.0.0:11434, *:11434 ya da [::]:11434 görüyorsanız tüm arayüzlerde dinliyorsunuz demektir. Docker kullanıyorsanız süreç adı docker-proxy olarak görünebilir.
Asıl testi sunucunun dışından, örneğin kendi bilgisayarınızdan yapın. 192.0.2.10 yerine sunucunuzun genel IP adresini yazın:
# Dışarıdan model listesini istemeyi dener; yanıt gelirse API herkese açıktır
curl -s --max-time 5 http://192.0.2.10:11434/api/tags
JSON biçiminde model listesi geliyorsa API'niz internete açıktır. Bağlantı zaman aşımına uğruyor ya da reddediliyorsa doğrudan erişim kapalıdır. Bu durumda bile aşağıdaki adımları uygulamanız önerilir, çünkü bir güncelleme ya da Docker ayarı durumu sessizce değiştirebilir.
Açık Ollama'nın riskleri
Kimlik doğrulaması olmayan bir Ollama sunucusunda saldırganın yapabilecekleri sınırlı değildir:
- GPU ve CPU'nuzun izinsiz kullanılması (LLMjacking): Başkaları kendi isteklerini sizin donanımınızda çalıştırır. Faturayı ve yavaşlığı siz yaşarsınız.
- Model çekme ve disk doldurma:
/api/pullile onlarca gigabaytlık modeller indirilebilir, disk dolar ve diğer servisler etkilenir. - Model silme ve değiştirme:
/api/deleteve/api/createuç noktaları ile modelleriniz silinebilir ya da aynı adla değiştirilmiş bir model yerleştirilebilir. - Araç çağırma ve ajan senaryoları: Ollama'yı araç (tool) kullanan bir ajanla birlikte çalıştırıyorsanız, modele dışarıdan gönderilen istekler beklemediğiniz eylemleri tetikleyebilir.
- Bilgi sızıntısı: Hangi modelleri kullandığınız, sistem istemleri (system prompt) ve özel model yapılandırmalarınız görülebilir.
Adım 1: OLLAMA_HOST'u 127.0.0.1'e sabitleme
Resmi kurulum betiği Ollama'yı bir systemd servisi olarak kurar. Ayarları ana servis dosyasını değiştirmeden, bir "drop-in" dosyasıyla vermek en temiz yoldur; Ollama Linux belgesi de bu yöntemi anlatır.
Aşağıdaki betik Ubuntu 22.04, Ubuntu 24.04 ve Debian 12 için hazırlandı. Drop-in dosyasını oluşturur, servisi yeniden başlatır ve sonucu gösterir. Tekrar çalıştırmak zararsızdır. Geri almak için /etc/systemd/system/ollama.service.d/10-yerel-dinleme.conf dosyasını silip sudo systemctl daemon-reload && sudo systemctl restart ollama çalıştırmanız yeterli.
#!/usr/bin/env bash
# Ollama'yı yalnız loopback adresinde dinlemeye sabitler
set -euo pipefail
DROPIN_DIR="/etc/systemd/system/ollama.service.d"
DROPIN_FILE="${DROPIN_DIR}/10-yerel-dinleme.conf"
sudo mkdir -p "$DROPIN_DIR"
# Dosyayı her seferinde aynı içerikle yazar (idempotent)
sudo tee "$DROPIN_FILE" > /dev/null <<'EOF'
[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"
EOF
sudo systemctl daemon-reload
sudo systemctl restart ollama
# Kontrol: yalnız 127.0.0.1:11434 görünmeli
sleep 2
sudo ss -ltnp | grep 11434 || echo "Ollama dinlemiyor, journalctl -u ollama ile kontrol edin"
Başka bir drop-in dosyasında OLLAMA_HOST tanımlıysa son okunan değer geçerli olur. systemctl cat ollama komutuyla tüm dosyaları birlikte görüp çakışan satırları temizleyin.
Adım 2: Docker'da port yayınını 127.0.0.1'e bağlama
Ollama'yı Docker ile çalıştırıyorsanız önemli bir tuzak var: Docker, yayınladığınız portlar için iptables kurallarını kendi zincirlerine ekler ve bu kurallar UFW'nin kurallarından önce değerlendirilir. Yani UFW'de 11434'ü reddetseniz bile -p 11434:11434 ile yayınlanmış bir konteyner dışarıdan erişilebilir kalır. UFW durumunda her şey kapalı görünürken port açık olabilir.
Çözüm, portu yalnız loopback adresinde yayınlamaktır. Komut satırında:
# Mevcut konteyneri durdurup yalnız yerelde yayınlanan yeni konteyner başlatır
# Model verileri "ollama" adlı volume'da kaldığı için silinmez
docker stop ollama && docker rm ollama
docker run -d --name ollama --restart unless-stopped \
-v ollama:/root/.ollama \
-p 127.0.0.1:11434:11434 \
ollama/ollama
GPU kullanıyorsanız NVIDIA Container Toolkit kuruluysa --gpus=all parametresini eklemeyi unutmayın. Docker Compose kullanıyorsanız ilgili satır şöyle olmalı:
services:
ollama:
image: ollama/ollama
ports:
- "127.0.0.1:11434:11434" # Yalnız sunucunun kendisinden erişilir
volumes:
- ollama:/root/.ollama
volumes:
ollama:
Open WebUI gibi bir arayüz aynı Compose dosyasındaysa Ollama portunu hiç yayınlamamak daha da iyidir. Konteynerler ortak ağ üzerinden http://ollama:11434 adresiyle birbirine ulaşır. Geri almak için ports satırını eski haline getirip docker compose up -d çalıştırırsınız.
Adım 3: Nginx ters vekil, TLS ve token ile kimlik doğrulama
Artık Ollama yalnız yerelde. Uzaktan erişimi Nginx üzerinden, HTTPS ve kimlik doğrulama ile vereceğiz. Bunun için bir alt alan adına ihtiyacınız var, örneğin llm.example.com. Alan adınızın DNS panelinden bu kaydı sunucu IP'nize yönlendirin; elinizde uygun bir alan adı yoksa alan adı kaydederek DNS yönetimini aynı yerden yapabilirsiniz.
Nginx ve sertifika kurulumu
Aşağıdaki komutlar Ubuntu 22.04 ve 24.04 için hazırlandı. Let's Encrypt doğrulaması için 80 numaralı portun dışarıdan erişilebilir olması gerekir.
# Nginx, Certbot ve htpasswd aracını kurar
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx apache2-utils
# Yalnız sertifika alır, Nginx yapılandırmasına dokunmaz
sudo certbot certonly --nginx -d llm.example.com
# Uzun ve rastgele bir token üretir; çıktıyı parola yöneticinize kaydedin
openssl rand -hex 32
Bearer token mı, Basic Auth mı?
OpenAI uyumlu istemciler (çoğu kod kütüphanesi, eklenti ve ajan aracı) anahtarı Authorization: Bearer ... başlığıyla gönderir. Bu yüzden Bearer token, uygulama entegrasyonları için daha uyumludur. Basic Auth ise tarayıcıdan ya da curl -u ile elle test için pratiktir ama birçok istemci tarafından desteklenmez. Aşağıdaki yapılandırma Bearer token kullanır; Basic Auth alternatifini hemen ardından veriyorum.
Nginx site yapılandırması
Bu dosya Ubuntu'daki Nginx paketiyle (1.18 ve sonrası) uyumlu olacak şekilde hazırlandı. ORNEK_UZUN_TOKEN yerine az önce ürettiğiniz değeri, llm.example.com yerine kendi alt alan adınızı yazın. Ayrıca model indirme, silme ve oluşturma uç noktalarını uzaktan kapatıyoruz; model yönetimini SSH ile sunucuda yapmak daha güvenlidir.
# /etc/nginx/sites-available/ollama
# Authorization başlığını kontrol eder; eşleşmezse 0 döner
map $http_authorization $ollama_yetkili {
default 0;
"Bearer ORNEK_UZUN_TOKEN" 1;
}
server {
listen 80;
server_name llm.example.com;
# Sertifika yenileme dışında her şeyi HTTPS'e yönlendirir
location /.well-known/acme-challenge/ { root /var/www/html; }
location / { return 301 https://$host$request_uri; }
}
server {
listen 443 ssl;
server_name llm.example.com;
ssl_certificate /etc/letsencrypt/live/llm.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/llm.example.com/privkey.pem;
# İsteğe bağlı IP kısıtlama: yalnız ofis ağı
# allow 198.51.100.0/24;
# deny all;
client_max_body_size 50m; # Görsel içeren istekler için
# Model yönetimi uç noktaları uzaktan kapalı
location ~ ^/api/(pull|push|delete|create|copy|blobs) {
return 403;
}
location / {
if ($ollama_yetkili = 0) {
return 401;
}
proxy_pass http://127.0.0.1:11434;
# Ollama'nın Host denetimi için yerel ad gönderilir
proxy_set_header Host localhost:11434;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Authorization ""; # Token Ollama'ya iletilmez
# Akışlı (streaming) yanıtlar için tamponlama kapalı
proxy_http_version 1.1;
proxy_buffering off;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
}
Etkinleştirmek için:
# Siteyi etkinleştirir, söz dizimini denetler ve Nginx'i yeniden yükler
sudo ln -sf /etc/nginx/sites-available/ollama /etc/nginx/sites-enabled/ollama
sudo nginx -t && sudo systemctl reload nginx
Geri almak için /etc/nginx/sites-enabled/ollama bağlantısını kaldırıp sudo systemctl reload nginx çalıştırın; asıl dosya sites-available içinde kalır.
Token dosyası parola niteliğindedir. Yapılandırmayı bir Git deposunda tutuyorsanız token'ı ayrı bir dosyaya alıp include ile çağırın ve o dosyayı depo dışında bırakın. Her kullanıcı ya da uygulama için map bloğuna ayrı bir satır ekleyerek ayrı token verebilirsiniz; biri sızarsa yalnız o satırı silersiniz.
Basic Auth alternatifi
Yalnız insanlar erişecekse Basic Auth daha basittir. ORNEK_KULLANICI için parola dosyası oluşturun:
# Kullanıcı ekler; dosya yoksa -c ile oluşturur (ikinci kullanıcıda -c kullanmayın)
sudo htpasswd -c /etc/nginx/.ollama_htpasswd ORNEK_KULLANICI
Ardından location / içindeki if bloğu yerine şu iki satırı koyun ve proxy_set_header Authorization ""; satırını koruyun:
auth_basic "Ollama";
auth_basic_user_file /etc/nginx/.ollama_htpasswd;
Adım 4: Güvenlik duvarı, IP kısıtlama ve VPN seçeneği
Kendini kilitleme uyarısı: Aşağıdaki kuralları uygulamadan ve ufw enable çalıştırmadan ÖNCE SSH erişimine izin vermelisiniz. UFW etkinleştiğinde gelen bağlantıları varsayılan olarak reddeder; SSH için izin kuralı yoksa açık oturumunuz kopar ve sunucuya erişimi kaybedersiniz. SSH portunuzu değiştirdiyseniz OpenSSH yerine sudo ufw allow 2222/tcp gibi kendi portunuzu yazın. Bir hata ihtimaline karşı sağlayıcınızın web konsolu ya da KVM erişiminin çalıştığından emin olun; erişimi kaybederseniz kuralı yalnız konsoldan sudo ufw disable ile geri alabilirsiniz.
Aşağıdaki komutlar Ubuntu 22.04 ve 24.04 için hazırlandı ve tekrar çalıştırılabilir. Sıralama önemlidir: SSH izni her zaman ilk satırdadır.
# 1) ÖNCE SSH'a izin ver, aksi halde kendini kilitlersin
sudo ufw allow OpenSSH
# 2) HTTPS ve sertifika yenileme için HTTP
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 3) Ollama portunu açıkça kapat (Docker yayınını etkilemez, Adım 2'ye bakın)
sudo ufw deny 11434/tcp
# 4) SSH kuralının listede olduğunu gördükten sonra etkinleştir
sudo ufw show added
sudo ufw enable
sudo ufw status verbose
ufw enable komutundan sonra mevcut SSH oturumunu kapatmadan yeni bir terminalden tekrar bağlanmayı deneyin. Yeni bağlantı başarılıysa eski oturumu kapatabilirsiniz.
Erişimi belirli bir ofis ağıyla sınırlamak isterseniz genel 443/tcp kuralı yerine sudo ufw allow from 198.51.100.0/24 to any port 443 proto tcp kullanabilir ya da Nginx'teki allow/deny satırlarını açabilirsiniz. SSH'ı da IP ile sınırlayacaksanız, kendi IP adresinizin aralıkta olduğundan emin olmadan genel SSH kuralını silmeyin. Bir kuralı geri almak için sudo ufw delete allow 443/tcp biçiminde aynı kuralı delete ile yazmak yeterlidir.
WireGuard ile hiç açmadan erişim
Ollama'yı yalnız iç ekip kullanacaksa en sağlam seçenek API'yi internete hiç yayınlamamaktır. WireGuard ile sunucu ve kullanıcılar arasında özel bir ağ kurar, Nginx'i ya da Ollama'yı yalnız VPN arayüzündeki adreste dinletirsiniz. Bu durumda dışarıdan yalnız WireGuard'ın UDP portu açık kalır. Token yine de eklenmelidir, çünkü VPN'e bağlanan her cihazın API'ye erişmesi gerekmeyebilir. Tüm bu altyapıyı kurumunuza ayrılmış izole bir ağda tutmak istiyorsanız özel bulut yapısı da bir seçenektir.
Open WebUI ve OpenAI uyumlu istemcileri bağlama
Open WebUI aynı sunucudaysa Nginx'e hiç uğramasına gerek yoktur. Bağlantı adresini http://127.0.0.1:11434 (Docker ağında http://ollama:11434) olarak verin ve Open WebUI'ın kendi giriş ekranını internete açın. Bu durumda Ollama hiç dışarı çıkmaz.
Open WebUI başka bir sunucudaysa Ollama'yı OpenAI uyumlu bağlantı olarak ekleyin: temel adres https://llm.example.com/v1, API anahtarı ise ürettiğiniz token olur. Ollama /v1 altında OpenAI uyumlu uç noktalar sunduğu için çoğu istemci bu şekilde çalışır.
Kod ve araçlar için de aynı ikili geçerlidir. Python'da OpenAI kütüphanesi kullanıyorsanız base_url değerini https://llm.example.com/v1, api_key değerini token olarak verin. Ollama'nın yerel API'sini (/api/chat) kullanan istemcilerde, Authorization başlığı ekleme seçeneği olup olmadığını kontrol edin; yoksa OpenAI uyumlu yolu tercih edin.
Doğrulama
Kurulumu dışarıdan, sunucu dışındaki bir makineden test edin:
# 1) Doğrudan port kapalı olmalı: zaman aşımı ya da bağlantı reddi beklenir
curl -s --max-time 5 http://192.0.2.10:11434/api/tags || echo "11434 kapalı"
# 2) Token olmadan 401 beklenir
curl -s -o /dev/null -w "%{http_code}\n" https://llm.example.com/api/tags
# 3) Token ile model listesi gelmeli
curl -s -H "Authorization: Bearer ORNEK_UZUN_TOKEN" https://llm.example.com/api/tags
# 4) Model indirme uzaktan engellenmeli: 403 beklenir
curl -s -o /dev/null -w "%{http_code}\n" -H "Authorization: Bearer ORNEK_UZUN_TOKEN" \
-X POST https://llm.example.com/api/pull -d '{"model":"ornek"}'
# 5) OpenAI uyumlu uç nokta
curl -s -H "Authorization: Bearer ORNEK_UZUN_TOKEN" https://llm.example.com/v1/models
Akışlı yanıtın parça parça geldiğini görmek için /api/chat isteğini "stream": true ile deneyin. Yanıt tek seferde geliyorsa proxy_buffering off satırını kontrol edin. Nginx erişim günlüğünü (/var/log/nginx/access.log) bir süre izleyip 401 dönen istekleri görmek, taramaları fark etmenizi sağlar.
Sık yapılan hatalar
- SSH iznini eklemeden UFW'yi açmak: En pahalı hatadır; sunucuya erişim kaybolur ve yalnız konsoldan düzeltilebilir. Her zaman önce
ufw allow OpenSSH, sonraufw enable. OLLAMA_HOST=:11434yazmak: Adres kısmı boş bırakıldığında Ollama tüm arayüzlerde dinler. Yerel dinleme için adresi açıkça127.0.0.1:11434yazın.- IPv6'yı unutmak:
ssçıktısında[::]:11434görüyorsanız IPv6 üzerinden açıksınız. IPv4 testi kapalı gösterse bile IPv6 adresinden decurl -6ile deneyin. OLLAMA_ORIGINS=*yapmak: Bu değişken tarayıcıdan gelen istekler için CORS iznidir. Yıldız, herhangi bir web sitesinin ziyaretçinin tarayıcısı üzerinden yerel Ollama'ya istek atabilmesi anlamına gelir. Gerekiyorsa yalnız kendi alan adınızı yazın.- Docker'da UFW'ye güvenmek:
ufw statusportu kapalı gösterse de Docker yayını açık tutabilir. Her zaman dışarıdan test edin. - Token'ı Ollama'ya iletmek ya da günlüğe yazmak:
proxy_set_header Authorization ""satırı token'ın arka tarafa gitmesini engeller. Özel günlük biçimlerinde başlıkları yazdırmayın. - Host başlığını unutmak: Bazı Ollama sürümleri yerelde dinlerken beklenmeyen
Hostdeğerlerini reddeder. 403 alıyorsanızproxy_set_header Host localhost:11434satırını kontrol edin.
Bu yapıyı modellerinizin ihtiyaç duyduğu donanımla birlikte kurmak istiyorsanız GPU sunucu üzerinde aynı adımları uygulayabilirsiniz; küçük modeller için CPU ile çalışan bir bulut sunucu da yeterli olabilir.
Sık sorulan sorular
Ollama'nın kendi API anahtarı özelliği yok mu?
Yerel Ollama sunucusunun API'sinde yerleşik bir kullanıcı ya da anahtar denetimi bulunmuyor. Bu yüzden kimlik doğrulama Nginx gibi önündeki bir katmanda yapılır. Gelecekteki sürümlerde değişiklik olursa resmi belgeyi kontrol edin, ama ters vekil katmanı TLS ve IP kısıtlama için yine işe yarar.
Nginx yerine Caddy kullanabilir miyim?
Evet. Caddy sertifikayı kendisi alır ve yapılandırması daha kısadır. Mantık aynıdır: Ollama yalnız 127.0.0.1'de dinler, Caddy TLS'i sonlandırır, Authorization başlığını denetler ve isteği 127.0.0.1:11434 adresine iletir. Host başlığını yerel ada çevirmeyi unutmayın.
Token'ı nasıl değiştiririm?
Yeni bir token üretin, map bloğuna yeni satır olarak ekleyip Nginx'i yeniden yükleyin. İstemcileri yeni token'a geçirdikten sonra eski satırı silip tekrar yükleyin. Böylece kesinti yaşamadan geçiş yaparsınız.
Sadece SSH tüneli ile erişmek yeterli mi?
Tek kişilik kullanım için evet. ssh -L 11434:127.0.0.1:11434 [email protected] komutuyla kendi bilgisayarınızdaki 11434 portu sunucudaki Ollama'ya bağlanır ve hiçbir port açmanız gerekmez. Birden fazla kullanıcı ya da sürekli çalışan uygulamalar için Nginx veya WireGuard daha yönetilebilirdir.
Hız sınırı (rate limit) eklemeli miyim?
Token sızarsa zararı sınırlamak için iyi bir fikirdir. Nginx'in limit_req_zone ve limit_req yönergeleriyle IP başına istek sayısını sınırlayabilirsiniz. Akışlı yanıtlar uzun sürdüğü için sınırı istek sayısına göre değil, eşzamanlı bağlantıya göre (limit_conn) ayarlamak daha uygun olabilir.
Sonuç
Güvenli yapının özeti: Ollama yalnız 127.0.0.1 adresinde dinler. Docker yayını da loopback adresine bağlanır. Dışarıdan erişim yalnız HTTPS ve token ile Nginx üzerinden yapılır, model yönetimi uç noktaları uzaktan kapalıdır. Güvenlik duvarında SSH izni her zaman ilk kuraldır. Kurulumdan sonra dışarıdan curl testlerini tekrarlayın, Ollama ya da Docker güncellemelerinden sonra da aynı kontrolü yapın.
- #ollama
- #nginx
- #ters vekil
- #ubuntu 24.04
- #ufw
- #docker
- #yerel llm
- #api güvenliği