Linux-ல் port என்றால் என்ன? ss கட்டளை விளக்கம்
Port எப்படி சேவைகளை பிரிக்கிறது என்பதை அறியவும். ss கட்டளையால் எது listen செய்கிறது எனப் பார்க்கலாம். local port மற்றும் public port வித்தியாசம் இங்கே விளக்கப்பட்டுள்ளது.
ஒரு போர்ட் உண்மையில் என்ன
ஒரு சேவையகம் ஒரே நேரத்தில் பல சேவைகளை இயக்கி, அவற்றின் போக்குவரத்து கலக்காமல் இருக்க உதவும் எண் போர்ட் ஆகும். உங்கள் VPS-க்கு ஒரு IP முகவரி உள்ளது. ஆனால் அது ஒரே நேரத்தில் ஒரு web சேவையகம், ஒரு SSH சேவையகம், மற்றும் ஒரு database ஆகியவற்றை இயக்கலாம். ஒரு packet வந்ததும், இயக்க முறைமை அது எதற்காக வந்தது என்பதை அறிந்துகொள்ள வேண்டும். போர்ட் எண் அதற்கான விடை. Web போக்குவரத்து போர்ட் 443-க்கு செல்கிறது, SSH போர்ட் 22-க்கு செல்கிறது. IP முகவரி packet-ஐ உங்கள் சேவையகத்திற்கு கொண்டு சேர்க்கிறது. போர்ட் அதை அந்த சேவையகத்தில் உள்ள சரியான நிரலுக்கு கொண்டு சேர்க்கிறது.
போர்ட் என்பது ஒரு 16-bit எண். 16 bits ஆனது 0 முதல் 65535 வரை தருகிறது. 0 ஒதுக்கப்பட்டுள்ளது. எனவே நடைமுறையில் போர்ட்கள் 1 முதல் 65535 வரை இயங்குகின்றன. 1024-க்கு கீழ் உள்ள போர்ட்கள் "well-known" போர்ட்கள். அவற்றைத் திறக்க root தேவை. இதனாலேயே நிலையான சேவைகள் அங்கே உள்ளன: SSH-க்கு 22, HTTP-க்கு 80, HTTPS-க்கு 443, DNS-க்கு 53. 1024-க்கு மேல் உள்ள எதற்கும் சாதாரண நிரல்கள் பயன்படுத்தலாம்.
இதில் TCP மற்றும் UDP என இரண்டு வகைகள் உள்ளன. ஒரு வகையில் உள்ள போர்ட் எண், மற்ற வகையில் உள்ள அதே எண்ணிலிருந்து தனியானது. TCP என்பது connection-based protocol ஆகும். SSH, HTTP, மற்றும் database-கள் போன்ற பெரும்பாலான சேவைகள் இதைப் பயன்படுத்துகின்றன. UDP என்பது connectionless ஆகும். DNS மற்றும் சில VPN-கள் போன்றவற்றிற்கு இது பயன்படுத்தப்படுகிறது. நீங்கள் firewall திறக்கும்போது பொதுவாக எதைப் பயன்படுத்துவது என்பதைக் குறிப்பிடுவீர்கள், உதாரணமாக 22/tcp.
Listening என்றால் ஒரு நிரல் ஒரு போர்ட்டில் காத்திருக்கிறது என்று பொருள்
இணைப்புகளைப் பெற விரும்பும் ஒரு நிரல், kernel-இடம் ஒரு போர்ட்டில் "listen" செய்ய கேட்கிறது. அந்த நொடியிலிருந்து அந்த போர்ட் இயந்திரத்தில் திறந்திருக்கும். firewall அனுமதித்தால், அங்கு வரும் எதற்கும் அந்த நிரல் பதிலளிக்கும். எதுவும் listen செய்யாத ஒரு போர்ட் இணைப்புகளை நேரடியாக நிராகரிக்கிறது. எனவே, எந்தப் பாதுகாப்பு சரிபார்ப்பிலும் முதல் கேள்வி இதுதான்: எது listen செய்கிறது, மற்றும் எங்கே.
அதற்கு விடையளிக்கும் கட்டளை ss:
sudo ss -tlnpஇந்த flags-ன் பொருள்: TCP (t), listening sockets மட்டும் (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 நெடுவரிசை எந்த நிரல் ஒவ்வொரு போர்ட்டையும் வைத்திருக்கிறது என்பதைக் கூறுகிறது. இதுதான் நீங்கள் இயக்கிவிட நினைக்காத ஒன்றைக் கண்டறிய உதவும் வழி.
Local Address நெடுவரிசைதான் முக்கியமான பகுதி
ஒவ்வொரு போர்ட்டுக்கும் முன்னால் உள்ள முகவரியை கவனமாக வாசிக்கவும். ஏனெனில் யார் இந்த சேவையை அணுக முடியும் என்பதை அது தீர்மானிக்கிறது. நீங்கள் தொடர்ந்து பார்க்கும் மூன்று நிலைகள் இவை.
0.0.0.0:22 என்பது "இந்த இயந்திரம் கொண்டிருக்கும் ஒவ்வொரு IPv4 முகவரியிலும் listen செய்" என்று பொருள். இது அதன் public முகவரியையும் உள்ளடக்கியது. firewall அனுமதித்தால், இந்த சேவை IPv4 வழியாக இணையத்திலிருந்து அணுகக்கூடியதாக இருக்கும்.
[::]:80 என்பது IPv6-க்கும் இதே பொருள்: ஒவ்வொரு IPv6 முகவரியிலும் listen செய், public முகவரி உட்பட. பல நிரல்கள் இயல்பாகவே இங்கே bind செய்கின்றன. மேலும் Linux-ல் ஒரு :: socket பெரும்பாலும் IPv4-ஐயும் ஏற்கும்.
127.0.0.1:5432 என்பது "loopback மட்டும் listen செய்" என்று பொருள். 127.0.0.1 என்பது ஒரு இயந்திரம் தன்னுடனே பேசப் பயன்படுத்தும் முகவரி. இது வேறு எங்கிருந்தும் route செய்ய முடியாதது. இங்கே bind செய்யப்பட்ட ஒரு சேவை, உங்கள் firewall என்ன சொன்னாலும், ஒரே சேவையகத்திலிருந்து மட்டுமே அணுகக்கூடியது. இணையத்திலிருந்து ஒருபோதும் அணுக முடியாது. மேலே உள்ள அந்த Postgres வரி அமைப்புப்படியே பாதுகாப்பானது.
இதிலிருந்து நடைமுறை விதி நேரடியாக வருகிறது: உங்கள் சொந்த பயன்பாடுகள் மட்டுமே பயன்படுத்தும் ஒரு database, ஒரு cache, அல்லது ஒரு admin panel ஆனது 0.0.0.0-க்கு பதிலாக 127.0.0.1-க்கு bind செய்ய வேண்டும். அது ஒருபோதும் public முகவரியில் listen செய்யாவிட்டால், ஒரு தாக்குநர் அணுக எதுவுமே இருக்காது.
Listening என்பது reachable ஆவதற்கு சமம் அல்ல
நிறைய குழப்பத்தைத் தவிர்க்கும் இன்னொரு வேறுபாடு உள்ளது. ஒரு போர்ட் இயந்திரத்தில் திறந்திருப்பது, அதாவது ஒரு நிரல் listen செய்வது, அந்த போர்ட் வெளியிலிருந்து reachable என்பதற்கு சமம் அல்ல. அதாவது firewall அதை அனுமதிப்பது என்பதற்கு சமம் அல்ல. ஒரு தொலை கிளையந்தர இணைக்க இரண்டும் உண்மையாக இருக்க வேண்டும்.
எனவே கட்டுப்பாட்டின் இரண்டு அடுக்குகள் உள்ளன. ஒவ்வொரு சேவையின் bind முகவரியை அமைப்பதன் மூலம் நீங்கள் எது listen செய்ய வேண்டும் என்பதை தீர்மானிக்கிறீர்கள். ஒரு firewall மூலம் வெளியுலகம் எதை அணுக முடியும் என்பதை நீங்கள் தீர்மானிக்கிறீர்கள். நன்கு நிர்வகிக்கப்படும் ஒரு சேவையகம் இரண்டையும் பயன்படுத்துகிறது: சேவைகள் தேவைப்படும் இடங்களில் மட்டுமே bind செய்கின்றன. ஒரு firewall நீங்கள் வெளிப்படையாக அனுமதிக்காத அனைத்தையும் நிராகரிக்கிறது. ss மூலம் எது listen செய்கிறது என்பதை வாசிப்பது முதல் படி. firewall எதை அனுமதிக்கிறது என்பதைத் தீர்மானிப்பது இரண்டாவது படி, இது UFW உடன் firewalls 101-ல் விளக்கப்பட்டுள்ளது.
இங்கே மக்களைத் துரத்தும் ஒரு நுட்பம் உள்ளது. IPv4 மற்றும் IPv6 தனித்தனியானவை. IPv4-ஐ மட்டுமே கவர் செய்யும் ஒரு firewall, [::] சேவைகளை IPv6-ல் திறந்தநிலையில் விட்டுவிடும். அந்த குறிப்பிட்ட சிக்கலுக்கு ஒரு தனி பதிவ் உள்ளது: IPv6 firewall சிக்கல்.
FAQ
எனது Linux சேவையகத்தில் எந்தெந்த போர்ட்கள் திறந்திருக்கின்றன என்பதை நான் எப்படி பார்ப்பேன்?
TCP-க்கு sudo ss -tlnp அல்லது UDP-க்கு sudo ss -ulnp ஐ இயக்கவும். அது ஒவ்வொரு listening socket-ஐயும், போர்ட், அது bind செய்யப்பட்ட local முகவரி, மற்றும் அதை வைத்திருக்கும் செயல்முறை ஆகியவற்றை பட்டியலிடும். Local Address நெடுவரிசையை வாசிக்கவும்: 0.0.0.0 அல்லது [::] என்றால் சேவை பிணையத்திற்கு வெளிப்படையானது, 127.0.0.1 என்றால் அது இயந்திரத்தில் மட்டுமே listen செய்கிறது.
0.0.0.0 மற்றும் 127.0.0.1-க்கு இடையே உள்ள வேறுபாடு என்ன?
0.0.0.0 என்பது "அனைத்து IPv4 முகவரிகளிலும் listen செய்" என்று பொருள். இது public முகவரியையும் உள்ளடக்கியது. எனவே சேவையை பிணையத்திலிருந்து அணுக முடியும். 127.0.0.1 என்பது loopback. ஒரு இயந்திரம் தன்னுடனே பேசப் பயன்படுத்தும் முகவரி இது. இது வேறு எங்கிருந்தும் route செய்ய முடியாதது. எனவே, இதற்கு bind செய்யப்பட்ட ஒரு சேவை உள்ளூர் மட்டுமே அணுகக்கூடியது. உள் சேவைகளை 127.0.0.1-க்கு bind செய்யுங்கள், அப்போது அவை ஒருபோதும் வெளிப்படையாகாது.
ஒரு சேவை இயங்க நான் firewall-ல் ஒரு போர்ட்டைத் திறக்க வேண்டுமா?
மற்ற இயந்திரங்களிலிருந்து அணுகப்பட வேண்டிய சேவைகளுக்கு மட்டுமே. 127.0.0.1-க்கு bind செய்யப்பட்ட ஒரு சேவைக்கு firewall விதி தேவையில்லை. ஏனெனில் வெளியில் இருந்து எதுவும் அதை எப்படியும் அணுக முடியாது. 0.0.0.0 அல்லது [::]-ல் உள்ள ஒரு சேவைக்கு போக்குவரத்தை அனுமதிக்க ஒரு firewall விதி தேவை. நீங்கள் ஒன்றைச் சேர்க்கும் வரை, இயல்பாகவே அது நிராகரிக்கப்பட வேண்டும்.
ஒரு TCP போர்ட்டிற்கும் UDP போர்ட்டிற்கும் இடையே உள்ள வேறுபாடு என்ன?
TCP என்பது connection-based ஆகும். SSH, web சேவையகங்கள் மற்றும் database-கள் போன்ற பெரும்பாலான சேவைகள் இதைப் பயன்படுத்துகின்றன. UDP என்பது connectionless ஆகும். DNS மற்றும் சில VPN-கள் இதைப் பயன்படுத்துகின்றன. TCP மற்றும் UDP-ல் உள்ள ஒரே எண் தனித்தனி போர்ட்கள். எனவே 53/tcp மற்றும் 53/udp வேறுபட்டவை. நீங்கள் firewall விதிகளை எழுதும்போது protocol-ஐ குறிப்பிடுவீர்கள், உதாரணமாக 22/tcp.