Mikro ERP SQL Server'a Web'den Güvenli Bağlantı: Cloudflare Tunnel Rehberi
SQL Server 1433 portunu internete açmadan Cloudflare Zero Trust (Tunnel) ile güvenli web API bağlantısı nasıl kurulur? Ransomware riskine son veren...
İş Problemi: “Dışarıdan Ofisteki Mikro’ya Nasıl Bağlanacağız?”
Şirketinizin Mikro ERP sunucusu ofisteki fiziksel bir makinede (On-Premise) çalışıyor. Satış ekibiniz için Vercel veya Supabase üzerinde modern bir web uygulaması yazdınız. Peki buluttaki bu web uygulaması, masanızın altındaki SQL Server’dan anlık stok bakiyesini nasıl alacak?
Geleneksel yöntemlerin hepsi felaketle sonuçlanır:
- Statik IP ve Port Yönlendirme: Modeme girip 1433 (SQL) portunu dışarı açmak. (Ortalama 24 saat içinde sunucunuza Rusya veya Çin’den Ransomware girer ve tüm veritabanınız şifrelenir (Fidye virüsü)).
- Kişisel VPN: Web sunucusuna VPN client kurmaya çalışmak (Yavaş ve hantaldır, bulut fonksiyonlarıyla uyumsuzdur).
- Zamanlanmış Görevle Veri Transferi: Her gece Excel veya XML olarak FTP’ye dosya atmak. (Veriler güncel olmaz, anlık bakiye gösterilemez).
Çözüm Mimarisi: Zero Trust & Cloudflare Tunnel
Bağlantıyı dışarıdan içeri (Port açarak) değil, içeriden dışarı (Tünel kurarak) başlatmalıyız. Cloudflare Tunnel, ofisteki sunucunuza kurulan küçük bir servis aracıdır. Dışarıya şifreli bir bağ kurar ve HTTP isteklerini güvenle içeri taşır.
Bunun yanı sıra asla SQL Server ile Cloudflare’i direkt konuşturmamalısınız. Araya sorgu denetçisi olarak hafif bir Node.js API katmanı koymak zorundasınız.
graph LR
A[Web Sunucusu] -- Şifreli İstek --> B((Cloudflare Edge))
B -- Cloudflare Tunnel --> C[Ofis Sunucusu (Node.js API)]
C -- Local 1433 Portu --> D[(MSSQL - Mikro DB)]
Güvenli Node.js Proxy Kurulumu (Güvenlik Katmanı)
Sadece SELECT sorgularına izin veren ve statik API-KEY doğrulayan Node API:
// server.js
const express = require('express');
const sql = require('mssql');
const app = express();
app.use(express.json());
// GÜVENLİK 1: Hard-Coded API Key (Sadece bizim web sunucumuz bilebilir)
const AstaFlow_API_KEY = "SUPER_SECRET_COMPLEX_KEY_987654321";
const pool = new sql.ConnectionPool({
server: '127.0.0.1',
database: 'MikroDB_V16',
user: 'sa', // Veya sadece DataReader yetkisine sahip bir SQL kullanıcısı
password: 'very_secure_password',
options: { encrypt: false, trustServerCertificate: true },
pool: { max: 10, min: 2 },
});
pool.connect();
app.post('/api/mikro-query', async (req, res) => {
// Authorization Kontrolü
if (req.headers['x-api-key'] !== AstaFlow_API_KEY) {
return res.status(401).json({ error: 'Unauthorized Access' });
}
const { query, params } = req.body;
// GÜVENLİK 2: INSERT, UPDATE, DROP gibi komutları Regex ile Reddet!
if (!/^\s*SELECT/i.test(query)) {
return res.status(403).json({ error: 'DB Firewall: Only SELECT statements are allowed on this tunnel.' });
}
try {
const request = pool.request();
// Parametreleri (SQL Injection Koruması) güvenle bind et
if (params) {
Object.entries(params).forEach(([key, value]) => {
request.input(key, value);
});
}
const result = await request.query(query);
res.json({ success: true, data: result.recordset });
} catch (err) {
res.status(500).json({ error: 'Query Execution Failed' });
}
});
app.listen(3000, () => console.log('AstaFlow Proxy is listening on port 3000'));
Adım Adım Tünel (Tunnel) Konfigürasyonu
- Ofis sunucunuza
cloudflared.exeindirin. - CMD’yi yönetici açıp:
cloudflared tunnel loginyapın. (Tarayıcı açılır ve Cloudflare hesabınızı bağlar). - Tünel yaratın:
cloudflared tunnel create mikrotunnel - DNS bağlantısı yapın:
cloudflared tunnel route dns mikrotunnel api.sirketiniz.com - Tüneli Node.js portuna yönlendirin:
cloudflared tunnel run --url http://localhost:3000 mikrotunnel
Bitti. Artık api.sirketiniz.com adresi ofis sunucunuza HTTPS sertifikalı ve DDOS korumalı olarak bağlanıyor.
Edge Cases (Ölümcül Riskler) ve Optimizasyon
- Daemon Çökmesi (Windows Service):
cloudflared runkomutunu siyah CMD ekranında açık bırakırsanız, biri ekranı kapattığında veya sunucu yeniden başladığında dış dünya kopar. Bunu mutlaka bir Windows Servisi olarak kaydetmelisiniz:cloudflared service install. - Karakter Seti Çöplüğü: Node.js, Mssql ile konuşurken Türkçe karakterler (Örn:
Ş,İ,Ğ) soru işaretine dönebilir. Node sunucusunun çalıştığı Windows Region Settings’in Turkish olduğundan emin olun ve response’acharset=utf-8Header’ı basmayı unutmayın. - HTTP Timeout: Cloudflare’in ücretsiz sürümünde bir HTTP isteği 100 saniye içinde cevap alamazsa zorla koparılır (524 Error). Mikro’dan devasa bir yaşlandırma veya maliyet raporu çekerken sorgu 100 saniyeyi geçerse tünel patlar. Çözüm: AstaFlow’da kullandığımız Webhook tabanlı veya Pagination (Sayfalama - TOP 500) kurgularıdır.
Bu Bilgiyi Nereden Biliyoruz? (Kaynaklar)
- AstaFlow Case Study: AstaFlow ERP Web Entegrasyon Mimarisi
- İlgili Çözüm: Mikro’da Veritabanları Arası Güvenli Veri Aktarımı