eth0:0-ը պիտակ է, ոչ սարք. ուղղիր SNAT համապատասխանությունը
Զրոյական հաշվիչը նշանակում է, որ կանոնը նշում է ինտերֆեյս, որը չի կարող գոյություն ունենալ։ Կարդա իրական սարքը, ուղղիր -o համապատասխանությունը և հետո գիտակցաբար ընտրիր թարգմանված հասցեն։
NAT կանոնը, որը պետք է մեկ VPN հաճախորդների լողավազանին տար իր սեփական հանրային հասցեն, կանգնած է զրո փաթեթի վրա, մինչդեռ նույն լողավազանը շարունակում է դուրս գալ սխալ աղբյուրով։ Կանոնը սովորաբար չի սխալվում հասցեի մեջ, այլ սխալվում է ինտերֆեյսի մեջ։ -o eth0:0 մատնանշում է սարք, որը գոյություն չունի, որովհետև eth0:0 պիտակ է, որը կապված է հասցեին, իսկ այդ հասցեի սարքը eth0։ Հաշվիչներին նայելը դա հաստատելու ամենաարագ ճանապարհն է, և ուղղումը ավելի փոքր է, քան քննությունը հուշում է։
Ստուգիր, թե ինչպես է միջուկը կոչում սարքը
Կարդա երկու տեսքերը առանձին, նախքան որևէ բան փոխելը:
ip link show
ip address show dev eth0
ip route get 203.0.113.20
Հղումների ցանկը ցույց է տալիս ինտերֆեյսներ։ Հասցեների ցանկը կարող է ցույց տալ երկրորդ IPv4 հասցե, որը կրում է պիտակը՝ eth0:0, և այդ հասցեի սարքը դեռ eth0 է։ iproute2-ի հասցեների ձեռնարկը պիտակը համարում է հասցեի անուն, ոչ թե երկրորդ հղում, և հենց այդ տարբերության վրա է հիմնված ամբողջ խնդիրը։
Պատմությունը բացատրում է շփոթությունը։ Հին ifconfig eth0:0 շարահյուսությունը իսկապես նման էր նոր ինտերֆեյսի, և այդ ժամանակների սկրիպտները դեռ հղվում են դրան։ Ժամանակակից համակարգում այլանունը պիտակ է հասցեի վրա, և ոչինչ ուղղորդման կամ netfilter-ի ուղու վրա այն չի դիտում որպես առանձին ելքային կետ։
Ստուգիր, թե կանոնն իրականում ինչի հետ համապատասխանեց
Հաշվիչները կարդա կանոնների ցանկի հետ, ոչ հիշողությունից:
iptables -t nat -L POSTROUTING -v -n --line-numbers
Կանոնը, որի փաթեթների հաշվիչը մնում է զրո, մինչ համապատասխան երթևեկությունը հոսում է, չի գնահատվում, և ելքային ինտերֆեյսի պայմանը, որը նշում է eth0:0 ընդհանուր պատճառ է։ Երթուղու ընտրած ելքային սարքն է eth0, ուստի այլ անուն փնտրող պայմանը երբեք ճիշտ չի դառնում, անկախ նրանից, թե միջուկը որ աղբյուրի հասցեն է ընտրել։
Փոխիր պայմանը իրական սարքի և պիտակը թող դրանից դուրս։ Եթե պետք է տարբերես երկու հաճախորդների լողավազան, որոնք կիսում են այդ սարքը, տարբերիր դրանք աղբյուրի նախածանցով, ոչ թե ինտերֆեյսի անունով, որը չի կարող գոյություն ունենալ։ Երկու կանոն, որոնց -s համապատասխանությունները չեն համընկնում, ընթեռնելի են և ստուգելի, մեկ կանոն հորինված սարքով ոչ մեկն է, ոչ մյուսը։ Յուրաքանչյուր կանոնի տուր մեկնաբանություն, որը նշում է լողավազանը, որովհետև կես տարի հետո նախածանցը մենակ ոչ ոքի չի ասի, թե ինչու է այն այնտեղ։
Ստուգիր այն երթուղին, որը ընտրեց սարքը
Postrouting NAT-ը գործում է այն բանից հետո, երբ երթուղին արդեն ընտրել է ելքային ինտերֆեյս, ուստի կանոնի ինտերֆեյսը պետք է լինի այն, ինչ ընտրել է երթուղին։ Հարցրու միջուկին ուղղակիորեն ip route get գործիքով ներկայացուցչական հաճախորդի հասցեի համար և կարդա և՛ սարքը, և՛ հաղորդված աղբյուրը։
Եթե պատասխանը նշում է eth0, ապա կանոնի ինտերֆեյսի մասը պարզ է։ Եթե այն նշում է թունելային սարք, փաթեթը երբեք չի հասնում ձեր խմբագրած կանոնին, և որոնումը տեղափոխվում է ուղղորդման աղյուսակ և դրա առաջնահերթություններ։ Կանոնը, որը երբեք չի համապատասխանում, որովհետև փաթեթը դուրս է եկել այլ տեղ, հաշվիչների ելքի մեջ նույն տեսքն ունի, ինչ սխալ գրված սարքով կանոնը։ Հաստատիր, թե երկուսից որն է քեզ մոտ, նախքան որևէ բան խմբագրելը, որովհետև երկրորդը պահանջում է ուղղորդման փոփոխություն, ոչ թե տեքստի։
Գիտակցաբար ընտրիր թարգմանված աղբյուրը
Երբ սարքը ճիշտ է, աղբյուրի հասցեն առանձին որոշում է, և սա ընդամենը պատկերավոր IPv4 լողավազան ու օրինակ հասցե է։
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 \
-j SNAT --to-source 203.0.113.20
Հասցե գրելը --to-source -ի մեջ ոչ ոքի չի ստիպում այն հետ ուղղորդել դեպի քեզ։ Վերին մատակարարը կամ հասցեի տերը պետք է այդ հասցեի պատասխանները հասցնի այս հոսթին, և հասցեն պետք է լինի այն, ինչն օգտագործելու իրավունք ունես։ Եթե ոչ, կանոնը կհամապատասխանի և կթարգմանի, և պատասխանները դեռ կգնան այլ տեղ։
Աղբյուրի հասցեն փոխելը նույնը չէ, ինչ վերին կապուղին փոխելը։ Երբ իրական պահանջը այլ ֆիզիկական ուղի է, ուղղորդման քաղաքականությունը պետք է նախ ընտրի այդ ուղին, այնուհետև SNAT-ը վերագրում է աղբյուրը այն սարքի վրա, որը քաղաքականությունն ընտրել է։ Ավելի շատ պիտակներ eth0 -ի վրա չեն տալիս ոչ երթուղին, ոչ թույլտվությունը։
Ստուգիր հենց նոր բացված կապով
Բացիր նոր հաճախորդի կապ, այլ ոչ թե վերաօգտագործիր գոյություն ունեցողը։ Կապերի հետևումը պահում է այն թարգմանությունը, որը գրանցել է հոսքի սկզբում, ուստի հին սեսիան կարող է շարունակել օգտագործել նախորդ աղբյուրի հասցեն և ճիշտ նոր կանոնը թերի ցույց տալ։ Հետևիր հաշվիչի աճին, ապա դիտիր թարգմանված աղբյուրը լարի վրա կամ հեռավոր ծայրում։
Երբ մի քանի լողավազան կիսում են մեկ ինտերֆեյս, տուր յուրաքանչյուրին հստակ աղբյուրի համապատասխանություն և իր թարգմանության հասցեն, պահիր դրանք ֆայրվոլի կառավարվող կոնֆիգուրացիայում և նշիր, թե ինչ հերթականությամբ են գնահատվում։ Ապա գրանցիր, թե ինչ ես ստուգել՝ սարքը ip route get-ից, այն հաշվիչը, որը շարժվեց, և այն աղբյուրը, որը տեսավ հեռավոր կողմը։ Այդ գրառումը պատասխանում է հաջորդ հաշվետվությանը՝ առանց այլանվի շփոթությունը կրկնելու։