Linuxలో ports అంటే ఏమిటి, సేవలు ఎలా listen చేస్తాయి
Port అనేది ఒక సంఖ్య. ఒకే సర్వర్లో అనేక సేవలు నడిచేలా చేస్తుంది. ss కమాండ్తో ఏయే పోర్ట్లు listen చేస్తున్నాయో చూడండి. local, public పోర్ట్ల తేడా తెలుసుకోండి.
పోర్ట్ అసలు అంటే ఏమిటి
పోర్ట్ అనేది ఒక సంఖ్య. ఒకే సర్వర్లో ఒకేసారి అనేక సేవలు నడిచేలా చేస్తుంది. వాటి ట్రాఫిక్ కలవదు. మీ VPSలో ఒక IP చిరునామా ఉంటుంది. అయితే అది ఒకేసారి వెబ్ సర్వర్, SSH సర్వర్, డేటాబేస్ నడిపించవచ్చు. ఒక ప్యాకెట్ వచ్చినప్పుడు, ఆపరేటింగ్ సిస్టమ్ అది వాటిలో దేనికి వచ్చిందో తెలుసుకోవాలి. పోర్ట్ సంఖ్య దానికి సమాధానం. వెబ్ ట్రాఫిక్ పోర్ట్ 443కి వెళ్తుంది. SSH పోర్ట్ 22కి వెళ్తుంది. IP చిరునామా ప్యాకెట్ను మీ సర్వర్కు చేరుస్తుంది. పోర్ట్ దాన్ని ఆ సర్వర్లో సరైన ప్రోగ్రామ్కి చేరుస్తుంది.
పోర్ట్ అనేది 16-బిట్ సంఖ్య. 16 బిట్లు 0 నుండి 65535 వరకు ఇస్తాయి. 0 రిజర్వ్ చేయబడింది. కాబట్టి పోర్ట్లు ఆచరణలో 1 నుండి 65535 వరకు ఉంటాయి. 1024 కంటే తక్కువ పోర్ట్లు "వెల్-నోన్" పోర్ట్లు. అవి తెరవడానికి root అవసరం. అందుకే ప్రామాణిక సేవలు అక్కడే ఉంటాయి: SSH కోసం 22, HTTP కోసం 80, HTTPS కోసం 443, DNS కోసం 53. 1024 కంటే ఎక్కువ ఏదైనా సాధారణ ప్రోగ్రామ్లకు అందుబాటులో ఉంటుంది.
రెండు రకాలు ఉన్నాయి, TCP మరియు UDP. ఒకదానిలోని పోర్ట్ సంఖ్య, మరొకదానిలోని అదే సంఖ్య నుండి వేరుగా ఉంటుంది. TCP అనేది కనెక్షన్ ఆధారిత ప్రోటోకాల్. చాలా సేవలు దీన్ని ఉపయోగిస్తాయి. ఉదాహరణలు SSH, HTTP, డేటాబేస్లు. UDP కనెక్షన్ లేనిది. DNS మరియు కొన్ని VPN ల వంటి వాటికి ఉపయోగిస్తారు. మీరు ఫైర్వాల్ తెరిచినప్పుడు సాధారణంగా దేనిని ఉపయోగిస్తున్నారో పేర్కొంటారు, ఉదాహరణకు 22/tcp.
లిజనింగ్ అంటే ఒక ప్రోగ్రామ్ పోర్ట్పై వేచి ఉండటం
కనెక్షన్లను స్వీకరించాలనుకునే ప్రోగ్రామ్, కర్నల్ను ఒక పోర్ట్పై "లిజన్" చేయమని అడుగుతుంది. ఆ క్షణం నుండి మెషిన్లో ఆ పోర్ట్ ఓపెన్ అవుతుంది. ఫైర్వాల్ లెక్కలోకి తీసుకుంటూ, అక్కడికి వచ్చే దేనికైనా ఆ ప్రోగ్రామ్ స్పందిస్తుంది. దేనిపైనూ లిజన్ అవ్వని పోర్ట్, కనెక్షన్లను సరళంగా తిరస్కరిస్తుంది. కాబట్టి ఏ భద్రతా తనిఖీలోనైనా మొదటి ప్రశ్న ఇది: ఏమి లిజన్ అవుతోంది, మరియు ఎక్కడ.
దానికి సమాధానమిచ్చే కమాండ్ ss:
sudo ss -tlnpఈ ఫ్లాగ్లు అర్థం TCP (t), లిజనింగ్ సాకెట్లు మాత్రమే (l), సంఖ్యా పోర్ట్లు (n, కాబట్టి మీరు ssh కాకుండా 22 చూస్తారు), మరియు యాజమాన్య ప్రక్రియ (p). ఒక సాధారణ ఫలితం:
State Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 sshd
LISTEN 0 127.0.0.1:5432 postgres
LISTEN 0 [::]:80 nginxProcess కాలమ్ ఏ ప్రోగ్రామ్ ప్రతి పోర్ట్ను కలిగి ఉందో చెబుతుంది. మీరు నడుపుతూ ఉండటానికి ఇష్టపడని దేనినైనా ఇలా ట్రాక్ చేసుకోవచ్చు.
లోకల్ అడ్రస్ కాలమ్ అనేది ముఖ్యమైన భాగం
ప్రతి పోర్ట్ ముందు ఉన్న చిరునామాను జాగ్రత్తగా చదవండి. ఎందుకంటే అది ఎవరు సేవను చేరుకోగలరో నిర్ణయిస్తుంది. మీరు నిరంతరం చూసే మూడు సందర్భాలు ఉన్నాయి.
0.0.0.0:22 అంటే "ఈ మెషిన్కు ఉన్న ప్రతి IPv4 చిరునామాపై లిజన్ అవ్వండి," దాని పబ్లిక్ చిరునామా కూడా సహా. ఫైర్వాల్ అనుమతించితే, ఈ సేవ IPv4 ద్వారా ఇంటర్నెట్ నుండి చేరుకోవచ్చు.
[::]:80 అంటే IPv6 కూడా అదే: ప్రతి IPv6 చిరునామాపై లిజన్ అవ్వండి, పబ్లిక్ కూడా సహా. చాలా ప్రోగ్రామ్లు డిఫాల్ట్గా ఇక్కడ బైండ్ అవుతాయి. మరియు Linuxలో :: సాకెట్ తరచుగా IPv4 ను కూడా అంగీకరిస్తుంది.
127.0.0.1:5432 అంటే "లూప్బ్యాక్పై మాత్రమే లిజన్ అవ్వండి." 127.0.0.1 అనేది ఒక మెషిన్ తనతో మాట్లాడటానికి ఉపయోగించే చిరునామా. అది ఎక్కడి నుండి కూడా రూట్ చేయబడదు. ఇక్కడ బైండ్ అయిన సేవ ఒకే సర్వర్ నుండి మాత్రమే చేరుకోవచ్చు. మీ ఫైర్వాల్ ఏమి చెప్పినా ఇంటర్నెట్ నుండి ఎప్పటికీ చేరుకోలేదు. పైన ఉన్న ఆ Postgres లైన్ నిర్మాణం ప్రకారం సురక్షితం.
ఆచరణాత్మక నియమం ఇందులోనే నిష్పన్నమవుతుంది: మీ స్వంత అప్లికేషన్లు మాత్రమే ఉపయోగించే డేటాబేస్, క్యాచ్, లేదా అడ్మిన్ ప్యానెల్ 0.0.0.0 కాకుండా 127.0.0.1కి బైండ్ అవ్వాలి. అది పబ్లిక్ చిరునామాపై ఎప్పుడూ లిజన్ అవ్వనంత వరకు, దాన్ని చేరుకోవడానికి హ్యాకర్కు ఏమీ ఉండదు.
లిజనింగ్ అనేది రీచబుల్ కాదు
మరొక వ్యత్యాసం చాలా గందరగోళాన్ని తొలగిస్తుంది. మెషిన్లో ఒక పోర్ట్ ఓపెన్ అవ్వడం అంటే, ఒక ప్రోగ్రామ్ లిజన్ అవుతోందని. అది ఆ పోర్ట్ బయట నుండి రీచబుల్గా ఉండటం కంటే భిన్నంగా ఉంటుంది. అంటే ఫైర్వాల్ దాన్ని అనుమతిస్తుంది. రిమోట్ క్లయింట్ కనెక్ట్ అవ్వడానికి రెండూ నిజం కావాలి.
కాబట్టి నియంత్రణలో రెండు పొరలు ఉన్నాయి. ప్రతి సేవ బైండ్ అయ్యే చిరునామాను సెట్ చేడం ద్వారా మీరు ఏమి లిజన్ అవుతుందో నిర్ణయిస్తారు. మరియు ఫైర్వాల్తో బయటి ప్రపంచం ఏమి చేరుకోగలదో మీరు నిర్ణయిస్తారు. సక్రమంగా నడిచే సర్వర్ రెండింటినీ ఉపయోగిస్తుంది: సేవలు అవసరమైన చోట మాత్రమే బైండ్ అవుతాయి. మరియు ఫైర్వాల్ మీరు స్పష్టంగా అనుమతించని ప్రతిదాన్ని తిరస్కరిస్తుంది. ssతో ఏమి లిజన్ అవుతోందో చదవడం మొదటి దశ. ఫైర్వాల్ ఏమి అనుమతిస్తుందో నిర్ణయించడం రెండవ దశ, UFWతో ఫైర్వాల్స్ 101లో వివరించబడింది.
ఇక్కడ ఒక సూక్ష్మత ఉంది. అది ప్రజలను ఇబ్బందికి గురిచేస్తుంది. IPv4 మరియు IPv6 వేరుగా ఉంటాయి. IPv4 మాత్రమే కవర్ చేసే ఫైర్వాల్, IPv6లో [::] సేవలను ఓపెన్గా వదిలేస్తుంది. ఆ ప్రత్యేక ఉచించుకోవడానికి దానికే ప్రత్యేక పోస్ట్ ఉంది: IPv6 ఫైర్వాల్ ఉచించుకోవడం.
FAQ
నా Linux సర్వర్లో ఏ పోర్ట్లు ఓపెన్గా ఉన్నాయో నేను ఎలా చూస్తాను?
TCP కోసం sudo ss -tlnp లేదా UDP కోసం sudo ss -ulnp రన్ చేయండి. అది ప్రతి లిజనింగ్ సాకెట్, పోర్ట్, అది బైండ్ అయిన లోకల్ చిరునామా, మరియు దాన్ని కలిగి ఉన్న ప్రక్రియ జాబితాను ఇస్తుంది. Local Address కాలమ్ చదవండి: 0.0.0.0 లేదా [::] అంటే సేవ నెట్వర్క్కు బహిర్గతమైంది. 127.0.0.1 అంటే అది మెషిన్లోనే లిజన్ అవుతుంది.
0.0.0.0 మరియు 127.0.0.1 మధ్య తేడా ఏమిటి?
0.0.0.0 అంటే "అన్ని IPv4 చిరునామాలపై లిజన్ అవ్వండి," పబ్లిక్ చిరునామా కూడా సహా. కాబట్టి సేవను నెట్వర్క్ నుండి చేరుకోవచ్చు. 127.0.0.1 అనేది లూప్బ్యాక్. మెషిన్ తనతో మాట్లాడటానికి ఉపయోగించే చిరునామా ఇది. అది ఎక్కడి నుండి కూడా రూట్ చేయబడదు. కాబట్టి దానికి బైండ్ అయిన సేవ స్థానికంగా మాత్రమే చేరుకోవచ్చు. అంతర్గత సేవలను 127.0.0.1కి బైండ్ చేయండి తద్వారా అవి ఎప్పుడూ బహిర్గతం కావు.
ఒక సేవ పని చేయడానికి ఫైర్వాల్లో పోర్ట్ను తెరవాలా?
ఇతర మెషిన్ల నుండి చేరుకోవలసిన సేవలకు మాత్రమే. 127.0.0.1కి బైండ్ అయిన సేకి ఫైర్వాల్ రూల్ అవసరం లేదు. ఎందుకంటే బయటి నుండి ఏదీ దాన్ని చేరుకోలేదు. 0.0.0.0 లేదా [::]లో ఉన్న సేవకు ట్రాఫిక్ను అనుమతించడానికి ఫైర్వాల్ రూల్ అవసరం. మీరు ఒకదాన్ని జోడించే వరకు అది డిఫాల్ట్గా తిరస్కరించబడాలి.
TCP పోర్ట్ మరియు UDP పోర్ట్ మధ్య తేడా ఏమిటి?
TCP కనెక్షన్ ఆధారితమైనది. చాలా సేవలు దీన్ని ఉపయోగిస్తాయి. ఉదాహరణలు SSH, వెబ్ సర్వర్లు, డేటాబేస్లు. UDP కనెక్షన్ లేనిది. DNS మరియు కొన్ని VPN లు దీన్ని ఉపయోగిస్తాయి. TCP మరియు UDP లో ఒకే సంఖ్య వేర్వేరు పోర్ట్లు. కాబట్టి 53/tcp మరియు 53/udp వేరుగా ఉంటాయి. మీరు ఫైర్వాల్ రూల్స్ రాసినప్పుడు ప్రోటోకాల్ను పేర్కొంటారు, ఉదాహరణకు 22/tcp.