VPS ఫైర్వాల్: VPN పోర్ట్ మాత్రమే తెరవండి, ఆ తర్వాత నిరూపించండి
ఒక పోర్ట్ పబ్లిక్గా ఉండాలి, లేకపోతే ఏ క్లయింట్ కనెక్ట్ అవ్వదు. మిగిలినవి తిరస్కరించండి, ఫార్వర్డింగ్ను ఇన్పుట్ నుండి వేరుగా ఉంచండి, మరియు ముందే పరీక్షించిన పునరుద్ధరణ మార్గాన్ని విడిచిపెట్టండి.
VPN పోర్ట్ను మాత్రమే అనుమతించే ఫైర్వాల్ ఒక నియమం కాదు. ఇది ఒకే పోర్ట్ నంబర్కు యాదృచ్ఛికంగా సంబంధించిన మూడు వేర్వేరు నిర్ణయాలు: ఇన్పుట్ చైన్ లోకల్ ప్రాసెస్ను ఏది చేరుకోగలదో నిర్ణయిస్తుంది, ఫార్వర్డ్ చైన్ టన్నెల్ క్లయింట్ల తరఫున హోస్ట్ గుండా ఏది వెళ్లగలదో నిర్ణయిస్తుంది, మరియు NAT పట్టిక బయటకు వెళ్లేటప్పుడు మూల చిరునామాను తిరిగి రాస్తుంది. వీటిలో ఒకటి తప్పు చేసినా ఫలితం అరుదుగా స్పష్టమైన అంతరాయం అవుతుంది. క్లయింట్లను అంగీకరించే కానీ ఏదీ లోడ్ చేయని హోస్ట్ లభిస్తుంది, లేదా ఎవరైనా చైన్ల క్రమాన్ని చదివే వరకు మూసి ఉన్నట్టు కనిపించే హోస్ట్ లభిస్తుంది.
మూయలేని ఏకైక పోర్ట్
VPN శ్రోత మీరు ముందుగా ఊహించలేని చిరునామాల నుండి కనెక్షన్లను అంగీకరించాలి, కాబట్టి ఇది నిర్వచనం ప్రకారం పబ్లిక్ సేవ. డిజైన్ ఆధారపడిన ఏకైక మినహాయింపు ఇదే: OpenVPN కోసం ఒక UDP పోర్ట్, WireGuard కోసం ఒక UDP పోర్ట్, SSL VPN కోసం ఒక TCP పోర్ట్. మిగతావన్నీ టన్నెల్ వెనుక ఉంటాయి, అంటే అప్లికేషన్ సేవలు అన్ని ఇంటర్ఫేస్లకు కాకుండా టన్నెల్ చిరునామాకు లేదా loopbackకు బంధించబడాలి.
అయితే బంధించడం అమలు కాదు. 0.0.0.0 అనే చిరునామాకు బంధించిన ప్రాసెస్ ఒక నియమం అనుమతిస్తే మాత్రమే చేరుకోగలము, మరియు డిఫాల్ట్ విధానం ఏ నియమంతోనూ సరిపోలని ట్రాఫిక్కు ప్రత్యామ్నాయం, పోర్ట్ను నియంత్రించే నియమం కాదు. మీ drop పైన ఉంచిన అంగీకారం కూడా అంగీకారమే, మరియు సేవను పబ్లిక్ చిరునామా నుండి తొలగించడం స్వతంత్ర మెరుగుదల, చైన్కు ప్రత్యామ్నాయం కాదు.
ఇన్పుట్, ఫార్వర్డ్ మరియు NAT వేర్వేరు ప్రశ్నలకు సమాధానం ఇస్తాయి
ఇన్పుట్ ట్రాఫిక్ హోస్ట్కే లక్ష్యం, కాబట్టి VPN శ్రోత మరియు పరిపాలనా మార్గం అక్కడే ఉంటాయి. ఫార్వర్డ్ ట్రాఫిక్ హోస్ట్ గుండా వెళుతుంది, టన్నెల్ క్లయింట్లకు అది net.ipv4.ip_forward=1 తో పాటు అవసరం. సాంప్రదాయిక సగం విరిగిన కాన్ఫిగరేషన్ బయటకు వెళ్లే ప్రవాహాన్ని అనుమతించి తిరిగి వచ్చే దిశను మరచిపోతుంది, కాబట్టి క్లయింట్ హ్యాండ్షేక్ పూర్తి చేసి ఆ తర్వాత ఏదీ లోడ్ కాదు; స్థాపించబడిన మరియు సంబంధిత ట్రాఫిక్ కోసం conntrack నియమం ఆ దిశను కవర్ చేస్తుంది.
NAT మూడో ప్రశ్న. postroutingలో తిరిగి రాయకుండా, ఫార్వర్డ్ చేసిన ప్యాకెట్లు టన్నెల్ ప్రైవేట్ మూలంతో బయటకు వెళ్లి పైన పడవేయబడతాయి, ఎందుకంటే హోస్ట్ ఆవల ఏ నెట్వర్క్కూ పూల్ను తిరిగి రూట్ చేయడం తెలియదు. ఆ నియమంలోని మూల ప్రిఫిక్స్ VPN పూల్తో సరిపోలాలి, హోస్ట్ స్వంత చిరునామాతో కాదు, మరియు క్లయింట్ సబ్నెట్ను పేర్కొనే ఫార్వర్డ్ నియమానికి కూడా ఇదే వర్తిస్తుంది.
IPv6 రెండో విధానం, తర్వాతి ఆలోచన కాదు. కఠినమైన IPv4 చైన్ మరియు ip6tables లోపల తెరిచిన విధానం ఉన్న హోస్ట్ ఏమీ మూసి ఉంచలేదు; సేవలు మరో కుటుంబం ద్వారా ఇప్పటికీ చేరుకోగలవు. ఒకటి ip6tables తో నియమ సమూహాన్ని ప్రతిబింబించండి, లేదా పబ్లిక్ ఇంటర్ఫేస్పై IPv6ను ఉద్దేశపూర్వకంగా నిలిపివేయండి, మరియు మీరు ఏది ఎంచుకున్నారో రాయండి.
ఒకే చదవడంలో అర్థమయ్యే పునాది
తిరస్కరణతో ప్రారంభించి, హోస్ట్కు అవసరమైనది మాత్రమే జోడించండి. మొదట loopback మరియు సమాధానాలు, తర్వాత పరిపాలనా మార్గం, తర్వాత టన్నెల్ శ్రోత, తర్వాత క్లయింట్ల కోసం ఫార్వర్డింగ్ విధానం:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -m conntrack --ctstate NEW -j ACCEPT
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADEఇంటర్ఫేస్ పేర్లు, పోర్ట్ మరియు పూల్ ప్లేస్హోల్డర్లు; వాటిని కాపీ చేయడం బదులు సర్వర్ నుండి చదవండి. ఫలితాన్ని సేవ్ చేయడం దాన్ని రాయడంతో సమానంగా ముఖ్యం, ఎందుకంటే మెమరీలో మాత్రమే జీవించే నియమ సమూహం తదుపరి రీబూట్లో మాయమై హోస్ట్ను నిశ్శబ్దంగా తిరిగి తెరుస్తుంది. పంపిణీ యంత్రాంగంతో దాన్ని శాశ్వతం చేయండి, మరియు మెషీన్ బూట్ కాని రోజు కోసం మెషీన్ బయట కాపీ ఉంచండి.
హోస్ట్ను కోల్పోకుండా చివరి పోర్ట్ మూయడం
డిజైన్లో ఒక ఉచ్చు ఉంది. SSH టన్నెల్ ద్వారా మాత్రమే ఉంటే, విఫలమైన VPN సేవ SSHను కూడా తీసుకెళ్తుంది, తిరిగి వెళ్లే ఏకైక మార్గం మీరు ఎప్పుడూ తెరవని కన్సోల్ కావచ్చు. చివరి పబ్లిక్ పోర్ట్ను మూసే ముందు ఆ కన్సోల్ ఉందని మరియు మీరు నిజంగా దాన్ని ఉపయోగించగలరని నిర్ధారించుకోండి, లేదా టన్నెల్పై ఆధారపడని ఒక ఇరుకైన పరిపాలనా మార్గాన్ని ఉంచండి: స్థిర చిరునామా నుండి SSH, కీలు మాత్రమే, పాస్వర్డ్ ప్రామాణీకరణ ఆఫ్.
మార్పును ఇప్పటికే స్థాపించిన సెషన్ నుండి వర్తింపజేయండి, మీరు ఫిల్టర్ చేయబోయే కనెక్షన్ ద్వారా కాదు. తప్పు శాశ్వతం కాకుండా గడువు ముగిసేలా రోల్బ్యాక్ షెడ్యూల్ చేయండి, ఉదాహరణకు మునుపటి నియమ సమూహాన్ని పునరుద్ధరించే systemd-run --on-active=10min పని, మరియు మొదటిది పరీక్షిస్తున్నప్పుడు రెండో SSH సెషన్ తెరిచి ఉంచండి. తర్వాత రోల్బ్యాక్ పని నిజంగా ప్రారంభమవుతుందో లేదో ధృవీకరించండి, ఎందుకంటే పరీక్షించని పునరుద్ధరణ పునరుద్ధరణ లేకపోవడంతో సమానం.
స్క్రిప్ట్ కాదు, మార్గాన్ని ధృవీకరించండి
లోడ్ అయిన నియమాలను చదవండి, వాటిని లోడ్ చేయాల్సిన ఫైల్ కాదు. అధికారం ఉన్న బాహ్య హోస్ట్ నుండి ఉద్దేశించిన పోర్టులు మాత్రమే సమాధానం ఇస్తాయని నిర్ధారించుకోండి; టన్నెల్ లోపలి నుండి మీరు ప్రచురించాలనుకున్న సేవలు చేరుకోగలవని నిర్ధారించుకోండి. టన్నెల్ ట్రాఫిక్ను కూడా నిరోధించే డిఫాల్ట్-తిరస్కరణ విధానం, ఎవరైనా దాన్ని ఉపయోగించడానికి ప్రయత్నించే వరకు పనిచేసే లాక్డౌన్లాగే కనిపిస్తుంది.
iptables -S
iptables -t nat -S
ss -lntup
ip -4 addr showఅనుమతించిన పోర్ట్, క్లయింట్ పూల్, టన్నెల్ ఇంటర్ఫేస్, పరిపాలనా మూలం మరియు కన్సోల్ విధానాన్ని కాన్ఫిగరేషన్ పక్కన నమోదు చేయండి. పూల్ లేదా ఇంటర్ఫేస్ పేరులో తదుపరి మార్పు ఫిల్టర్ మరియు NAT నియమం రెండింటిలోనూ సరిపోలాలి, లేకపోతే హోస్ట్ ఎవరికీ తెలియకుండా సగం తెరిచిన స్థితికి తిరిగి వెళ్తుంది.
ఒక అలవాటు నియమ సమూహం కంటే విలువైనది: ప్రతి మార్పు తర్వాత క్లయింట్ అభ్యర్థనతో ఫార్వర్డ్ మార్గాన్ని, రెండో సెషన్తో పునరుద్ధరణ మార్గాన్ని నిరూపించండి. మీరు ఉపయోగించని లాక్డౌన్ కేవలం ఒక ఊహ మాత్రమే.