ተከፍቶ የተረሳ ፖርት ወደ ሰርቨር የመግባት የተለመደው መንገድ ነው፦ በሕዝባዊ አድራሻ ላይ ያለ ዳታቤዝ፣ የማረሚያ ዳሽቦርድ፣ ማንም ያልፈለገውን ፖርት ያተመ ኮንቴይነር። ሁለት ትዕዛዞችንና አንድ ወጥመድን ካወቁ ማረጋገጡ አንድ ደቂቃ ይወስዳል። ከዚህ በታች ያለውን ሁሉ ከኢሜጃችን በተነሳ አዲስ Ubuntu 24.04 ሰርቨር ላይ ሠርተን ከሁለተኛ ማሽን ቃኘነው፤ ስለዚህ ውጤቶቹ በራስዎ ሰርቨር ላይ የሚያዩት ናቸው።
1. ምን እያዳመጠ ነው
ትዕዛዙ ss ነው። ፊደላቱ TCP፣ UDP፣ የሚያዳምጡ ሶኬቶች፣ የፖርት ቁጥሮች እና የሂደቱ ስም ማለት ናቸው፦
sudo ss -tulpn
በአዲስ ሰርቨር ላይ ስድስት መስመሮችን ያትማል፦
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
ዋናው ዓምድ Local Address ነው። ማን መገናኘት እንደሚችል ይነግርዎታል፦
| አድራሻ | ማን ይደርስበታል |
|---|---|
127.0.0.1:… ወይም 127.0.0.53 | በዚህ ሰርቨር ላይ ያሉ ፕሮግራሞች ብቻ |
0.0.0.0:… | ፋየርዎሉ ካላገደ በIPv4 ማንም |
[::]:… | በIPv6 ማንም (ብዙውን ጊዜ IPv4ም) |
10.0.0.5:… (የተወሰነ አድራሻ) | ያንን አድራሻ መድረስ የሚችል ማንም |
ስለዚህ አዲሱ ሰርቨር ወደ ውጭ የሚያጋልጠው አንድ ነገር ብቻ ነው፦ SSH በፖርት 22፣ በIPv4 እና በIPv6። በ127.0.0.53 ላይ ያለው DNS ሪዞልቨር የግል ነው።
ኢንተርኔት ሊያየው የሚችለውን ብቻ ለመዘርዘር የloopback አድራሻዎችን ያጣሩ፦
sudo ss -tlnp | awk 'NR>1 && $4 !~ /^(127\.|\[::1\])/ {print $4, $6}'
ይህንን ከእያንዳንዱ ጭነት በኋላ ያስኪዱ። nginx፣ Docker እና አንድ ትንሽ የPython መተግበሪያ ጫንን፣ ዝርዝሩም ከ2 መስመሮች ወደ 10 አደገ፤ ከነዚህም መካከል በ0.0.0.0:8081 ላይ docker-proxy እና በዘፈቀደ localhost ፖርት ላይ የcontainerd ሶኬት ይገኙበታል።
2. ፖርቱን የያዘው የትኛው ሂደት ነው
ፖርት ተይዞ በማን እንደተያዘ ማወቅ ሲፈልጉ፦
sudo lsof -i :80 -P -n
sudo fuser 80/tcp
sudo ss -tlnp 'sport = :80'
ለማንበብ በጣም ቀላሉ lsof ነው። ለnginx አንድ ዋና ሂደት በroot እና አንድ worker በwww-data አሳየ፣ ሁለቱም በ*:80 ላይ፣ ለIPv4 እና IPv6። fuser PIDዎችን ብቻ ያትማል፣ በስክሪፕቶች ውስጥ ጠቃሚ ነው። ፖርቱን ነጻ ማድረግ ካስፈለገ PIDውን ከመግደል ይልቅ አገልግሎቱን ያቁሙ፤ አለበለዚያ systemd እንደገና ያስጀምረዋል፦ sudo systemctl stop nginx።
3. ኢንተርኔት ምን ያያል
ss የሰርቨሩን እይታ ያሳያል። የኢንተርኔት እይታ ሊለይ ይችላል፤ ምክንያቱም መሐል ፋየርዎል አለ ወይም አገልግሎቱ ከ127.0.0.1 ጋር ታስሯል። እውነተኛውን ምስል ለማየት ሰርቨሩን ከሌላ ማሽን፣ ከላፕቶፕዎ ወይም ከሁለተኛ ሰርቨር ይቃኙ። መሣሪያው nmap ነው (apt install nmap፣ ወይም በWindows እና macOS ላይ ከnmap.org ያለው ጫኚ)።
nmap your-server-ip
nmap -p- your-server-ip
nmap -p 22,80,443,3306 your-server-ip
የመጀመሪያው ቅጽ 1,000 በጣም የተለመዱ ፖርቶችን፣ ሁለተኛው ሁሉንም 65,535፣ ሦስተኛው ዝርዝርን ይፈትሻል። በአዲሱ ሰርቨራችን ላይ፣ ምንም ፋየርዎል ከመኖሩ በፊት፦
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
የ65,535 ፖርቶች ሙሉ ቅኝት 8.9 ሰከንድ ወሰደ እና ያንኑ ብቸኛ ፖርት አገኘ። የተዘጉ ፖርቶች ወዲያውኑ በreset ይመልሳሉ፤ ለዚህ ነው መቃኘታቸው ፈጣን የሆነው።
ሦስት ሁኔታዎች ወሳኝ ናቸው፦
- open፦ አንድ ፕሮግራም ግንኙነቱን ተቀበለ። ይህ የጥቃት ገጽዎ ነው።
- closed፦ ሰርቨሩ እዚያ ምንም እንደማያዳምጥ መለሰ። ደህንነቱ የተጠበቀ ነው፣ ግን ሰርቨሩ መኖሩንና ምን እንደማያስኬድ ያረጋግጣል።
- filtered፦ መልስ የለም። ፋየርዎል ፓኬቱን ጣለ። ቃኚው ከኋላ አገልግሎት መኖሩን ማወቅ አይችልም።
ምንም ሳይጭኑ ለአንድ ፖርት nc -zv የሰርቨር-ip 443 succeeded ወይም refused ይመልሳል፣ በfiltered ፖርት ላይ ደግሞ ጊዜው እስኪያልቅ ይጠብቃል። ለUDP በnmap ላይ -sU ይጨምሩ እና ለመጠበቅ ይዘጋጁ፤ በእኛ ሰርቨር ላይ ሦስቱ የተለመዱ የUDP ፖርቶች፣ 53፣ 123 እና 161፣ closed ነበሩ።
ለNAT ዕቅዶች ማስታወሻ፦ ከኢንተርኔት የሚደረሰው ለእርስዎ ያስተላለፍነው የSSH ፖርት ብቻ ነው። የጋራ አድራሻውን መቃኘት የእርስዎን ሰርቨር ሳይሆን የእኛን ጠርዝ ያሳያል፣ ሌሎቹ ፖርቶችም ምንም ቢያዳምጥባቸው አይደረሱም። የራሱ IPv4 አድራሻ ባለው ዕቅድ ላይ እያንዳንዱን ክፍት ፖርት እርስዎ ያስተዳድራሉ።
4. የማያስፈልገውን ይዝጉ
ከምርጡ እስከ ሰፊው ሦስት መንገዶች።
ከlocalhost ጋር ያስሩ። አንድን አገልግሎት የሚጠቀሙት በሰርቨሩ ላይ ያሉ ፕሮግራሞች ብቻ ከሆኑ በ127.0.0.1 ላይ እንዲያዳምጥ ያድርጉ። አንድ ትንሽ የድር መተግበሪያ በ--bind 127.0.0.1 8080 አስጀመርን፦ ss በ127.0.0.1:8080 ላይ አሳየው፣ nmap ከውጭ 8080/tcp closed ሪፖርት አደረገ። ለዳታቤዞች ይህ ትክክለኛው ነባሪ ነው፦ Redis፣ MySQL እና PostgreSQL በUbuntu ላይ ከመጀመሪያው በlocalhost ያዳምጣሉ፣ የRedis እና የMySQL መመሪያዎቻችንም እንዲሁ ይተዉታል።
አገልግሎቱን ያቁሙ። sudo systemctl disable --now ስም አዳማጩን ለዘለቄታው ያስወግዳል። በss መጥፋቱን ያረጋግጡ።
ፋየርዎሉን ያብሩ። መጀመሪያ SSHን፣ ከዚያ የሚያቀርቡትን ይፍቀዱ፣ ከዚያ ያንቁ፦
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw enable
sudo ufw status verbose
ከውጭ የተደረገው ቅኝት ሙሉ በሙሉ ተቀየረ፦
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
ያልተፈቀደ እያንዳንዱ ፖርት ከclosed ወደ filtered ተቀየረ፣ የ65,535 ፖርቶች ሙሉ ቅኝትም ከ8.9 ይልቅ 110 ሰከንድ ወሰደ። ለቃኚው በአንድ ፖርት ተጨማሪ ጊዜ፣ ስለ ሰርቨርዎ ያነሰ መረጃ። የUFW መመሪያችን የፍጥነት ገደብን፣ አንድ IP ብቻ መፍቀድን እና IPv6ን ይሸፍናል።
ነገር ግን ሦስተኛውን መስመር ይመልከቱ።
5. የDocker አስገራሚ ነገር
ፖርት 8081 ፋየርዎሉ በርቶ እና የሚፈቅደው ደንብ ሳይኖር ክፍት ሆኖ ቀረ። ያ ፖርት በdocker run -p 8081:80 nginx:alpine ያስጀመርነው ኮንቴይነር ነው። Docker በከርነሉ ፋየርዎል ላይ የራሱን ደንቦች ያክላል፣ እነዚህም ከufw ደንቦች በፊት ይገመገማሉ። በሰርቨራችን ላይ የጻፈው ደንብ፦
-A DOCKER ! -i docker0 -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:80
ወደ ፖርት 8081 የሚመጣ ማንኛውም ፓኬት ufw ቃሉን ከመስጠቱ በፊት ወደ ኮንቴይነሩ ይተላለፋል። -p ወይም የports: ግቤት ያለው እያንዳንዱ ኮንቴይነር ይህንን ያደርጋል፣ ssም በታማኝነት በ0.0.0.0:8081 ላይ docker-proxy ብሎ ያሳየዋል።
ማስተካከያው በlocalhost ላይ ብቻ ማተም ነው፦
docker rm -f web
docker run -d --name web -p 127.0.0.1:8081:80 nginx:alpine
በCompose ውስጥ ከports: በታች "127.0.0.1:8081:80" ይጻፉ። ከለውጡ በኋላ ss 127.0.0.1:8081 አሳየ፣ የDocker ደንቡ -d 127.0.0.1/32 አገኘ፣ ከውጭ የተደረገው ቅኝትም 8081/tcp filtered ሪፖርት አደረገ። ለሕዝባዊው ጎን ፊት ለፊት nginxን እንደ reverse proxy በHTTPS ያድርጉ፣ በሰርቨሩ ላይ ክፍት የሆኑት ፖርቶች 22፣ 80 እና 443 ብቻ እንዲሆኑ።
ከእያንዳንዱ ለውጥ በኋላ የማረጋገጫ ዝርዝር
sudo ss -tulpn፦0.0.0.0ወይም[::]ያለበት እያንዳንዱ መስመር ሊያጋልጡት የፈለጉት ነገር ነው?- ከላፕቶፕዎ
nmap የሰርቨር-ip፦ ክፍት ፖርቶቹ ይዛመዳሉ? - በሕዝባዊ አድራሻ ላይ ያለ ዳታቤዝ፣ ካሽ ወይም የአስተዳዳሪ ፓነል፦ ዛሬውኑ ወደ
127.0.0.1ወይም ከፋየርዎሉ ጀርባ ያዛውሩት። - እያንዳንዱ የDocker
ports:ግቤት፦ ሕዝባዊው የድር ፖርት ካልሆነ በ127.0.0.1:ይጀምራል? - SSH ለሁሉም ክፍት ነው፦ fail2ban ወይም በቁልፍ ብቻ መግባትን ያክሉ።
በWindows Server ላይ ተመሳሳዩ ፍተሻ Get-NetTCPConnection -State Listen ነው፣ ደንቦቹም በWindows Firewall ውስጥ ይገኛሉ። ከ$3 Nano ጀምሮ እያንዳንዱ የLinux ዕቅድ የራሱ IPv4 አድራሻ ያለው ስሪት አለው፤ እዚያ በss ውስጥ የሚያዩትን ዓለም ሁሉ ያያል፣ ፋየርዎልዎ ከሚያግደው በስተቀር።
አስተያየቶች
እስካሁን አስተያየቶች የሉም። መጀመሪያ ይሁኑ።