ટનલ ન રોકીને એક OpenVPN ક્લાયન્ટને LAN થી બ્લોક કરો
ક્લાયન્ટનું ટનલ સરનામું તેના પ્રમાણપત્ર સાથે પિન કરો, FORWARD ના શીર્ષ પર તેનો LAN ટ્રાફિક ડ્રોપ કરો, પછી IPv6, ટ્રેક કરેલા સેશન અને રીબૂટ પછી ટકી રહેવાની ચકાસણી કરો.
તમારા OpenVPN સર્વર પરના એક ક્લાયન્ટે LAN ઍક્સેસ ગુમાવવો પડે જ્યારે બાકીના બધા ટનલ ચાલુ રહે. આ શોધો તો ટોચનો જવાબ સામાન્ય રીતે કહે છે કે ડીમન આ કરી શકતું નથી, જે અડધું સાચું છે: OpenVPN માં પ્રતિ-ક્લાયન્ટ ફાયરવૉલ નથી, પણ જે હોસ્ટ ટનલ સમાપ્ત કરે છે તે પહેલેથી પેકેટ ફિલ્ટર કરે છે. મહત્ત્વના બે નિર્ણય એ છે કે તમે કઈ ઓળખ બ્લોક કરો છો અને નિયમની સ્થિતિ. આ બંને સાચા કરો તો ફેરફાર એક લીટી બની જાય છે જે તમે ચકાસી અને દૂર કરી શકો છો.
નિયમ લખતા પહેલા ક્લાયન્ટને પિન કરો
OpenVPN પૂલમાંથી ટનલ સરનામાં ભાડે આપે છે, તેથી 10.8.0.6 વ્યક્તિ નહીં, બેઠક છે. સેશન પૂરું થાય ત્યારે ભાડું પાછું આવે છે અને આગલા કનેક્શનને આપી શકાય છે, એટલે કે તે સરનામા સામે લખાયેલો નિયમ બેઠકને અનુસરે છે, વપરાશકર્તાને નહીં. તેથી પહેલા નક્કી કરો કે તમે ખરેખર શું બ્લોક કરો છો: ટૂંકા પ્રયોગ માટે સરનામું, કે જેને દૂર રાખવા છે તેના માટે પ્રમાણપત્ર.
સરનામાને પ્રમાણપત્ર સાથે બાંધવા માટે, client-config-dir દ્વારા નામ આપેલ ડિરેક્ટરીમાં ફાઇલ બનાવો અને ફાઇલને પ્રમાણપત્રનું common name બરાબર આપો. તેમાં એક નિર્દેશ મૂકો, ifconfig-push 10.8.0.6 255.255.255.0, અને તે ક્લાયન્ટ ફરી જોડાણમાં પણ એ જ ટનલ સરનામું રાખે છે. આ અમલમાં આવે તે માટે બે સેટિંગ હોવા જોઈએ: સર્વર રૂપરેખામાં client-config-dir જાહેર થવું જોઈએ, અને મોકલાયેલ સરનામું એવા સબનેટમાં હોવું જોઈએ જે સર્વર રૂટ કરી શકે. એક પણ ચૂક્યા તો ફાઇલ કોઈ ભૂલ વિના અવગણાય છે, જે આગલી ફાયરવૉલ ચકાસણીને ભ્રામક બનાવે છે.
કામચલાઉ બ્લોક પૂલનું સરનામું વાપરી શકે છે, જો ટિકિટમાં નોંધ હોય કે તે સમયે કયું સેશન તેને ધરાવતું હતું.
ક્રમ નક્કી કરે છે કે ડ્રોપ ચાલશે કે નહીં
જે Linux ગેટવે ટનલ અને LAN વચ્ચે ફોરવર્ડ કરે છે ત્યાં પેકેટ FORWARD ચેઇન પાર કરે છે. નીચેનો આદેશ વાક્ય તરીકે વાંચો: FORWARD ના શીર્ષ પર દાખલ કરો, tun0 થી આવતો, ફક્ત તે જ એક હોસ્ટનો, LAN સબનેટ તરફ લક્ષિત ટ્રાફિક મેળવો અને ડ્રોપ કરો.
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP-I એ છે જે નિયમ ચલાવે છે. -A સાથે ઉમેરાય તો તે ટનલ સબનેટ માટેના કોઈપણ વિશાળ સ્વીકાર નીચે પડે છે અને ક્યારેય પેકેટ જોતું નથી. iptables -vnL FORWARD --line-numbers થી સ્થિતિ ચકાસો અને કાઉન્ટર પણ વાંચો: ઉપરનો ડ્રોપ જો કંઈ ગણતો ન હોય તો તેનો અર્થ છે કે ટ્રાફિક બીજા માર્ગે આવે છે.
ગેટવેનું પોતાનું LAN સરનામું બીજો માર્ગ છે. બોક્સ પર જ મોકલાયેલા પેકેટ INPUT માં જાય છે, FORWARD માં નહીં, તેથી ક્લાયન્ટ LAN હોસ્ટ ગુમાવીને પણ રાઉટરનું એડમિન પૃષ્ઠ ખોલી શકે છે. જ્યારે આ મહત્ત્વનું હોય ત્યારે અનુરૂપ INPUT નિયમ ઉમેરો.
ફિલ્ટર શું જોઈ શકતું નથી
પેકેટનું મૂલ્યાંકન થાય ત્યારે ફિલ્ટરિંગ થાય છે, તેથી સ્થાપિત TCP સેશન બંધ થાય કે રીસેટ થાય ત્યાં સુધી ચાલુ રહી શકે. જો બ્લોકને તરત જ કામ કરવું હોય તો નિયમ દાખલ કર્યા પછી તે સ્રોતના ટ્રેક કરેલા ફ્લો conntrack -D -s 10.8.0.6 થી સાફ કરો. જો થોડી સેકન્ડનો ઓવરલેપ સ્વીકાર્ય હોય તો તે પસંદગી નોંધો, ગર્ભિત રહેવા દેવાને બદલે. કોઈપણ રીતે, આગલી વ્યક્તિએ જાણવું જોઈએ કે નિયમ જીવંત ટ્રાફિક રોકે છે કે ફક્ત નવા કનેક્શન.
પીઅર ટ્રાફિક ક્યારેય હોસ્ટ ફાયરવૉલને સ્પર્શતો નથી. client-to-client સક્ષમ હોય તો OpenVPN તે પેકેટ ડીમનની અંદર ફોરવર્ડ કરે છે, તેથી FORWARD કે INPUT તેમને જોતા નથી. એકમાત્ર ઉપાય client-to-client બંધ કરવો કે પીઅર એકબીજા સુધી પહોંચી શકે તે સ્વીકારવો છે; iptables નિયમ તે ટ્રાફિક નહીં જુએ.
IPv6, ફર્મવેર અને રીબૂટ પછી ટકી રહેવું
IPv4 નિયમ IPv6 વિશે કંઈ કહેતું નથી. જો ટનલ અને LAN બંને કુટુંબો વહન કરે, તો સમાન નિયમ ip6tables માં હોવો જોઈએ, અથવા તે હોસ્ટ પર નીતિ ધરાવતા nftables નિયમસંગ્રહમાં. રાઉટર ફર્મવેર ઘણી વાર netfilter ને પોતાના અમૂર્તીકરણ પાછળ છુપાવે છે, તેથી ફોરમમાંથી નકલ કરેલ વાક્યરચના અને કોષ્ટક નામો લાગુ ન પણ પડે.
OpenWrt પર, દસ્તાવેજી માર્ગ ફાયરવૉલ રૂપરેખા એન્ટ્રી છે, હાથે લખેલી iptables લીટી નહીં, અને હાથે લખેલી લીટી ફાયરવૉલ ફરી લોડ થાય ત્યારે અદૃશ્ય થઈ શકે. અન્ય ડિસ્ટ્રિબ્યુશન netfilter-persistent, બૂટ યુનિટ કે વેન્ડર સ્ટોર દ્વારા નિયમ પુનઃસ્થાપિત કરે છે, અને તે પદ્ધતિઓ અદલાબદલી યોગ્ય નથી. તમે પસંદ કરેલી પદ્ધતિ રીબૂટ દ્વારા સાબિત કરો, કારણ કે ફરી લોડ કરવું બીજો માર્ગ વાપરે છે.
માર્ગ પ્રમાણે ચકાસો, પછી સ્વચ્છ રીતે પાછું ખસેડો
દરેક માર્ગ અલગ ચકાસો, કારણ કે એક સફળ ચકાસણી બાકીનાને છુપાવે છે. બ્લોક કરેલા ક્લાયન્ટે ટનલ દ્વારા ઇન્ટરનેટ સુધી પહોંચવું જોઈએ પણ LAN હોસ્ટ સામે નિષ્ફળ જવું જોઈએ, બીજા ક્લાયન્ટે તે જ હોસ્ટ સુધી પહોંચવું જોઈએ, અને ગેટવે સરનામું તથા પીઅર માર્ગને દરેકને પોતાનું નિરીક્ષણ જોઈએ. પરિણામો નિયમની બાજુમાં લખો જેથી આગલા ફેરફારને આધાર મળે. નીચેનું કોષ્ટક એ સંગ્રહ છે જે ટિકિટમાં રાખવા યોગ્ય છે.
| માર્ગ | નિયમ સાથે અપેક્ષિત | જ્યારે નિષ્ફળ જાય |
|---|---|---|
| બ્લોક કરેલો ક્લાયન્ટ LAN હોસ્ટ તરફ | કોઈ જવાબ નહીં | નિયમ સ્વીકાર નીચે છે, અથવા સ્રોત મેળ ખાતો નથી |
| બ્લોક કરેલો ક્લાયન્ટ ઇન્ટરનેટ તરફ | tun0 દ્વારા કામ કરે છે | નિયમ ખૂબ વિશાળ છે, ગંતવ્ય મેળ વિના |
| બીજો ક્લાયન્ટ તે જ LAN હોસ્ટ તરફ | કામ કરે છે | નિયમ ઇચ્છિત હોસ્ટ કરતાં વધુને મેળ ખાધો |
| બ્લોક કરેલો ક્લાયન્ટ ગેટવેના LAN સરનામા તરફ | ફક્ત અનુરૂપ INPUT નિયમ સાથે બ્લોક થાય છે | INPUT નિયમ ગુમ છે |
| બ્લોક કરેલો ક્લાયન્ટ પીઅર ટનલ સરનામા તરફ | હજી પણ કામ કરે છે | client-to-client સક્ષમ છે અને ફાયરવૉલના વ્યાપની બહાર |
પાછું ખસેડવું એ સ્પષ્ટીકરણ પ્રમાણે કાઢી નાખવું છે, ફ્લશ નહીં: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP બરાબર તે જ એન્ટ્રી દૂર કરે છે અને ચેઇનનો બાકીનો ભાગ અકબંધ રાખે છે. બૂટ પર નિયમ પુનઃસ્થાપિત કરતી કોઈપણ ફાઇલમાંથી એ જ લીટી દૂર કરો, તેને ફરી લોડ કરો અને ખાતરી કરો કે ક્લાયન્ટ ફરી LAN હોસ્ટ સુધી પહોંચે છે. FORWARD ફ્લશ કરવાથી તમે ન લખેલા નિયમો પણ રદ થશે, જે પાછું ખસેડવાને બીજી ઘટના બનાવે છે.
ટિકિટ બંધ કરતા પહેલા ત્રણ વસ્તુઓની ખાતરી કરો: પિન કરેલું સરનામું પ્રમાણપત્ર સાથે મેળ ખાય છે, નિયમ સ્વીકારની ઉપર છે અને કાઉન્ટર શૂન્ય નથી, અને સ્થાયી ફાઇલમાં તમે ચકાસેલો એ જ નિયમ છે. જો તેમાંથી કોઈ ન હોય તો બ્લોક શેલ સેશનનો ભ્રમ છે.