fwmark ಬಳಸಿ ಒಂದೇ Linux ಹೋಸ್ಟ್ನಲ್ಲಿ ಎರಡು OpenVPN ಕ್ಲೈಂಟ್ಗಳನ್ನು ಸರಪಳಿಗೊಳಿಸಿ
ಎರಡೂ ಕ್ಲೈಂಟ್ಗಳಿಗೆ ಡೀಫಾಲ್ಟ್ ರೂಟ್ ಬೇಕು. ಒಳಗಿನ ಸರ್ವರ್ ಅನ್ನು ಹೋಸ್ಟ್ ರೂಟ್ನಿಂದ ಪಿನ್ ಮಾಡಿ, ಎರಡನೇ ಕ್ಲೈಂಟ್ ಕೋಷ್ಟಕಗಳನ್ನು ಪುನಃ ಬರೆಯದಂತೆ ತಡೆಯಿರಿ, ನಂತರ fwmark ನಿಂದ ಫ್ಲೋಗಳನ್ನು ನಿರ್ದೇಶಿಸಿ.
ಒಂದೇ Linux ಹೋಸ್ಟ್ನಲ್ಲಿ ಎರಡನೇ OpenVPN ಕ್ಲೈಂಟ್ ಅನ್ನು ಜೋಡಿಸುವುದು ಎರಡರಲ್ಲಿ ಒಂದು ಸ್ಥಳದಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ. ಒಳಗಿನ ಕ್ಲೈಂಟ್ ತನ್ನ ಸರ್ವರ್ ಅನ್ನು ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ, ಏಕೆಂದರೆ ಹೊರಗಿನ ಸುರಂಗವು ಆ ಸಾಗಣೆಯನ್ನು ವಶಪಡಿಸಿಕೊಂಡಿದೆ, ಅಥವಾ ಎರಡನೇ ಕ್ಲೈಂಟ್ ರೂಟ್ ಕೋಷ್ಟಕವನ್ನು ಪುನಃ ಬರೆಯುತ್ತದೆ ಮತ್ತು ಮೊದಲ ಸುರಂಗ ಕೆಲಸ ಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ. ಎರಡೂ ಸಮಸ್ಯೆಗಳು ರೂಟಿಂಗ್ನಲ್ಲಿವೆ, ಎನ್ಕ್ರಿಪ್ಷನ್ನಲ್ಲಲ್ಲ, ಮತ್ತು ಹೊಸ ಸುರಂಗ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ ಸಂಚಾರವನ್ನು ಸಾಗಿಸುವ ಮೊದಲೇ ಎರಡೂ ಪರಿಹಾರವಾಗುತ್ತವೆ. ಇಲ್ಲಿನ ವಿಳಾಸಗಳು ಉದಾಹರಣೆಗಾಗಿ: tun0 ಹೊರಗಿನ ಸುರಂಗ, 203.0.113.9 ಒಳಗಿನ ಸರ್ವರ್, ಮತ್ತು TCP 9999 ಒಳಗಿನ ಮಾರ್ಗವನ್ನು ಬಳಸಬೇಕಾದ ಫ್ಲೋ.
ಎರಡು ವಿಫಲತೆಯ ವಿಧಾನಗಳು, ಒಂದೇ ರೂಟ್ ಕೋಷ್ಟಕ
ಒಳಗಿನ ಕ್ಲೈಂಟ್ ತನ್ನ ಸರ್ವರ್ಗೆ UDP ಸಾಕೆಟ್ ತೆರೆಯುತ್ತದೆ, ಮತ್ತು ಆ ಸಾಕೆಟ್ ಬೇರೆ ಯಾವುದೇ ರೀತಿಯಲ್ಲಿ ಪ್ರಸ್ತುತ ರೂಟ್ ಕೋಷ್ಟಕವನ್ನು ಅನುಸರಿಸುತ್ತದೆ. ಹೊರಗಿನ ಸುರಂಗವು ಈಗಾಗಲೇ ಡೀಫಾಲ್ಟ್ ಅನ್ನು ಹೊಂದಿದ್ದರೆ, ಹ್ಯಾಂಡ್ಶೇಕ್ ಪ್ಯಾಕೆಟ್ಗಳು ಹೊರಗಿನ ಸುರಂಗಕ್ಕೆ ಹೋಗುತ್ತವೆ. ಅದು ಕೆಲಸ ಮಾಡುವುದು ಹೊರಗಿನ ಸರ್ವರ್ ಒಳಗಿನ ಸರ್ವರ್ ಅನ್ನು ತಲುಪಬಲ್ಲಾಗ ಮತ್ತು ಆಚೆಯ ಬದಿ ಫ್ಲೋವನ್ನು ಸಾಗಿಸಲು ಒಪ್ಪಿದಾಗ ಮಾತ್ರ; ಇಲ್ಲದಿದ್ದರೆ ಹ್ಯಾಂಡ್ಶೇಕ್ ನಿಂತುಕೊಳ್ಳುತ್ತದೆ ಮತ್ತು ಕ್ಲೈಂಟ್ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸುತ್ತದೆ.
ಎರಡನೇ ವಿಫಲತೆ ಸರ್ವರ್ ಪುಶ್ನಿಂದ ಬರುತ್ತದೆ. ಸಾಮಾನ್ಯ ಪುಶ್ redirect-gateway def1 ಆಗಿದೆ, ಅದು ಡೀಫಾಲ್ಟ್ ರೂಟ್ ಅನ್ನು ಬದಲಿಸುವ ಬದಲು 0.0.0.0/1 ಮತ್ತು 128.0.0.0/1 ಅನ್ನು ಸ್ಥಾಪಿಸುತ್ತದೆ. ಆದ್ದರಿಂದ ತಮ್ಮದೇ /1 ಜೋಡಿಯನ್ನು ಸ್ಥಾಪಿಸುವ ಎರಡು ಕ್ಲೈಂಟ್ಗಳು ಘರ್ಷಿಸುತ್ತವೆ, ಮತ್ತು ಬಹುತೇಕ ಎಲ್ಲಾ ಗಮ್ಯಸ್ಥಾನಗಳಿಗೆ ಹೊಸ ಜೋಡಿ ಗೆಲ್ಲುತ್ತದೆ. ಎರಡನೆಯದು ಸಂಪರ್ಕಗೊಂಡ ನಂತರ ಸುರಂಗ ಸಾಯುವಾಗ ಕೋಷ್ಟಕದಲ್ಲಿ ಆ ಎರಡು ಪೂರ್ವಪ್ರತ್ಯಯಗಳನ್ನು ಹುಡುಕಿ, ಏಕೆಂದರೆ ಡೀಫಾಲ್ಟ್ ರೂಟ್ ಸ್ವತಃ ಎಂದೂ ಬದಲಾಗದೇ ಇರಬಹುದು.
ಫ್ಲೋವನ್ನು ಗುರುತಿಸಿ ಅದಕ್ಕೆ ಕೋಷ್ಟಕ ಕೊಡಿ
ಆಯ್ದ ಸಂಚಾರವನ್ನು mangle ಕೋಷ್ಟಕದಲ್ಲಿ ಗುರುತಿಸಿ ಮತ್ತು ನೀತಿ ನಿಯಮದಲ್ಲಿ ಆ ಗುರುತನ್ನು ಹೊಂದಿಸುವ ಮೂಲಕ ನಿರ್ದೇಶಿಸಿ. ನಿಯಮವು ಡೀಫಾಲ್ಟ್ ರೂಟ್ ಒಳಗಿನ ಸಾಧನವಾಗಿರುವ ಮೀಸಲು ಕೋಷ್ಟಕಕ್ಕೆ ತೋರಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ಗುರುತಿಸಿದ ಪ್ಯಾಕೆಟ್ಗಳು ಮಾತ್ರ ಒಳಗಿನ ಮಾರ್ಗವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತವೆ.
iptables -t mangle -A PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
ip rule add fwmark 0x9999 table 200 pref 1000
ip route add default dev tun1 table 200ಈ ನಿಯಮ ಸಮೂಹದಲ್ಲಿನ ಬಹುತೇಕ ವಿಫಲತೆಗಳು ಎರಡು ತಪ್ಪುಗಳಿಂದ ಬರುತ್ತವೆ. ಫೈರ್ವಾಲ್ ಹೊಂದಿಸಿದ ಗುರುತಿನ ಮೌಲ್ಯ ಮತ್ತು ನಿಯಮವು ಹೊಂದಿಸುವ ಮೌಲ್ಯ ಒಂದೇ ಆಗಿರಬೇಕು, ಏಕೆಂದರೆ ವ್ಯತ್ಯಾಸವು ದೋಷವನ್ನೂ ಪರಿಣಾಮವನ್ನೂ ನೀಡುವುದಿಲ್ಲ. ಮತ್ತು PREROUTING ಹೊರಗಿನಿಂದ ಬರುವ ಪ್ಯಾಕೆಟ್ಗಳನ್ನು ಮಾತ್ರ ನೋಡುತ್ತದೆ, ಆದ್ದರಿಂದ ಈ ಹೋಸ್ಟ್ನಲ್ಲಿ ಪ್ರಾರಂಭವಾದ ಸಂಪರ್ಕಕ್ಕೆ ಗುರುತಿಸುವ ಮೊದಲೇ ಅದೇ ಹೊಂದಾಣಿಕೆಯ OUTPUT ನಿಯಮ ಬೇಕು.
ಎರಡನೇ ಕ್ಲೈಂಟ್ನಿಂದ ರೂಟ್ ಮಾಲೀಕತ್ವವನ್ನು ತೆಗೆದುಕೊಳ್ಳಿ
ಎರಡು ಆಯ್ಕೆಗಳು ಎರಡನೇ ಕ್ಲೈಂಟ್ ಕೋಷ್ಟಕವನ್ನು ಸಂಪಾದಿಸದಂತೆ ತಡೆಯುತ್ತವೆ, ಮತ್ತು ಅವು ಬೇರೆ ಬೇರೆ ಹಂತಗಳಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತವೆ. route-nopull ಪುಶ್ ಆದ ರೂಟ್ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ಏನೂ ಸ್ಥಾಪನೆಯಾಗುವುದಿಲ್ಲ. route-noexec ಪುಶ್ ಆದ ಆಯ್ಕೆಗಳನ್ನು ಕ್ಲೈಂಟ್ನ ಪರಿಸರಕ್ಕೆ ಸ್ವೀಕರಿಸುತ್ತದೆ ಆದರೆ ಕೋಷ್ಟಕ ಬದಲಾವಣೆಯನ್ನು hook ಗೆ ಬಿಡುತ್ತದೆ, ಮತ್ತು ಸರ್ವರ್ ಏನು ನೀಡಿತು ಎಂದು ನೋಡಬೇಕಾದಾಗ ಇದೇ ನಿಮಗೆ ಬೇಕಾದದ್ದು.
Hook ತನ್ನ ಪರಿಸರದಲ್ಲಿ ಪುಶ್ ಆದ ಮೌಲ್ಯಗಳೊಂದಿಗೆ ಚಲಿಸುತ್ತದೆ, ಮತ್ತು ನೀವು ಅನುಮೋದಿಸಿದ ನಮೂದುಗಳನ್ನು ಮಾತ್ರ ಸೇರಿಸಬೇಕು. ಅದನ್ನು idempotent ಮಾಡಿ: ಪುನಃ ನಿರ್ಮಿಸುವ ಮೊದಲು ಅದು ಹೊಂದಿರುವ ಕೋಷ್ಟಕವನ್ನು ಖಾಲಿ ಮಾಡಿ, ಮತ್ತು ಹಿಂದಿನ ಓಟವು ಸ್ವಚ್ಛ ಸ್ಥಿತಿಯನ್ನು ಬಿಟ್ಟಿದೆ ಎಂದು ಭಾವಿಸಬೇಡಿ. ಮರುಸಂಪರ್ಕ hook ಅನ್ನು ಮತ್ತೆ ಕರೆಯುತ್ತದೆ, ಮತ್ತು ಸ್ವಚ್ಛಗೊಳಿಸದೆ ಸೇರಿಸುವ hook ನಕಲಿ ರೂಟ್ಗಳನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ.
ಒಬ್ಬ ಮಾಲೀಕರನ್ನು ಆರಿಸಿ ಬರೆದಿಡಿ. ಎರಡೂ ಆಯ್ಕೆಗಳನ್ನು ಹೊಂದಿಸುವ ಪ್ರೊಫೈಲ್, ಅಥವಾ ಕೈಬರಹದ ಸ್ಕ್ರಿಪ್ಟ್ನೊಂದಿಗೆ ಸ್ಪರ್ಧಿಸುವ hook, ನಂತರ ಯಾರೂ ವಿವರಿಸಲಾಗದ ಕೋಷ್ಟಕವನ್ನು ಸೃಷ್ಟಿಸುತ್ತದೆ.
ಎರಡೂ ಸರ್ವರ್ ವಿಳಾಸಗಳನ್ನು ಪಿನ್ ಮಾಡಿ
ಒಳಗಿನ ಕ್ಲೈಂಟ್ ಸಂಪರ್ಕಗೊಳ್ಳುವ ಮೊದಲು ಒಳಗಿನ ಸರ್ವರ್ಗೆ ಹೊರಗಿನ ಸಾಧನದ ಮೂಲಕ ಹೋಸ್ಟ್ ರೂಟ್ ಬೇಕು. ಆ ನಮೂದೇ ಒಳಗಿನ ಸಾಗಣೆಯನ್ನು ಡೀಫಾಲ್ಟ್ ಅನ್ನು ಅನುಸರಿಸಲು ಬಿಡುವ ಬದಲು ಹೊರಗಿನ ಸುರಂಗದ ಒಳಗೆ ಇಡುತ್ತದೆ.
ip route add 203.0.113.9/32 dev tun0
ip route get 203.0.113.9ಮುಖ್ಯ ಕೋಷ್ಟಕದಲ್ಲಿ ಹೊರಗಿನ ಸರ್ವರ್ಗೂ ಹೊಂದುವ ಹೋಸ್ಟ್ ರೂಟ್ ಸೇರಿಸಿ, ಇಲ್ಲದಿದ್ದರೆ ಮರುಸಂಪರ್ಕವು ಹೊರಗಿನ ಕ್ಲೈಂಟ್ನ ಸ್ವಂತ ಸಾಗಣೆಯನ್ನು ಅದರದೇ ಸುರಂಗಕ್ಕೆ ರೂಟ್ ಮಾಡಬಹುದು. ಕ್ರಮ ಕಡ್ಡಾಯ: ಸಂಬಂಧಿತ ಇಂಟರ್ಫೇಸ್ ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದ ನಂತರ ಈ ನಮೂದುಗಳನ್ನು ಸೇರಿಸಿ, ಅಂದರೆ ಸಂಪರ್ಕದ ನಂತರ ಚಲಿಸುವ hook ಅಥವಾ ಸ್ಕ್ರಿಪ್ಟ್. ಆಫ್ ಆಗಿರುವ ಸಾಧನಕ್ಕೆ ತೋರಿಸುವ ರೂಟ್ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ ಅಥವಾ ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ, ಆದ್ದರಿಂದ ಬೂಟ್ನಲ್ಲಿ ಬರೆದ ನಮೂದು ನೀವು ಊಹಿಸಿದ ಕ್ರಮವನ್ನು ದಾಟುವುದಿಲ್ಲ.
ಇಡೀ ಕೋಷ್ಟಕವನ್ನು ಓದುವ ಬದಲು ಲುಕಪ್ ಪರಿಶೀಲಿಸಿ. ರೂಟ್ ಲುಕಪ್ನ ಫಲಿತಾಂಶವು kernel ಬಳಸುವ ಸಾಧನ ಮತ್ತು ಮೂಲ ವಿಳಾಸವನ್ನು ಹೆಸರಿಸುತ್ತದೆ, ಮತ್ತು ಕ್ಲೈಂಟ್ ತನ್ನ ಸಾಕೆಟ್ ತೆರೆದಾಗ ಸರಿಯಾಗಿ ಅದನ್ನೇ ಪಡೆಯುತ್ತದೆ.
ಸರಪಣಿಯನ್ನು ಪರೀಕ್ಷಿಸಿ ಮತ್ತು ವಿಫಲತೆಯನ್ನು ಕಾಣುವಂತೆ ಮಾಡಿ
ಒಳಗಿನ ಕ್ಲೈಂಟ್ ಸಂಪರ್ಕಗೊಳ್ಳುತ್ತಿರುವಾಗ ಹೊರಗಿನ ಇಂಟರ್ಫೇಸ್ನಲ್ಲಿ ಸೆರೆಹಿಡಿಯಿರಿ. ಒಳಗಿನ ಹ್ಯಾಂಡ್ಶೇಕ್ ಹೊರಗಿನ ಸುರಂಗದೊಳಗೆ ಎನ್ಕ್ರಿಪ್ಟ್ ಆದ ಪೇಲೋಡ್ ಆಗಿ ಕಾಣಬೇಕು; ಅದು 203.0.113.9 ಗೆ ಸಾಮಾನ್ಯ UDP ಆಗಿ ಕಂಡರೆ, ಹೋಸ್ಟ್ ರೂಟ್ ಇಲ್ಲ ಮತ್ತು ಸರಪಣಿ ಎಂದೂ ನಿರ್ಮಾಣವಾಗಿಲ್ಲ.
ಭೌತಿಕ ಅಪ್ಲಿಂಕ್ಗೆ ಮೌನವಾಗಿ ಮರಳುವ ಸರಪಣಿ ಅತ್ಯಂತ ಕೆಟ್ಟ ಫಲಿತಾಂಶ, ಏಕೆಂದರೆ ಇಂಟರ್ಫೇಸ್ ಸ್ಥಿತಿ ಏನನ್ನೂ ಘೋಷಿಸುವುದಿಲ್ಲ ಮತ್ತು ಒಳಗಿನ ಸಂಚಾರ ತಪ್ಪು ಮೂಲ ವಿಳಾಸದಿಂದ ಹೊರಡುತ್ತದೆ. ಹೊರಗಿನ ಸುರಂಗ ಬಿದ್ದಾಗ ಎರಡನೇ ಕ್ಲೈಂಟ್ ನೇರವಾಗಿ ಮರುಸಂಪರ್ಕಗೊಳ್ಳಬಲ್ಲದಾದರೆ, ಆ ಮಾರ್ಗವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಅಥವಾ ವಿಫಲತೆ ಕಾಣುವಂತೆ ಅದನ್ನು ಹೊರಗಿನ ಇಂಟರ್ಫೇಸ್ಗೆ ಬಂಧಿಸಿ.
ಎರಡು ಫ್ಲೋಗಳು ಮತ್ತು ಒಂದು ನಿಯಮ ಡಂಪ್ನೊಂದಿಗೆ ಮುಗಿಸಿ: ಗುರುತಿಸಿದ ಮತ್ತು ಗುರುತಿಸದ ಸಂಪರ್ಕಗಳು ಬೇರೆ ಬೇರೆ ಮಾರ್ಗಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬೇಕು, ಮತ್ತು ip rule show ನೀವು ಉದ್ದೇಶಿಸಿದ ಆದ್ಯತೆಯನ್ನು ಪಟ್ಟಿ ಮಾಡಬೇಕು. ಎರಡೂ ಫ್ಲೋಗಳು ಒಂದೇ ಮಾರ್ಗ ತೆಗೆದುಕೊಂಡರೆ, ಗುರುತು ನೀವು ಭಾವಿಸುವ ಸ್ಥಳದಲ್ಲಿ ಅನ್ವಯವಾಗುತ್ತಿಲ್ಲ.