EQVPS
DashibodiAnza

Jinsi ya kukagua milango iliyo wazi kwenye VPS: nini kinasikiliza, intaneti inaona nini, na mshangao wa Docker

Ona kila mlango ambao seva yako inasikiliza, tafuta mchakato ulio nyuma yake, changanua seva kutoka nje kama mshambuliaji angefanya, na funga usichohitaji. Pamoja na mlango wa Docker unaobaki wazi hata firewall ikiwa imewashwa. Kila namba ilipimwa kwenye seva mpya ya Ubuntu 24.04.

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:

AnwaniNani anaweza kuifikia
127.0.0.1:… au 127.0.0.53Programu 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

  1. sudo ss -tulpn: kila mstari wenye 0.0.0.0 au [::] ni kitu ulichotaka kufichua?
  2. nmap ip-ya-seva kutoka laptop yako: milango iliyo wazi inalingana?
  3. Hifadhidata, cache au paneli ya usimamizi kwenye anwani ya umma: ihamishe leo kwenda 127.0.0.1 au nyuma ya firewall.
  4. Kila kipengele cha ports: cha Docker: kinaanza na 127.0.0.1: kama si mlango wa wavuti wa umma?
  5. 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.

Maswali

Ni milango gani iliyo wazi kwenye VPS mpya?

Kwenye image yetu ya Ubuntu 24.04, mmoja tu: SSH kwenye mlango 22. Mbali na huo, kinachosikiliza ni DNS resolver ya ndani kwenye 127.0.0.53 na 127.0.0.54, ambayo intaneti haiwezi kuifikia. Uchanganuzi wa milango yote 65,535 ya TCP kutoka mashine nyingine ulipata mlango mmoja tu ulio wazi.

Kuna tofauti gani kati ya mlango closed na filtered?

Closed inamaanisha seva ilijibu kwamba hakuna kinachosikiliza hapo, kwa hiyo kichanganuzi kinajua mara moja. Filtered inamaanisha hakuna jibu kabisa, ndivyo firewall inavyofanya inapotupa pakiti. Zote mbili zinazuia wavamizi, lakini filtered pia inaficha huduma zilizopo na inafanya uchanganuzi kamili kuwa polepole mara kumi na mbili hivi kwenye seva yetu.

Kwa nini ss inaonyesha mlango ambao nmap inasema ni closed?

Huduma inasikiliza kwenye 127.0.0.1 tu, anwani ya loopback. Programu kwenye seva yenyewe zinaweza kuunganishwa, kutoka nje hakuna. Kwenye ss angalia safu ya Local Address: 127.0.0.1:8080 ni ya faragha, 0.0.0.0:8080 au [::]:8080 inafikika kutoka intaneti ikiwa firewall inaruhusu.

Nimewasha ufw, kwa nini mlango wangu wa Docker bado uko wazi?

Docker huandika sheria zake za firewall, na hizo hukaguliwa kabla ya zile za ufw. Container iliyoanzishwa kwa -p 8081:80 ilifikika kutoka nje kwenye seva yetu ufw ikiwa imewashwa na bila sheria ya 8081. Chapisha kwenye localhost badala yake, -p 127.0.0.1:8081:80, na weka nginx au Caddy mbele kwa upande wa umma.

Ninakaguaje mlango kutoka kwenye kompyuta yangu?

Endesha nc -zv ip-ya-seva 443 kwa mlango mmoja, au sakinisha nmap na uendeshe nmap ip-ya-seva kwa milango elfu inayotumika zaidi. Kwenye mpango wa NAT, kutoka intaneti unajibu mlango wako wa SSH uliopelekwa tu; mengine yote hayafikiki kwa makusudi.

Maoni

Bado hakuna maoni. Kuwa wa kwanza.

Acha maoni

Maoni yanakaguliwa kabla ya kuonekana.