Docker ನಲ್ಲಿ OpenVPN: ಕನಿಷ್ಠ ಕ್ಲೈಂಟ್ ಬಯಸುವ ರನ್ಟೈಮ್ ಒಪ್ಪಂದ
ಪರಿಶೀಲಿಸಿದ ಇಮೇಜ್, ಒಂದು ಸುರಕ್ಷಿತ ಪ್ರೊಫೈಲ್, TUN ಪ್ರವೇಶ ಮತ್ತು NET_ADMIN. ಕಂಟೇನರ್ ಏನು ಪಡೆಯುತ್ತದೆ, ಏನನ್ನು ಪಡೆಯಬಾರದು ಮತ್ತು ಸುರಂಗ ಕೆಲಸ ಮಾಡುತ್ತದೆ ಎಂದು ಹೇಗೆ ಸಾಬೀತುಪಡಿಸುವುದು.
VPN ಕ್ಲೈಂಟ್ ಅನ್ನು ಕಂಟೇನರ್ನಲ್ಲಿ ಇರಿಸಿ, ಒಳಗೆ ಸುರಂಗವಿರುವ ಒಂದು ನೇಮ್ಸ್ಪೇಸ್ ಸಿಗುತ್ತದೆ, ತನ್ನ ಎಲ್ಲಾ ಟ್ರಾಫಿಕ್ ಅನ್ನು VPN ಮೂಲಕ ರೂಟ್ ಮಾಡುವ ಹೋಸ್ಟ್ ಅಲ್ಲ. ಇವು ಬೇರೆ ಬೇರೆ ಯೋಜನೆಗಳು, ಮತ್ತು ಅವನ್ನು ಒಂದೆಂದು ಪರಿಗಣಿಸುವುದೇ ಕಂಟೇನರ್ಗಳು ಆಕಸ್ಮಿಕವಾಗಿ ಪ್ರಿವಿಲೇಜ್ಡ್ ಆಗುವ ಮಾರ್ಗ. ಈ ಕೈಪಿಡಿ ಮೊದಲನೆಯದನ್ನು ಮಾತ್ರ ಒಳಗೊಳ್ಳುತ್ತದೆ: ಒಂದು ಪರಿಶೀಲಿಸಿದ ಇಮೇಜ್, ಒಂದು ಸುರಕ್ಷಿತ ಪ್ರೊಫೈಲ್ ಮತ್ತು ತನ್ನದೇ ನೆಟ್ವರ್ಕ್ ನೇಮ್ಸ್ಪೇಸ್ಗೆ ಸೀಮಿತವಾದ ಕ್ಲೈಂಟ್ ಪ್ರಕ್ರಿಯೆ.
ಯಾರೋ ಈಗಾಗಲೇ ಅನುಮೋದಿಸಿದ ಕಲಾಕೃತಿಯಿಂದ ಪ್ರಾರಂಭಿಸಿ. ಕೆಳಗಿನ ಹಂತಗಳು openvpn ಕಾರ್ಯನಿರ್ವಾಹಕ ಫೈಲ್ ಮತ್ತು ಪ್ರಮಾಣಪತ್ರ ಹಾಗೂ ಕೀ ಸಾಮಗ್ರಿ ಮೌಂಟ್ ಒಳಗೆ ಈಗಾಗಲೇ ಪರಿಹರಿಸಲಾದ ಪೂರ್ಣ ಕ್ಲೈಂಟ್ ಪ್ರೊಫೈಲ್ ಇರುವ ಇಮೇಜ್ ಅನ್ನು ಊಹಿಸುತ್ತವೆ. ಅವು ತಂತ್ರಾಂಶವನ್ನು ನಿರ್ಮಿಸುವುದಿಲ್ಲ, ರುಜುವಾತುಗಳನ್ನು ನೀಡುವುದಿಲ್ಲ ಮತ್ತು root ಇಲ್ಲದ ರನ್ಟೈಮ್ಗಳು ಹಾಗೂ ಸ್ಥಳೀಯ Windows ಕಂಟೇನರ್ಗಳನ್ನು ಒಳಗೊಳ್ಳುವುದಿಲ್ಲ, ಅವುಗಳಲ್ಲಿ ಪ್ರತಿಯೊಂದೂ ಉತ್ತರವನ್ನು ಬದಲಿಸುತ್ತದೆ.
ಕಂಟೇನರ್ ಏನು ಪಡೆಯುತ್ತದೆ ಮತ್ತು ಏನು ಪಡೆಯುವುದಿಲ್ಲ
ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದು ಉಲ್ಲೇಖಿಸುವ ಎಲ್ಲವನ್ನೂ ಸೀಮಿತ ಅನುಮತಿಗಳ ಸ್ಥಳೀಯ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಇರಿಸಿ, ಓದಲು-ಮಾತ್ರ ಎಂದು ಮೌಂಟ್ ಮಾಡಿ. ಪ್ರೊಫೈಲ್ ಒಳಗಿನ ಸಾಪೇಕ್ಷ ಮಾರ್ಗಗಳು ಆ ಮೌಂಟ್ ಒಳಗೆ ಪರಿಹರಿಸಲ್ಪಡಬೇಕು; ಪ್ರಮಾಣಪತ್ರವು ಪ್ರೊಫೈಲ್ನಿಂದ ಒಂದು ಡೈರೆಕ್ಟರಿ ಮೇಲಿರುವಾಗ ಮತ್ತು ಕಂಟೇನರ್ ಅದನ್ನು ಎಂದಿಗೂ ನೋಡದಿದ್ದಾಗ ಜನರು ಕಳೆದುಕೊಳ್ಳುವ ವಿವರ ಇದು.
services:
vpn:
image: ${VPN_CLIENT_IMAGE:?set the reviewed image reference}
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- ./vpn:/vpn:ro
working_dir: /vpn
entrypoint: ["openvpn"]
command: ["--config", "/vpn/client.ovpn"]
ಆ ಫೈಲ್ ಮೂರು ವಿಷಯಗಳನ್ನು ನೀಡುತ್ತದೆ ಮತ್ತು ಬೇರೆ ಏನನ್ನೂ ಕೇಳುವುದಿಲ್ಲ. ನಿಮ್ಮ ನಿಯೋಜನೆ ನೀತಿ ಹೇಳಿದರೆ ಇಮೇಜ್ ಉಲ್ಲೇಖವನ್ನು ಡೈಜೆಸ್ಟ್ನಿಂದ ಪಿನ್ ಮಾಡಬೇಕು, ಮತ್ತು ಪ್ರೊಫೈಲ್ ಪರಿಶೀಲಿಸಿದ್ದೇ ಆಗಿರಬೇಕು, ಹೋಸ್ಟ್ನಲ್ಲಿ ಯಾರೋ ಸ್ಥಳದಲ್ಲೇ ಸಂಪಾದಿಸಿದ ಪ್ರತಿ ಅಲ್ಲ.
ಇಲ್ಲಿ ಓದಲು-ಮಾತ್ರ ಎಂದರೆ ಕಂಟೇನರ್ ನಿಮ್ಮ ಹೋಸ್ಟ್ ಫೈಲ್ಗಳನ್ನು ಬದಲಿಸಲಾರದು; ನೀವು ಮೌಂಟ್ ಮಾಡಿದ ಖಾಸಗಿ ಕೀಯನ್ನು ಓದಲಾರದು ಎಂದಲ್ಲ. ಮೌಂಟ್ನ ಸಂಪೂರ್ಣ ಉದ್ದೇಶ ಅದೇ, ಮತ್ತು ಅದಕ್ಕೇ ಫೈಲ್ ಅನುಮತಿಗಳು, ಮಾಲೀಕತ್ವ ಮತ್ತು ರಹಸ್ಯವು ಹೋಸ್ಟ್ಗೆ ಹೇಗೆ ಬಂತು ಎಂಬುದು ಇನ್ನೂ ಮುಖ್ಯ. ಕಮಾಂಡ್ ಸಾಲಿನಲ್ಲಿ ಎಂದಿಗೂ ಪಾಸ್ವರ್ಡ್ ನೀಡಬೇಡಿ ಮತ್ತು ಅದನ್ನು ಇಮೇಜ್ ಪದರದಲ್ಲಿ ಬೇಕ್ ಮಾಡಬೇಡಿ, ಏಕೆಂದರೆ ಎರಡೂ ನಂತರ ಸ್ವಚ್ಛಗೊಳಿಸಲಾಗದ ಸ್ಥಳಗಳಲ್ಲಿ ಉಳಿಯುತ್ತವೆ.
ಸಾಮರ್ಥ್ಯಗಳು, entrypoint ಮತ್ತು ಅವುಗಳ ನಡುವಿನ ಬಲೆ
ಎರಡು ಸೆಟ್ಟಿಂಗ್ಗಳು ಬೇಕು ಮತ್ತು ಅವು ಸಂಬಂಧವಿಲ್ಲದ ಕೆಲಸಗಳನ್ನು ಮಾಡುತ್ತವೆ. NET_ADMIN ಕಂಟೇನರ್ನ ನೇಮ್ಸ್ಪೇಸ್ ಒಳಗೆ ಇಂಟರ್ಫೇಸ್ ಮತ್ತು ಮಾರ್ಗಗಳ ಕುಶಲತೆಯನ್ನು ಅನುಮತಿಸುತ್ತದೆ. /dev/net/tun ಸಾಧನ ನಮೂದು ಪ್ರಕ್ರಿಯೆಗೆ ಸುರಂಗ ಸಾಧನವನ್ನು ಸಹ ತೆರೆಯಲು ಅನುಮತಿಸುತ್ತದೆ. ಒಂದನ್ನು ಇನ್ನೊಂದಿಲ್ಲದೆ ನೀಡುವುದು ಸ್ಪಷ್ಟ ವೈಫಲ್ಯವನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ, ಅದು ಅನುಕೂಲಕರ: ಕಾಣೆಯಾದ TUN ಸಾಧನ ತೆರೆಯುವಾಗ ವಿಫಲವಾಗುತ್ತದೆ, ಆದರೆ ಕಾಣೆಯಾದ ಸಾಮರ್ಥ್ಯ ಕ್ಲೈಂಟ್ ಇಂಟರ್ಫೇಸ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿದಾಗ ವಿಫಲವಾಗುತ್ತದೆ.
ಇವುಗಳಲ್ಲಿ ಯಾವುದೂ privileged: true ಅನ್ನು ಸಮರ್ಥಿಸುವುದಿಲ್ಲ. ಪ್ರಿವಿಲೇಜ್ಡ್ ಕಂಟೇನರ್ ಎಲ್ಲಾ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಮತ್ತು ಸಾಧನ ಪ್ರವೇಶವನ್ನು ಪಡೆಯುತ್ತದೆ, ಮತ್ತು ಇದು ಈ ಕೆಲಸದ ಹೊರೆಗೆ ಬೇಕಾದ್ದಕ್ಕಿಂತ ದೊಡ್ಡ ಮಂಜೂರಾತಿ. ರನ್ಟೈಮ್ ಪ್ರಿವಿಲೇಜ್ ಮತ್ತು ಸಾಮರ್ಥ್ಯಗಳ ಉಲ್ಲೇಖ ಈ ಮಂಜೂರಾತಿ ಎಷ್ಟು ದೂರ ತಲುಪುತ್ತದೆ ಎಂಬುದನ್ನು ವಿವರಿಸುತ್ತದೆ. chart ಅಥವಾ ಬ್ಲಾಗ್ ಪೋಸ್ಟ್ ಅದನ್ನು ಕೇಳಿದರೆ, ಮೊದಲು ಅಗತ್ಯವು ನಿಜವಾಗಿ ಕಾಣೆಯಾದ ಸಾಧನ ಮಾರ್ಗವೋ ಅಥವಾ ಕಾಣೆಯಾದ ಸಾಮರ್ಥ್ಯವೋ ಎಂದು ಪರಿಶೀಲಿಸಿ.
entrypoint ಅನ್ನು ಓವರ್ರೈಡ್ ಮಾಡುವುದು ಕಚ್ಚುವ ಭಾಗ. openvpn ಅನ್ನು ನೇರವಾಗಿ ಕರೆಯುವುದು ಸಾಮಾನ್ಯ ಇಮೇಜ್ಗೆ ಸರಿ ಮತ್ತು ಡೇಮನ್ ಚಲಾಯಿಸುವ ಮೊದಲು ಫೈರ್ವಾಲ್ ನಿಯಮಗಳು, ರಿಜಾಲ್ವರ್ ಫೈಲ್ಗಳು ಅಥವಾ ರುಜುವಾತುಗಳನ್ನು ಸಿದ್ಧಪಡಿಸುವ ಯಾವುದೇ ಉತ್ಪನ್ನ ಇಮೇಜ್ಗೆ ತಪ್ಪು. ಆ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಓವರ್ರೈಡ್ ಮಾಡುವುದು ಸಿದ್ಧತೆಯನ್ನು ಬಿಟ್ಟುಬಿಡುತ್ತದೆ ಮತ್ತು ಅರ್ಧ-ಕಾನ್ಫಿಗರ್ ಆದ ನೇಮ್ಸ್ಪೇಸ್ನಲ್ಲಿ ಎದ್ದ ಸುರಂಗವನ್ನು ಡೀಬಗ್ ಮಾಡಲು ಬಿಡುತ್ತದೆ.
ಕ್ಲೈಂಟ್ ಅನ್ನು ಮುಂಭಾಗದಲ್ಲಿ ಚಲಾಯಿಸಿ ಮತ್ತು ಅದು ಕಂಟೇನರ್ನ ಮುಖ್ಯ ಪ್ರಕ್ರಿಯೆಯಾಗಿರಲಿ. ಡೇಮನೈಜ್ ಆಗುವ ಪ್ರಕ್ರಿಯೆ ತಕ್ಷಣ ನಿರ್ಗಮಿಸುತ್ತದೆ, ಕಂಟೇನರ್ ಲೂಪ್ನಲ್ಲಿ ಮರುಪ್ರಾರಂಭವಾಗುತ್ತದೆ, ಮತ್ತು ನಿಮಗೆ ಬೇಕಾದ ಲಾಗ್ಗಳು ಒಂದೇ ರೀತಿ ಕಾಣುವ ಮರುಪ್ರಾರಂಭಗಳ ನಡುವೆ ಚದುರಿವೆ.
ನೇಮ್ಸ್ಪೇಸ್ ಒಳಗಿನಿಂದ ಪರಿಶೀಲಿಸಿ, ಹೋಸ್ಟ್ನಿಂದ ಅಲ್ಲ
ಸ್ಟಾಕ್ ಅನ್ನು ಮೇಲೆತ್ತಿ, ಕ್ಲೈಂಟ್ ಸಂಪರ್ಕಿತ ಸ್ಥಿತಿಯನ್ನು ತಲುಪಿದೆ ಎಂದು ಲಾಗ್ನಲ್ಲಿ ಖಚಿತಪಡಿಸಿ, ನಂತರ ಸುರಂಗವನ್ನು ನಿಜವಾಗಿ ಹಿಡಿದಿರುವ ನೇಮ್ಸ್ಪೇಸ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ.
docker compose up -d
docker compose logs --tail 40 vpn
docker compose exec vpn ip -br addr
docker compose exec vpn ip route
ವಿಳಾಸಗಳ ಪಟ್ಟಿಯು ಪೂಲ್ನಿಂದ ವಿಳಾಸವಿರುವ ಸುರಂಗ ಇಂಟರ್ಫೇಸ್ ಅನ್ನು ತೋರಿಸಬೇಕು, ಮತ್ತು ಮಾರ್ಗ ಕೋಷ್ಟಕವು ಅದರ ಕಡೆಗೆ ತೋರಿಸುವ ಪುಶ್ ಮಾಡಿದ ಗಮ್ಯಸ್ಥಾನಗಳನ್ನು ತೋರಿಸಬೇಕು. ಇಂಟರ್ಫೇಸ್ ಇಲ್ಲದಿದ್ದರೆ, ಕ್ಲೈಂಟ್ ಅದನ್ನು ರಚಿಸುವ ಹಂತಕ್ಕೆ ಎಂದಿಗೂ ತಲುಪಿಲ್ಲ. ಅದು ಇದ್ದರೂ ಯಾವುದೇ ಮಾರ್ಗ ಅದನ್ನು ಬಳಸದಿದ್ದರೆ, ಹುಡುಕುವ ಸ್ಥಳ push ಅಥವಾ ಮಾರ್ಗ ಆಯ್ಕೆಗಳು.
ನಂತರ ನಿಮಗೆ ಮುಖ್ಯವಾದ ಗಮ್ಯಸ್ಥಾನವನ್ನು ಸುರಂಗವನ್ನು ಬಳಸಬೇಕಾದ ನೇಮ್ಸ್ಪೇಸ್ನಿಂದ, ಅಪ್ಲಿಕೇಶನ್ನಿಂದ ಮತ್ತು ಕೇವಲ ping ನಿಂದ ಅಲ್ಲ, ಪರೀಕ್ಷಿಸಿ. ಹೆಸರು ಪರಿಹರಣವು ಪ್ರತ್ಯೇಕ ವೈಫಲ್ಯ, ಅದನ್ನು ಸ್ಪಷ್ಟವಾಗಿ ಪರೀಕ್ಷಿಸುವುದು ಯೋಗ್ಯ: ಪುಶ್ ಮಾಡಿದ DNS ವಿಳಾಸವು ಕಂಟೇನರ್ನ ರಿಜಾಲ್ವರ್ ಅನ್ನು ತಾನಾಗಿಯೇ ನವೀಕರಿಸುವುದಿಲ್ಲ, ಮತ್ತು push ಅನ್ನು ನಿರ್ಲಕ್ಷಿಸುವ ಸ್ವತಂತ್ರ ಕ್ಲೈಂಟ್ ಇಮೇಜ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದರ ಮೂಲಕ ಹೆಸರುಗಳನ್ನು ಪರಿಹರಿಸುತ್ತದೆ.
ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡ ಸ್ಥಿತಿ ಒಪ್ಪಂದದ ಭಾಗ
ಮರುಸಂಪರ್ಕದ ನಡವಳಿಕೆಗೆ ಅದರದೇ ಪರಿಶೀಲನೆ ಬೇಕು, ಏಕೆಂದರೆ ಮರುಪ್ರಾರಂಭ ನೀತಿ ಪ್ರಕ್ರಿಯೆ ಮರುಪ್ರಾರಂಭವಾಗುತ್ತದೆ ಎಂದು ಸಾಬೀತುಪಡಿಸುತ್ತದೆ ಮತ್ತು ಅಷ್ಟರಲ್ಲಿ ಸಂಚಾರ ಏನು ಮಾಡುತ್ತದೆ ಎಂದು ಏನನ್ನೂ ಹೇಳುವುದಿಲ್ಲ. ಸುರಂಗವನ್ನು ನಿಲ್ಲಿಸಿ, ಉದ್ದೇಶಿತ ಗಮ್ಯಸ್ಥಾನವನ್ನು ಪ್ರಯತ್ನಿಸಿ ಮತ್ತು ಸಂಪರ್ಕವು ನಿರಾಕರಿಸಲ್ಪಡುತ್ತದೆಯೋ, ನೇತಾಡುತ್ತದೆಯೋ ಅಥವಾ ಕಂಟೇನರ್ನ ಸಾಮಾನ್ಯ ಮಾರ್ಗದ ಮೂಲಕ ಸದ್ದಿಲ್ಲದೆ ಯಶಸ್ವಿಯಾಗುತ್ತದೆಯೋ ಎಂದು ಗಮನಿಸಿ. ಕೊನೆಯ ಫಲಿತಾಂಶವೇ ಮುಖ್ಯ, ಮತ್ತು ಅದು ಆರೋಗ್ಯಕರ ಲಾಗ್ನಲ್ಲಿ ಅಗೋಚರ.
ಕೆಲಸದ ಹೊರೆ ಎಂದಿಗೂ ಸಾಮಾನ್ಯ ಮಾರ್ಗವನ್ನು ಬಳಸಬಾರದು ಎಂದಾದರೆ, ಅದನ್ನು ಫೈರ್ವಾಲ್ ನಿಯಮಗಳು ಮತ್ತು ನೇಮ್ಸ್ಪೇಸ್ ಒಳಗಿನ ಸಿದ್ಧತೆ ಸಂಕೇತದೊಂದಿಗೆ ಸ್ಪಷ್ಟವಾಗಿ ವಿನ್ಯಾಸ ಮಾಡಿ. Kill switch ಎಂಬುದು ನೀವು ಬರೆಯುವ ಮತ್ತು ಪರೀಕ್ಷಿಸುವ ನೀತಿ, ಕಂಟೇನರ್ನಲ್ಲಿ ಕ್ಲೈಂಟ್ ಚಲಾಯಿಸಿ ಪಡೆಯುವ ಗುಣ ಅಲ್ಲ.
ಕೊನೆಯದಾಗಿ, ಮಿತಿಯನ್ನು ನೆನಪಿಡಿ: ಈ ಮಾರ್ಗಗಳು ಕಂಟೇನರ್ನ ನೇಮ್ಸ್ಪೇಸ್ನಲ್ಲಿ ವಾಸಿಸುತ್ತವೆ ಮತ್ತು ಹೋಸ್ಟ್ನ ರೂಟಿಂಗ್ ಕೋಷ್ಟಕವನ್ನು ಬದಲಿಸುವುದಿಲ್ಲ. Docker ನ ಫಾರ್ವರ್ಡಿಂಗ್, ಅನುವಾದ ಮತ್ತು ಫೈರ್ವಾಲ್ ನಿಯಮಗಳು ಹೊರ ಮಾರ್ಗದ ಭಾಗವಾಗಿ ಉಳಿಯುತ್ತವೆ, ಮತ್ತು ಪ್ರಕಟಿಸಿದ ಪೋರ್ಟ್ VPN ಇಂಟರ್ಫೇಸ್ ಅಲ್ಲ.