VPN ನೇಮ್ಸ್ಪೇಸ್ನೊಳಗಿನ ಅಪ್ಲಿಕೇಶನ್ LAN ನಿಂದ ತಲುಪಲಾಗದು
ನೆಟ್ವರ್ಕ್ ನೇಮ್ಸ್ಪೇಸ್ ಒಂದು ಪ್ರೋಗ್ರಾಂಗೆ ತನ್ನದೇ ಸುರಂಗ ಮತ್ತು ತನ್ನದೇ ಲೂಪ್ಬ್ಯಾಕ್ ನೀಡುತ್ತದೆ. ಹೋಸ್ಟ್ನ ಬದಲು ಅದರ ಪೋರ್ಟ್ ಅನ್ನು socat ಹಾಪ್ ಅಥವಾ veth ಜೋಡಿಯಿಂದ ಪ್ರಕಟಿಸಿ.
ನಿಮ್ಮ ಸೇವೆ ಯಂತ್ರದಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತಿದೆ, ಸುರಂಗ ಚಾಲ್ತಿಯಲ್ಲಿದೆ, ಮತ್ತು ಆದರೂ ನಿಮ್ಮ ಡೆಸ್ಕ್ನ ಬ್ರೌಸರ್ ಇನ್ನೂ ಉತ್ತರಕ್ಕಾಗಿ ಕಾಯುತ್ತಿದೆ. ಸಾಮಾನ್ಯ ಅರ್ಥದಲ್ಲಿ ಏನೂ ಮುರಿದಿಲ್ಲ: ಅಪ್ಲಿಕೇಶನ್ ನೆಟ್ವರ್ಕ್ ನೇಮ್ಸ್ಪೇಸ್ನ ಒಳಗೆ ಆಲಿಸುತ್ತಿದೆ, ಮತ್ತು ಆ ಸ್ಟಾಕ್ LAN ಗೆ ಅಗೋಚರವಾಗಿದೆ. ಅದರ ಲೂಪ್ಬ್ಯಾಕ್ ನೇಮ್ಸ್ಪೇಸ್ಗೆ ಸೇರಿದೆ, ಆದ್ದರಿಂದ ಬೇರೆ ಯಂತ್ರದ ಕ್ಲೈಂಟ್ಗೆ ಪೋರ್ಟ್ ತಲುಪುವ ಯಾವುದೇ ವಿಳಾಸವಿಲ್ಲ. ಒಂದು ಉದ್ದೇಶಪೂರ್ವಕ ಹಾಪ್, ಅಥವಾ ಒಂದು veth ಜೋಡಿ, ಹೋಸ್ಟ್ನ ಉಳಿದ ಭಾಗವನ್ನು ಸರಿಸದೆ ಇದನ್ನು ಸರಿಪಡಿಸುತ್ತದೆ.
LAN ವಿಳಾಸದಲ್ಲಿ ಏನೂ ಉತ್ತರಿಸದಿರುವುದೇಕೆ
ನೇಮ್ಸ್ಪೇಸ್ ಸಂಪೂರ್ಣ ನೆಟ್ವರ್ಕ್ ಸ್ಟಾಕ್: ಇಂಟರ್ಫೇಸ್ಗಳು, ರೂಟ್ಗಳು, ಫೈರ್ವಾಲ್ ನಿಯಮಗಳು ಮತ್ತು ಖಾಸಗಿ ಲೂಪ್ಬ್ಯಾಕ್. ip netns exec ಮೂಲಕ ಪ್ರಾರಂಭಿಸಿದ ಪ್ರಕ್ರಿಯೆ ಆ ಸ್ಟಾಕ್ ಅನ್ನು ಮಾತ್ರ ನೋಡುತ್ತದೆ, ಆದ್ದರಿಂದ ಅದು ಬಂಧಿಸುವ ವಿಳಾಸ ನೇಮ್ಸ್ಪೇಸ್ನ ಒಳಗೆ ಮಾತ್ರ ಪರಿಹಾರವಾಗುತ್ತದೆ. ಹೋಸ್ಟ್ನ ಸ್ವಂತ 127.0.0.1 ಸಂಪೂರ್ಣವಾಗಿ ಬೇರೆ ಲೂಪ್ಬ್ಯಾಕ್.
ಆದ್ದರಿಂದ ಹೋಸ್ಟ್ನಲ್ಲಿ curl ವಿಫಲವಾಗುತ್ತದೆ, ಆದರೆ ನೇಮ್ಸ್ಪೇಸ್ನೊಳಗೆ ಅದೇ ಆಜ್ಞೆ ಯಶಸ್ವಿಯಾಗುತ್ತದೆ. ಅಪ್ಲಿಕೇಶನ್ ಆರೋಗ್ಯವಾಗಿದೆ; ವಿಳಾಸವು ಹೋಸ್ಟ್ನ ಸ್ಟಾಕ್ನಲ್ಲಿ ಇಲ್ಲ, ಅಷ್ಟೆ.
socat ಹಾಪ್ನಿಂದ ಒಂದು ಪೋರ್ಟ್ ಪ್ರಕಟಿಸಿ
socat ಎರಡು ಸ್ಟಾಕ್ಗಳನ್ನು ಬಳಕೆದಾರ ಜಾಗದಲ್ಲಿ ಸೇತುವೆ ಮಾಡುತ್ತದೆ, ಒಂದೇ TCP ಪೋರ್ಟ್ ದಾಟಬೇಕಾದಾಗ ಇದು ಸಾಕು. ಹೋಸ್ಟ್ ಬದಿ LAN ನಲ್ಲಿ ಆಲಿಸುತ್ತದೆ ಮತ್ತು ಸ್ವೀಕರಿಸಿದ ಪ್ರತಿ ಸಂಪರ್ಕಕ್ಕೂ ನೇಮ್ಸ್ಪೇಸ್ನೊಳಗೆ ಎರಡನೇ socat ಪ್ರಾರಂಭಿಸುತ್ತದೆ, ಅದು ಅಪ್ಲಿಕೇಶನ್ನ ಲೂಪ್ಬ್ಯಾಕ್ಗೆ ಸಂಪರ್ಕಿಸುತ್ತದೆ. ಒಳಗಿನ ಪ್ರಕ್ರಿಯೆ ಸ್ಥಳೀಯ ಕ್ಲೈಂಟ್ನಂತೆಯೇ ಅಪ್ಲಿಕೇಶನ್ ತಲುಪುತ್ತದೆ. ನೇಮ್ಸ್ಪೇಸ್ನ ರೂಟಿಂಗ್ನಲ್ಲಿ ಏನೂ ಬದಲಾಗುವುದಿಲ್ಲ, ಆದ್ದರಿಂದ ಅಪ್ಲಿಕೇಶನ್ ಸುರಂಗವನ್ನೇ ತನ್ನ ಏಕೈಕ ನಿರ್ಗಮನವಾಗಿ ಬಳಸುತ್ತದೆ.
socat TCP-LISTEN:9100,reuseaddr,fork EXEC:'ip netns exec vpn socat STDIO tcp-connect:127.0.0.1:9100',nofork
ಹೊರಗಿನ ಪ್ರಕ್ರಿಯೆಗೆ root ಅಥವಾ ನೇಮ್ಸ್ಪೇಸ್ ಪ್ರವೇಶಿಸುವ ಸಾಮರ್ಥ್ಯ ಬೇಕು. VPN ಬಿದ್ದರೆ ಅಪ್ಲಿಕೇಶನ್ ತನ್ನ ದಾರಿ ಕಳೆದುಕೊಳ್ಳುತ್ತದೆ ಮತ್ತು ಪ್ರಕಟಿಸಿದ ಪೋರ್ಟ್ ಮುಚ್ಚಿದ ಸ್ಥಿತಿಯಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ, ಮತ್ತು ಜೈಲಿನಿಂದ ನೀವು ಬಯಸುವ ನಡವಳಿಕೆ ಅದೇ.
ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಪೋರ್ಟ್ ದಾಟಿದಾಗ veth ಜೋಡಿ ಬಳಸಿ
ಹಲವು ಪೋರ್ಟ್ಗಳು ಅಥವಾ ಪ್ರೋಟೋಕಾಲ್ಗಳು ದಾಟಬೇಕಾದಾಗ, ಅಥವಾ ಬೇರೆ ಹೋಸ್ಟ್ಗಳು ಸಂಪರ್ಕ ಪ್ರಾರಂಭಿಸಬೇಕಾದಾಗ veth ಜೋಡಿಯೇ ಸರಿಯಾದ ಉತ್ತರ. ಒಂದು ತುದಿ ಹೋಸ್ಟ್ನಲ್ಲಿ ಉಳಿಯುತ್ತದೆ, ಇನ್ನೊಂದು ನೇಮ್ಸ್ಪೇಸ್ಗೆ ಹೋಗುತ್ತದೆ, ಮತ್ತು ಸಣ್ಣ /30 ಎರಡೂ ಬದಿಗೆ ಸ್ಥಿರ ವಿಳಾಸ ನೀಡುತ್ತದೆ. ನಂತರ ಹೋಸ್ಟ್ ರೂಟ್ ನೇಮ್ಸ್ಪೇಸ್ನ ವಿಳಾಸವನ್ನು ಜೋಡಿಯ ಮೇಲೆ ಕಳುಹಿಸುತ್ತದೆ.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns vpn
ip addr add 10.77.0.1/30 dev veth0
ip link set veth0 up
ip netns exec vpn ip addr add 10.77.0.2/30 dev veth1
ip netns exec vpn ip link set veth1 up
ಜೈಲು ಮುರಿಯುವ ಉದ್ದೇಶವಿಲ್ಲದಿದ್ದರೆ ಹೋಸ್ಟ್ ಮೂಲಕ ಡೀಫಾಲ್ಟ್ ರೂಟ್ ಸೇರಿಸಬೇಡಿ. ಸುರಂಗವೇ ನಿರ್ಗಮನವಾಗಿರಬೇಕು, ಆದ್ದರಿಂದ ಜೋಡಿಯ ಮೇಲೆ ಪ್ರಕಟಿಸಿದ ಸೇವಾ ವಿಳಾಸಕ್ಕೆ ಮಾತ್ರ ತಲುಪಬಹುದು. ನೇಮ್ಸ್ಪೇಸ್ಗೆ ಅದರದೇ ರಿಜಾಲ್ವರ್ ಫೈಲ್ ಕೂಡ ಕೊಡಿ, ಏಕೆಂದರೆ ip netns exec /etc/netns/vpn/resolv.conf ಓದುತ್ತದೆ ಮತ್ತು ಅದಿಲ್ಲದೆ ಜೈಲಿನೊಳಗಿನ ಹೆಸರು ಪರಿಹಾರ ಖಾಲಿಯಾಗಿರುತ್ತದೆ.
ಹೋಸ್ಟ್ನಿಂದ ಅಲ್ಲ, ಬೇರೆ ಯಂತ್ರದಿಂದ ಪರೀಕ್ಷಿಸಿ
ಪರೀಕ್ಷೆಯನ್ನು ಎರಡನೇ ಯಂತ್ರದಿಂದ ನಡೆಸಿ, ಏಕೆಂದರೆ ಹೋಸ್ಟ್ ಸ್ಥಳೀಯ ಆಲಿಸುವವರನ್ನು LAN ಬಗ್ಗೆ ಏನೂ ಹೇಳದ ದಾರಿಗಳಿಂದ ತಲುಪಬಹುದು. ಮೊದಲು ಅಪ್ಲಿಕೇಶನ್ ನೇಮ್ಸ್ಪೇಸ್ನೊಳಗೆ ನಿಜವಾಗಿ ಯಾವುದಕ್ಕೆ ಬಂಧಿಸಿದೆ ಎಂದು ಪರಿಶೀಲಿಸಿ, ನಂತರ ಹೊರಗಿನಿಂದ ಪ್ರಕಟಿತ ವಿಳಾಸಕ್ಕೆ ಸಂಪರ್ಕಿಸಿ. ಅಲ್ಲಿ ಪ್ರತಿ ವಿಳಾಸಕ್ಕೂ ಬಂಧಿಸುವುದು ಜೈಲನ್ನು ವಿಸ್ತರಿಸುವುದಿಲ್ಲ, ಏಕೆಂದರೆ ವೈಲ್ಡ್ಕಾರ್ಡ್ ಇನ್ನೂ ನೇಮ್ಸ್ಪೇಸ್ಗೇ ಸೇರಿದೆ ಮತ್ತು LAN ಅದನ್ನು ನೋಡಲಾಗದು.
ip netns exec vpn ss -lntp
ಹೋಸ್ಟ್ನ ಸಂಪರ್ಕ ಕೆಲಸ ಮಾಡಿ LAN ನ ಸಂಪರ್ಕ ಮಾಡದಿದ್ದರೆ, ಕಾಣೆಯಾದ ಭಾಗ ಹಾಪ್ ಅಥವಾ ರೂಟ್, ಬಂಧನ ವಿಳಾಸವಲ್ಲ. ಜೀವಂತ tun ಸಾಧನವನ್ನು ಒಳಗೆ ಸರಿಸುವ ಬದಲು ನೇಮ್ಸ್ಪೇಸ್ನೊಳಗೆ OpenVPN ಪ್ರಾರಂಭಿಸಿ, ಏಕೆಂದರೆ ಇಂಟರ್ಫೇಸ್ ಸರಿಸುವುದು ಅದನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ ಮತ್ತು ನಂತರ ಹೊರಗಿನಿಂದ ಸರಿಪಡಿಸಲಾಗದ ರೂಟ್ಗಳನ್ನು ಅಳಿಸಬಹುದು. ಚೇತರಿಕೆ ಆಜ್ಞೆಗಳನ್ನು ಜೈಲಿನೊಳಗೆ ಅಲ್ಲ, ಕನ್ಸೋಲ್ನಲ್ಲಿ ಇರಿಸಿ.