Port Checker
Controleer of een TCP-poort bereikbaar is op een host of IP-adres.
Poort controleren
Vul een host en poort in, druk op controleren.
Browserbereikbaarheidstest + externe fallback via allorigins.win. Firewalls, NAT en browser-CORS kunnen het resultaat beïnvloeden. RDP/SMB zijn niet testbaar via browser.
Veelgebruikte poorten
Klik om direct in te vullen.
Recente checks
(function(){ const btn=document.querySelector('[data-theme-toggle]'); const root=document.documentElement; let dark=root.getAttribute('data-theme')==='dark'; function apply(){ root.setAttribute('data-theme',dark?'dark':'light'); if(btn)btn.innerHTML=dark? '': ''; } apply(); btn&&btn.addEventListener('click',()=>{dark=!dark;apply()}); })(); function tick(){const n=new Date();const el=document.getElementById('liveTime');if(el)el.textContent=n.toLocaleTimeString('nl-NL',{hour:'2-digit',minute:'2-digit',second:'2-digit'})} tick();setInterval(tick,1000);
const PORTS=[ {port:22,name:'SSH',desc:'Secure Shell remote toegang'}, {port:25,name:'SMTP',desc:'E-mail verzending'}, {port:53,name:'DNS',desc:'Domain Name System'}, {port:80,name:'HTTP',desc:'Onversleuteld web'}, {port:110,name:'POP3',desc:'E-mail ophalen'}, {port:143,name:'IMAP',desc:'E-mail ophalen (IMAP)'}, {port:443,name:'HTTPS',desc:'Versleuteld web (SSL/TLS)'}, {port:445,name:'SMB',desc:'Windows bestandsdeling'}, {port:1433,name:'MSSQL',desc:'Microsoft SQL Server'}, {port:3306,name:'MySQL',desc:'MySQL / MariaDB'}, {port:3389,name:'RDP',desc:'Remote Desktop Protocol'}, {port:5432,name:'PostgreSQL',desc:'PostgreSQL database'}, {port:5985,name:'WinRM',desc:'Windows Remote Management'}, {port:6379,name:'Redis',desc:'Redis datastore'}, {port:8080,name:'HTTP-alt',desc:'Alternatieve webpoort'}, {port:8443,name:'HTTPS-alt',desc:'Alternatieve HTTPS poort'}, {port:27017,name:'MongoDB',desc:'MongoDB database'}, ];
document.getElementById('portsRef').innerHTML=PORTS.map(p=>`
Gebruik →
`).join('');
function fillPort(port){document.getElementById('portInput').value=port;document.getElementById('ipInput').focus()}
const recents=[]; function setStatus(kind,msg){ const box=document.getElementById('portStatusBox'); const icon=document.getElementById('portStatusIcon'); const txt=document.getElementById('portStatusText'); box.className='status-box'; if(kind==='ok'){box.classList.add('status-ok');icon.textContent='✓'} else if(kind==='fail'){box.classList.add('status-fail');icon.textContent='✕'} else if(kind==='pending'){box.classList.add('status-pending');icon.textContent='⟳'} else{icon.textContent='?'} txt.textContent=msg; }
async function checkPort(){ const ip=document.getElementById('ipInput').value.trim(); const port=document.getElementById('portInput').value.trim(); if(!ip||!port){setStatus('fail','Vul een geldig IP/host en poortnummer in.');return} setStatus('pending',`Controleer ${ip}:${port}…`); let result='fail'; const proto=+port===443?'https':'http'; try{ const ctrl=new AbortController(); const tid=setTimeout(()=>ctrl.abort(),6000); await fetch(`${proto}://${ip}:${port}`,{mode:'no-cors',signal:ctrl.signal}); clearTimeout(tid); result='ok'; setStatus('ok',`Poort ${port} op ${ip} is bereikbaar.`); }catch(e){ if(e.name==='AbortError'){ result='timeout'; setStatus('fail',`Timeout — poort ${port} op ${ip} reageert niet.`); }else{ try{ const tgt=`https://www.yougetsignal.com/tools/open-ports/?remoteAddress=${ip}&portNumber=${port}`; const r=await fetch('https://api.allorigins.win/raw?url='+encodeURIComponent(tgt)); const html=await r.text(); if(/open/i.test(html)&&!/closed/i.test(html)){result='ok';setStatus('ok',`Poort ${port} op ${ip} lijkt open (externe check).`)} else{result='fail';setStatus('fail',`Poort ${port} op ${ip} lijkt gesloten of gefilterd.`)} }catch{setStatus('fail',`Poort ${port} op ${ip} — niet bereikbaar.`)} } } recents.unshift({ip,port,result,ts:new Date()}); if(recents.length>15)recents.pop(); renderRecents(); }
function renderRecents(){ const el=document.getElementById('recentList'); if(!recents.length){el.innerHTML='
';return} el.innerHTML=recents.map(c=>{ const bc=c.result==='ok'?'badge-ok':c.result==='timeout'?'badge-pend':'badge-fail'; const bt=c.result==='ok'?'Open':c.result==='timeout'?'Timeout':'Gesloten'; const t=c.ts.toLocaleTimeString('nl-NL',{hour:'2-digit',minute:'2-digit',second:'2-digit'}); return`
${bt}${t}
`; }).join(''); }
document.getElementById('checkPortBtn').addEventListener('click',checkPort);
document.getElementById('ipInput').addEventListener('keydown',e=>{if(e.key==='Enter')checkPort()});
document.getElementById('portInput').addEventListener('keydown',e=>{if(e.key==='Enter')checkPort()});
document.getElementById('clearPortsBtn').addEventListener('click',()=>{recents.length=0;renderRecents()});