Mlango ulio wazi na uliosahaulika ndiyo njia ya kawaida ya kuingia kwenye seva: hifadhidata kwenye anwani ya umma, dashibodi ya utatuzi, container iliyochapisha mlango ambao hakuna aliyetaka. Ukaguzi unachukua dakika moja ukijua amri mbili na mtego mmoja. Tulifanya kila kitu hapa chini kwenye seva mpya ya Ubuntu 24.04 kutoka kwenye image yetu na kuichanganua kutoka mashine ya pili, kwa hiyo matokeo ndiyo utakayoona kwenye seva yako.
1. Nini kinasikiliza
Amri ni ss. Herufi zinamaanisha TCP, UDP, soketi zinazosikiliza, namba za milango na jina la mchakato:
sudo ss -tulpn
Kwenye seva mpya inachapisha mistari sita:
Netid State Local Address:Port Process
udp UNCONN 127.0.0.54:53 systemd-resolve
udp UNCONN 127.0.0.53%lo:53 systemd-resolve
tcp LISTEN 127.0.0.54:53 systemd-resolve
tcp LISTEN 127.0.0.53%lo:53 systemd-resolve
tcp LISTEN 0.0.0.0:22 sshd
tcp LISTEN [::]:22 sshd
Safu muhimu ni Local Address. Inakuambia nani anaweza kuunganishwa:
| Anwani | Nani anaweza kuifikia |
|---|---|
127.0.0.1:… au 127.0.0.53 | Programu kwenye seva hii tu |
0.0.0.0:… | Yeyote kupitia IPv4, isipokuwa firewall izuie |
[::]:… | Yeyote kupitia IPv6 (kwa kawaida IPv4 pia) |
10.0.0.5:… (anwani maalum) | Yeyote anayeweza kufikia anwani hiyo |
Kwa hiyo seva mpya inafichua kitu kimoja tu: SSH kwenye mlango 22, kupitia IPv4 na IPv6. DNS resolver kwenye 127.0.0.53 ni ya faragha.
Ili kuorodhesha tu kile intaneti ingeweza kuona, chuja anwani za loopback:
sudo ss -tlnp | awk 'NR>1 && $4 !~ /^(127\.|\[::1\])/ {print $4, $6}'
Endesha hii baada ya kila usakinishaji. Tulisakinisha nginx, Docker na programu ndogo ya Python, na orodha ilikua kutoka mistari 2 hadi 10, ikiwemo docker-proxy kwenye 0.0.0.0:8081 na soketi ya containerd kwenye mlango wa localhost wa nasibu.
2. Mchakato gani unashikilia mlango
Mlango ukiwa umeshikiliwa na unataka kujua na nani:
sudo lsof -i :80 -P -n
sudo fuser 80/tcp
sudo ss -tlnp 'sport = :80'
lsof ndiyo rahisi zaidi kusoma. Kwa nginx ilionyesha mchakato mkuu kama root na worker kama www-data, yote kwenye *:80, kwa IPv4 na IPv6. fuser inachapisha PID tu, inafaa kwenye skripti. Ukihitaji kuachilia mlango, simamisha huduma badala ya kuua PID, vinginevyo systemd itaianzisha tena: sudo systemctl stop nginx.
3. Intaneti inaona nini
ss inaonyesha mtazamo wa seva. Mtazamo wa intaneti unaweza kuwa tofauti, kwa sababu kuna firewall katikati au huduma imefungwa kwenye 127.0.0.1. Ili kuona picha halisi, changanua seva kutoka mashine nyingine, laptop yako au seva ya pili. Chombo ni nmap (apt install nmap, au kisakinishi kutoka nmap.org kwa Windows na macOS).
nmap your-server-ip
nmap -p- your-server-ip
nmap -p 22,80,443,3306 your-server-ip
Muundo wa kwanza unakagua milango 1,000 inayotumika zaidi, wa pili yote 65,535, wa tatu orodha. Kwenye seva yetu mpya, kabla ya firewall yoyote:
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 6.83 seconds
Uchanganuzi kamili wa milango 65,535 ulichukua sekunde 8.9 na ukapata mlango ule ule mmoja. Milango iliyofungwa hujibu mara moja kwa reset, ndiyo maana kuichanganua ni haraka.
Hali tatu ni muhimu:
- open: programu ilikubali muunganisho. Hili ndilo eneo lako la mashambulizi.
- closed: seva ilijibu kwamba hakuna kinachosikiliza hapo. Salama, lakini inathibitisha kuwa seva ipo na kile isichoendesha.
- filtered: hakuna jibu. Firewall ilitupa pakiti. Kichanganuzi hakiwezi kujua kama kuna huduma nyuma yake.
Kwa mlango mmoja bila kusakinisha chochote, nc -zv ip-ya-seva 443 inajibu succeeded au refused, na kwenye mlango uliochujwa inasubiri hadi muda uishe. Kwa UDP ongeza -sU kwenye nmap na ujiandae kusubiri; kwenye seva yetu milango mitatu ya kawaida ya UDP, 53, 123 na 161, ilikuwa closed.
Dokezo kwa mipango ya NAT: kutoka intaneti unafikika tu mlango wa SSH tuliokupelekea. Uchanganuzi wa anwani inayoshirikiwa unaonyesha ukingo wetu, si seva yako, na milango mingine haifikiki bila kujali kinachosikiliza humo. Kwenye mpango wenye anwani yake ya IPv4, kila mlango ulio wazi unausimamia wewe.
4. Funga usichohitaji
Njia tatu, kutoka bora zaidi hadi pana zaidi.
Funga kwenye localhost. Ikiwa huduma inatumiwa na programu kwenye seva tu, ifanye isikilize kwenye 127.0.0.1. Tuliendesha programu ndogo ya wavuti kwa --bind 127.0.0.1 8080: ss iliionyesha kwenye 127.0.0.1:8080, na nmap kutoka nje iliripoti 8080/tcp closed. Kwa hifadhidata huu ndio mpangilio sahihi wa awali: Redis, MySQL na PostgreSQL kwenye Ubuntu husikiliza localhost tangu mwanzo, na miongozo yetu ya Redis na MySQL inaiacha hivyo.
Simamisha huduma. sudo systemctl disable --now jina huondoa msikilizaji kabisa. Kagua kwa ss kwamba umeondoka.
Washa firewall. Ruhusu SSH kwanza, kisha unachotoa, kisha washa:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw enable
sudo ufw status verbose
Uchanganuzi kutoka nje ulibadilika kabisa:
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
8081/tcp open blackice-icecap
Nmap done: 1 IP address (1 host up) scanned in 10.18 seconds
Kila mlango usioruhusiwa ulibadilika kutoka closed kuwa filtered, na uchanganuzi kamili wa milango 65,535 sasa ulichukua sekunde 110 badala ya 8.9. Muda zaidi kwa kila mlango kwa kichanganuzi, taarifa chache kuhusu seva yako. Mwongozo wetu wa UFW unashughulikia kikomo cha kasi, kuruhusu IP moja na IPv6.
Lakini angalia mstari wa tatu.
5. Mshangao wa Docker
Mlango 8081 ulibaki wazi firewall ikiwa imewashwa na bila sheria inayouruhusu. Mlango huo ni wa container tuliyoianzisha kwa docker run -p 8081:80 nginx:alpine. Docker huongeza sheria zake kwenye firewall ya kernel, na hizo hutathminiwa kabla ya zile za ufw. Sheria iliyoandika kwenye seva yetu:
-A DOCKER ! -i docker0 -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:80
Kila pakiti kwa mlango 8081 hupelekwa ndani ya container kabla ufw haijapata nafasi ya kusema. Kila container yenye -p au kipengele cha ports: hufanya hivi, na ss huionyesha kwa uaminifu kama docker-proxy kwenye 0.0.0.0:8081.
Suluhisho ni kuchapisha kwenye localhost tu:
docker rm -f web
docker run -d --name web -p 127.0.0.1:8081:80 nginx:alpine
Kwenye Compose andika "127.0.0.1:8081:80" chini ya ports:. Baada ya mabadiliko, ss ilionyesha 127.0.0.1:8081, sheria ya Docker ilipata -d 127.0.0.1/32, na uchanganuzi kutoka nje uliripoti 8081/tcp filtered. Weka nginx kama reverse proxy mbele kwa upande wa umma, pamoja na HTTPS, ili milango pekee iliyo wazi kwenye seva iwe 22, 80 na 443.
Orodha ya ukaguzi baada ya kila mabadiliko
sudo ss -tulpn: kila mstari wenye0.0.0.0au[::]ni kitu ulichotaka kufichua?nmap ip-ya-sevakutoka laptop yako: milango iliyo wazi inalingana?- Hifadhidata, cache au paneli ya usimamizi kwenye anwani ya umma: ihamishe leo kwenda
127.0.0.1au nyuma ya firewall. - Kila kipengele cha
ports:cha Docker: kinaanza na127.0.0.1:kama si mlango wa wavuti wa umma? - SSH iko wazi kwa wote: ongeza fail2ban au kuingia kwa ufunguo pekee.
Kwenye Windows Server ukaguzi ule ule ni Get-NetTCPConnection -State Listen, na sheria ziko kwenye Windows Firewall. Kila mpango wa Linux, kuanzia Nano ya $3, una toleo lenye anwani yake ya IPv4, na hapo unachoona kwenye ss ndicho ulimwengu unachoona, ukiondoa kile firewall yako inachozuia.
Maoni
Bado hakuna maoni. Kuwa wa kwanza.