ಪೂರೈಕೆದಾರ NAT ಗಳ ಮೂಲಕ ಕಂಪ್ಯೂಟರ್‌ಗಳ ನಡುವೆ ನೇರ VPN ಸುರಂಗ (VPS ಇಲ್ಲದೆ, STUN ಸರ್ವರ್ ಮತ್ತು Yandex.disk ಬಳಸಿ)

ಮುಂದುವರಿಕೆ ಲೇಖನಗಳು NAT ಪೂರೈಕೆದಾರರ ಹಿಂದೆ ಇರುವ ಎರಡು ಕಂಪ್ಯೂಟರ್‌ಗಳ ನಡುವೆ ನೇರ VPN ಸುರಂಗವನ್ನು ಹೇಗೆ ಸಂಘಟಿಸಲು ನಾನು ನಿರ್ವಹಿಸುತ್ತಿದ್ದೇನೆ ಎಂಬುದರ ಕುರಿತು. ಹಿಂದಿನ ಲೇಖನವು ಮೂರನೇ ವ್ಯಕ್ತಿಯ ಸಹಾಯದಿಂದ ಸಂಪರ್ಕವನ್ನು ಸಂಘಟಿಸುವ ಪ್ರಕ್ರಿಯೆಯನ್ನು ವಿವರಿಸಿದೆ - ಮಧ್ಯವರ್ತಿ (ಬಾಡಿಗೆ ಪಡೆದ VPS STUN ಸರ್ವರ್ ಮತ್ತು ಸಂಪರ್ಕಕ್ಕಾಗಿ ನೋಡ್ ಡೇಟಾ ಟ್ರಾನ್ಸ್‌ಮಿಟರ್‌ನಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ). ಈ ಲೇಖನದಲ್ಲಿ ನಾನು VPS ಇಲ್ಲದೆ ಹೇಗೆ ನಿರ್ವಹಿಸಿದೆ ಎಂದು ನಾನು ನಿಮಗೆ ಹೇಳುತ್ತೇನೆ, ಆದರೆ ಮಧ್ಯವರ್ತಿಗಳು ಉಳಿದುಕೊಂಡರು ಮತ್ತು ಅವರು STUN ಸರ್ವರ್ ಮತ್ತು Yandex.Disk...
ಪೂರೈಕೆದಾರ NAT ಗಳ ಮೂಲಕ ಕಂಪ್ಯೂಟರ್‌ಗಳ ನಡುವೆ ನೇರ VPN ಸುರಂಗ (VPS ಇಲ್ಲದೆ, STUN ಸರ್ವರ್ ಮತ್ತು Yandex.disk ಬಳಸಿ)

ಪರಿಚಯ

ಹಿಂದಿನ ಪೋಸ್ಟ್‌ನ ಕಾಮೆಂಟ್‌ಗಳನ್ನು ಓದಿದ ನಂತರ, ಅನುಷ್ಠಾನದ ಮುಖ್ಯ ನ್ಯೂನತೆಯು ಮಧ್ಯವರ್ತಿಯ ಬಳಕೆಯಾಗಿದೆ ಎಂದು ನಾನು ಅರಿತುಕೊಂಡೆ - ಮೂರನೇ ವ್ಯಕ್ತಿ (ವಿಪಿಎಸ್) ನೋಡ್‌ನ ಪ್ರಸ್ತುತ ನಿಯತಾಂಕಗಳನ್ನು ಎಲ್ಲಿ ಮತ್ತು ಹೇಗೆ ಸಂಪರ್ಕಿಸಬೇಕು ಎಂದು ಸೂಚಿಸುತ್ತದೆ. ಈ STUN ಅನ್ನು ಬಳಸಲು ಶಿಫಾರಸುಗಳನ್ನು ಪರಿಗಣಿಸಿ (ಅದರಲ್ಲಿ ಬಹಳಷ್ಟು ಇವೆ) ಪ್ರಸ್ತುತ ಸಂಪರ್ಕದ ನಿಯತಾಂಕಗಳನ್ನು ನಿರ್ಧರಿಸಲು. ಮೊದಲನೆಯದಾಗಿ, STUN ಸರ್ವರ್ ಕ್ಲೈಂಟ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ ಮತ್ತು ಸಂಪೂರ್ಣವಾಗಿ ಓದಲಾಗದ ವಿಷಯವನ್ನು ಸ್ವೀಕರಿಸಿದಾಗ ಪ್ಯಾಕೆಟ್‌ಗಳ ವಿಷಯಗಳನ್ನು ನೋಡಲು TCPDump ಅನ್ನು ಬಳಸಲು ನಾನು ನಿರ್ಧರಿಸಿದೆ. ನಾನು ಕಂಡ ಪ್ರೋಟೋಕಾಲ್ ಅನ್ನು ಗೂಗ್ಲಿಂಗ್ ಮಾಡಿದೆ ಪ್ರೋಟೋಕಾಲ್ ಅನ್ನು ವಿವರಿಸುವ ಲೇಖನ. STUN ಸರ್ವರ್‌ಗೆ ನನ್ನದೇ ಆದ ವಿನಂತಿಯನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ ಎಂದು ನಾನು ಅರಿತುಕೊಂಡೆ ಮತ್ತು ಕಲ್ಪನೆಯನ್ನು "ದೂರದ ಪೆಟ್ಟಿಗೆಯಲ್ಲಿ" ಹಾಕುತ್ತೇನೆ.

ಸಿದ್ಧಾಂತ

ಇತ್ತೀಚೆಗೆ ನಾನು ಪ್ಯಾಕೇಜ್‌ನಿಂದ ಡೆಬಿಯನ್‌ನಲ್ಲಿ STUN ಸರ್ವರ್ ಅನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗಿತ್ತು

# apt install stun-server

ಮತ್ತು ಅವಲಂಬನೆಗಳಲ್ಲಿ ನಾನು ಸ್ಟನ್-ಕ್ಲೈಂಟ್ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ನೋಡಿದೆ, ಆದರೆ ಹೇಗಾದರೂ ನಾನು ಅದಕ್ಕೆ ಗಮನ ಕೊಡಲಿಲ್ಲ. ಆದರೆ ನಂತರ ನಾನು ಸ್ಟನ್-ಕ್ಲೈಂಟ್ ಪ್ಯಾಕೇಜ್ ಬಗ್ಗೆ ನೆನಪಿಸಿಕೊಂಡಿದ್ದೇನೆ ಮತ್ತು ಅದು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡಲು ನಿರ್ಧರಿಸಿದೆ, ಯಾಂಡೆಕ್ಸ್‌ನಲ್ಲಿ ಗೂಗ್ಲಿಂಗ್ ಮತ್ತು ಹುಡುಕಿದ ನಂತರ ನನಗೆ ಸಿಕ್ಕಿತು:

# apt install stun-client
# stun stun.ekiga.net -p 21234 -v

ಪ್ರತಿಕ್ರಿಯೆಯಾಗಿ ನಾನು ಸ್ವೀಕರಿಸಿದ್ದೇನೆ:

STUN ಕ್ಲೈಂಟ್ ಆವೃತ್ತಿ 0.97
fd 21234 ನೊಂದಿಗೆ ಪೋರ್ಟ್ 3 ಅನ್ನು ತೆರೆಯಲಾಗಿದೆ
fd 21235 ನೊಂದಿಗೆ ಪೋರ್ಟ್ 4 ಅನ್ನು ತೆರೆಯಲಾಗಿದೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 0

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 4

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 2

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಸ್ಟನ್ ಸಂದೇಶವನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ: 92 ಬೈಟ್‌ಗಳು
MappedAddress = <ನನ್ನ IP>:2885
ಮೂಲ ವಿಳಾಸ = 216.93.246.18:3478
ಬದಲಾಯಿಸಿದ ವಿಳಾಸ = 216.93.246.17:3479
ಅಜ್ಞಾತ ಗುಣಲಕ್ಷಣ: 32800
ServerName = Vovida.org 0.98-CPC
ಟೈಪ್ 257 ಐಡಿ=1 ರ ಸಂದೇಶವನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 0

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.17:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 4

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 2

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 0

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು <ನನ್ನ ಐಪಿ>:2885 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಸ್ಟನ್ ಸಂದೇಶವನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ: 28 ಬೈಟ್‌ಗಳು
ಬದಲಾವಣೆ ವಿನಂತಿ = 0
ಟೈಪ್ 1 ಐಡಿ=11 ರ ಸಂದೇಶವನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 0

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.17:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 4

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 2

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಸ್ಟನ್ ಸಂದೇಶವನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ: 92 ಬೈಟ್‌ಗಳು
MappedAddress = <ನನ್ನ IP>:2885
ಮೂಲ ವಿಳಾಸ = 216.93.246.17:3479
ಬದಲಾಯಿಸಿದ ವಿಳಾಸ = 216.93.246.18:3478
ಅಜ್ಞಾತ ಗುಣಲಕ್ಷಣ: 32800
ServerName = Vovida.org 0.98-CPC
ಟೈಪ್ 257 ಐಡಿ=10 ರ ಸಂದೇಶವನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 4

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 2

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 4

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 2

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 4

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 2

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 4

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 2

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 4

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಎನ್ಕೋಡಿಂಗ್ ಸ್ಟನ್ ಸಂದೇಶ:
ಎನ್ಕೋಡಿಂಗ್ ಬದಲಾವಣೆ ವಿನಂತಿ: 2

ಲೆನ್ 28 ರ ಸಂದೇಶವನ್ನು 216.93.246.18:3478 ಗೆ ಕಳುಹಿಸುವ ಬಗ್ಗೆ
ಪರೀಕ್ಷೆ I = 1
ಪರೀಕ್ಷೆ II = 0
ಪರೀಕ್ಷೆ III = 0
ಪರೀಕ್ಷೆ I(2) = 1
ನ್ಯಾಟ್ = 1 ಆಗಿದೆ
ಮ್ಯಾಪ್ ಮಾಡಿದ IP ಅದೇ = 1
ಹೇರ್‌ಪಿನ್ = 1
ಸಂರಕ್ಷಕ ಪೋರ್ಟ್ = 0
ಪ್ರಾಥಮಿಕ: ಸ್ವತಂತ್ರ ಮ್ಯಾಪಿಂಗ್, ಪೋರ್ಟ್ ಡಿಪೆಂಡೆಂಟ್ ಫಿಲ್ಟರ್, ಯಾದೃಚ್ಛಿಕ ಪೋರ್ಟ್, ಹೇರ್‌ಪಿನ್ ಆಗುತ್ತದೆ
ರಿಟರ್ನ್ ಮೌಲ್ಯ 0x000006 ಆಗಿದೆ

ಮೌಲ್ಯದೊಂದಿಗೆ ಸ್ಟ್ರಿಂಗ್

MappedAddress = <ನನ್ನ IP>:2885

ನಿಮಗೆ ಬೇಕಾದುದನ್ನು! ಇದು ಸ್ಥಳೀಯ UDP ಪೋರ್ಟ್ 21234 ನಲ್ಲಿ ಸಂಪರ್ಕಕ್ಕಾಗಿ ಪ್ರಸ್ತುತ ಸ್ಥಿತಿಯನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತದೆ. ಆದರೆ ಇದು ಕೇವಲ ಅರ್ಧದಷ್ಟು ಯುದ್ಧವಾಗಿದೆ; ಈ ಡೇಟಾವನ್ನು ರಿಮೋಟ್ ಹೋಸ್ಟ್‌ಗೆ ವರ್ಗಾಯಿಸುವುದು ಮತ್ತು VPN ಸಂಪರ್ಕವನ್ನು ಹೇಗೆ ಆಯೋಜಿಸುವುದು ಎಂಬ ಪ್ರಶ್ನೆ ಉದ್ಭವಿಸಿದೆ. ಮೇಲ್ ಪ್ರೋಟೋಕಾಲ್ ಬಳಸಿ, ಅಥವಾ ಟೆಲಿಗ್ರಾಮ್?! ಹಲವು ಆಯ್ಕೆಗಳಿವೆ ಮತ್ತು ನಾನು Yandex.disk ಅನ್ನು ಬಳಸಲು ನಿರ್ಧರಿಸಿದೆ, ಏಕೆಂದರೆ ನಾನು ನೋಡಿದೆ Yandex.disk ಜೊತೆಗೆ WebDav ಮೂಲಕ ಕರ್ಲ್ ಕೆಲಸ ಮಾಡುವ ಬಗ್ಗೆ ಲೇಖನ. ಅನುಷ್ಠಾನದ ಬಗ್ಗೆ ಯೋಚಿಸಿದ ನಂತರ, ನಾನು ಈ ಕೆಳಗಿನ ಯೋಜನೆಯೊಂದಿಗೆ ಬಂದಿದ್ದೇನೆ:

  1. Yandex.disk ನಲ್ಲಿ ಟೈಮ್‌ಸ್ಟ್ಯಾಂಪ್‌ನೊಂದಿಗೆ ನಿರ್ದಿಷ್ಟ ಫೈಲ್‌ನ ಉಪಸ್ಥಿತಿಯಿಂದ ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲು ನೋಡ್‌ಗಳು ಸಿದ್ಧವಾಗಿವೆ ಎಂದು ಸಿಗ್ನಲ್ ಮಾಡಿ;
  2. ನೋಡ್‌ಗಳು ಸಿದ್ಧವಾಗಿದ್ದರೆ, STUN ಸರ್ವರ್‌ನಿಂದ ಪ್ರಸ್ತುತ ನಿಯತಾಂಕಗಳನ್ನು ಸ್ವೀಕರಿಸಿ;
  3. Yandex.disk ಗೆ ಪ್ರಸ್ತುತ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ;
  4. Yandex.disk ನಲ್ಲಿ ಫೈಲ್ನಿಂದ ರಿಮೋಟ್ ನೋಡ್ನ ಉಪಸ್ಥಿತಿ ಮತ್ತು ಓದುವ ನಿಯತಾಂಕಗಳನ್ನು ಪರಿಶೀಲಿಸಿ;
  5. OpenVPN ಬಳಸಿಕೊಂಡು ರಿಮೋಟ್ ಹೋಸ್ಟ್‌ನೊಂದಿಗೆ ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸುವುದು.

ಅಭ್ಯಾಸ

ಸ್ವಲ್ಪ ಯೋಚಿಸಿದ ನಂತರ, ಕಳೆದ ಲೇಖನದ ಅನುಭವವನ್ನು ಗಣನೆಗೆ ತೆಗೆದುಕೊಂಡು, ನಾನು ಬೇಗನೆ ಸ್ಕ್ರಿಪ್ಟ್ ಬರೆದೆ. ನಮಗೆ ಅಗತ್ಯವಿದೆ:

# apt install openvpn stun-client curl 

ಸ್ಕ್ರಿಪ್ಟ್ ಸ್ವತಃ:

ಮೂಲ ಆವೃತ್ತಿ

# cat vpn8.sh

#!/bin/bash
######################## Задаем цветной текст ###
WARN='33[37;1;41m'				#
END='33[0m'					#
RED='33[0;31m'         #  ${RED}		#
GREEN='33[0;32m'      #  ${GREEN}		#
#################################################
####################### Проверяем наличие необходымих приложений #########################################################
al="echo readlink dirname grep awk md5sum shuf nc curl sleep openvpn cat stun"
ch=0
for i in $al; do which $i > /dev/null || echo -e "${WARN}Для работы необходим $i ${END}"; which $i > /dev/null || ch=1; done
if (( $ch > 0 )); then echo -e "${WARN}Ой, отсутствуют необходимые для корректной работы приложения${END}"; exit; fi
#######################################################################################################################

if [[ $1 == '' ]]; then echo -e "${WARN}Введите идентификатор соединения (любое уникальное слово, должно быть одинаковое с двух сторон!) ${END} t
${GREEN}Для запуска в автоматическом режиме при включении компьютера можно прописать в /etc/rc.local строку nohup /<путь к файлу>/vpn8.sh  > /var/log/vpn8.log 2>/dev/hull & ${END}"; exit; fi
ABSOLUTE_FILENAME=`readlink -f "$0"`                                                    # полный путь до скрипта
DIR=`dirname "$ABSOLUTE_FILENAME"`                                                      # каталог в котором лежит скрипт
############################### Проверка наличия секретного ключа ##################################
key="$DIR/secret.key"
if [ ! -f "$key" ]; then
				echo -e "${WARN}Секретный ключ VPN-соединения не найден, для генерации ключа выполните: 
openvpn --genkey --secret secret.key Внимание: ключ используется для авторизации и должен 
быть одинаковым с двух сторон!!!${END}
 # ls -l secret.key
 -rw------- 1 root root 637 ноя 27 11:12 secret.key
 # chmod 600 secret.key";
				exit;
				fi
########################################################################################################################

ABSOLUTE_FILENAME=`readlink -f "$0"`                                                    # полный путь до скрипта
DIR=`dirname "$ABSOLUTE_FILENAME"`                                                      # каталог в котором лежит скрипт
name=$(uname -n | md5sum | awk '{print $1}')
vpn=$(echo $1 | md5sum | awk '{print $1}')
stun="stun.ekiga.net" 	# STUN сервер
username="Yandex"	# Логин от Яндекс.диска	
password="Password"	# Пароль от Яндекс.диска
localport=`shuf -i 20000-65000 -n 1`	# генерация локального порта

echo "$(date) Создаю папку на Яндекс.диске"
curl -X MKCOL --user "${username}:${password}" https://webdav.yandex.ru/vpn-$vpn
echo "$(date) Очищаю папку от всякого мусора"
for i in `curl --silent --user "$username:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></n/g' | grep "d:displayname" | sed 's/d:displayname//g' | sed 's/>//g' | sed 's/<//' | sed 's////g' | grep -v $(date +%Y-%m-%d-%H-%M)`; do
	echo "$(date) Delete: $i"
	curl -X DELETE --user "${username}:${password}" https://webdav.yandex.ru/vpn-$vpn/$i
	done

until [ $c ];do

	until [[ $b ]]; do
		echo "$(date) Проверяю папку"
		date=`date +%Y-%m-%d-%H-%M`
		mydata=`curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></>n</g' | grep $name | grep $date | grep "d:displayname"`
		if [[ -z $mydata ]]; 	then
						echo "$(date) Файл готовности создан"
					        echo "$date" > "/tmp/$date-$name-ready.txt"
					        curl -T "/tmp/$date-$name-ready.txt" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$date-$name-ready.txt
					else
						echo "$(date) Файл готовности уже существует - $date"
					fi
		remote=`curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></>n</g' | grep -v $name | grep $date | grep "d:displayname"`
		if [[ -z $remote ]];	then
						echo -e "$(date) ${RED} Удаленный узел не готов ${END}"
						echo "$(date) Жду"
						sleep 20
					else
						echo -e "$(date) ${GREEN} Удаленный узел готов ${END}"
						b=1
						a=''
					fi
	done

	until [ $a ]; do
		echo "$(date) Подключение и получение данных от STUN сервера: $stun"
                mydata=`stun $stun -p $localport -v 2>&1 | grep MappedAddress | sort | uniq`
                echo -e "$(date) ${GREEN}Мои данные соединения: $mydata${END}"
                echo "$mydata" > "$DIR/mydata"
                echo "$(date) Загрузка данных на Яндекс.диск"
                curl -T "$DIR/mydata" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$name.txt
		echo "$(date) Получение файла данных удаленного узла"
		filename=$(curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></n/g' | grep "d:displayname>" | grep "txt" | grep -v "$name" | grep -v "ready" | sed 's|.*d:displayname>||' | sed 's/</ /g' | awk '{print $1}')
		echo "$(date) Чтение файла данных удаленного узла: $filename"
		address=$(curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$filename | sort | uniq | head -n1 | sed 's/:/ /g')
		echo "$(date) Определение IP-адреса и порта"
		ip=$(echo "$address" | awk '{print $3}')
		port=$(echo "$address" | awk '{print $4}')
		if [[ -n "$ip" && -n "$port" ]]; then
			echo -e "$(date) ${GREEN} Соединение $ip $port ${END}"
       		 	openvpn --remote $ip --rport $port --lport $localport 
	       	 	    --proto udp --dev tap --float --auth-nocache --verb 3 --mute 20 
	       	 	    --ifconfig 10.45.54.2 255.255.255.252 
	       		    --secret "$DIR/secret.key" 
	       		    --auth SHA256 --cipher AES-256-CBC 
	        	    --ncp-disable --ping 10  --ping-exit 30 
	        	    --comp-lzo yes
			echo -e "$(date) ${WARN} Соединение разорвано${END}"
			a=1
			b=''
			else
			a=1
			b=''
			fi
	done
done

ಸ್ಕ್ರಿಪ್ಟ್ ಕೆಲಸ ಮಾಡಲು ನಿಮಗೆ ಅಗತ್ಯವಿದೆ:

  1. ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿ ಮತ್ತು ಸಂಪಾದಕದಲ್ಲಿ ಅಂಟಿಸಿ, ಉದಾಹರಣೆಗೆ:
    # nano vpn8.sh 
  2. Yandex.disk ಗಾಗಿ ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ.
  3. "-ifconfig 10.45.54.(1 ಅಥವಾ 2) 255.255.255.252" ಕ್ಷೇತ್ರದಲ್ಲಿ ಇಂಟರ್ಫೇಸ್‌ನ ಆಂತರಿಕ IP ವಿಳಾಸವನ್ನು ಸೂಚಿಸಿ
  4. ರಚಿಸಿ ರಹಸ್ಯ.ಕೀ ಆಜ್ಞೆ:
    # openvpn --genkey --secret secret.key 
  5. ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಂತೆ ಮಾಡಿ:
    # chmod +x vpn8.sh
  6. ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ರನ್ ಮಾಡಿ:
    # ./vpn8.sh nZbVGBuX5dtturD

    ಅಲ್ಲಿ nZbVGBuX5dtturD ಎಂಬುದು ಸಂಪರ್ಕ ID ಅನ್ನು ರಚಿಸಲಾಗಿದೆ ಇಲ್ಲಿ

ರಿಮೋಟ್ ನೋಡ್‌ನಲ್ಲಿ, ಸೀಕ್ರೆಟ್.ಕೀ ಮತ್ತು ಸಂಪರ್ಕ ಐಡಿಯನ್ನು ಉತ್ಪಾದಿಸುವುದನ್ನು ಹೊರತುಪಡಿಸಿ ಎಲ್ಲವನ್ನೂ ಒಂದೇ ರೀತಿ ಮಾಡಿ, ಅವು ಒಂದೇ ಆಗಿರಬೇಕು.

ನವೀಕರಿಸಿದ ಆವೃತ್ತಿ (ಸರಿಯಾದ ಕಾರ್ಯಾಚರಣೆಗಾಗಿ ಸಮಯವನ್ನು ಸಿಂಕ್ರೊನೈಸ್ ಮಾಡಬೇಕು):

cat vpn10.sh

#!/bin/bash
stuns="stun.sipnet.ru stun.ekiga.net"   		# Список STUN серверов через пробел
username=" Login "		# Логин от Яндекс.диска
password=" Password "   	# Пароль от Яндекс.диска
intip="10.23.22.1"		# IP-адрес внутреннего интерфейса
WARN='33[37;1;41m'
END='33[0m'
RED='33[0;31m'
GREEN='33[0;32m'
al="ip echo readlink dirname grep awk md5sum openssl sha256sum shuf curl sleep openvpn cat stun"
ch=0
for i in $al; do which $i > /dev/null || echo -e "${WARN}Для работы необходим $i ${END}"; which $i > /dev/null || ch=1; done
if (( $ch > 0 )); then echo -e "${WARN}Ой, отсутствуют необходимые для корректной работы приложения${END}"; exit; fi
if [[ $1 == '' ]];
then
echo -e "${WARN}Введите идентификатор соединения (любое уникальное слово, должно быть одинаковое с двух сторон!) ${END} t
${GREEN}Для запуска в автоматическом режиме при включении компьютера можно прописать в /etc/rc.local строку nohup /<путь к файлу>/vpn10.sh  > /var/log/vpn10.log 2>/dev/hull & ${END}"
exit
fi
ABSOLUTE_FILENAME=`readlink -f "$0"`                                                    # полный путь до скрипта
DIR=`dirname "$ABSOLUTE_FILENAME"`                                                      # каталог в котором лежит скрипт
key="$DIR/secret.key"
until [[ -n "$iftosrv" ]]
do
echo "$(date) Определяю сетевой интерфейс"; iftosrv=`ip route get 8.8.8.8 | head -n 1 | sed 's|.*dev ||' | awk '{print $1}'`
sleep 5
done
timedatectl
name=$(uname -n | md5sum | awk '{print $1}')
vpn=$(echo $1 | md5sum | awk '{print $1}')
echo "$(date) Создаю папку на Яндекс.диске"
curl -X MKCOL --user "${username}:${password}" https://webdav.yandex.ru/vpn-$vpn
echo "$(date) ID на диске: $vpn"
until [ $c ];do
echo "$(date) Очищаю папку от всякого мусора"
for i in `curl --silent --user "$username:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></n/g' | grep "d:displayname" | sed 's/d:displayname//g' | sed 's/>//g' | sed 's/<//' | sed 's////g' | grep -v $(date +%Y-%m-%d-%H-%M)`
do
echo -e "$(date)${RED} Удаляю старый файл: $i${END}"
curl -X DELETE --user "${username}:${password}" https://webdav.yandex.ru/vpn-$vpn/$i
done
echo "$(date) ID на диске: $vpn"
openvpn --genkey --secret "$key"
passwd=`echo "$vpn-tt" | sha256sum | awk '{print $1}'`
openssl AES-256-CBC -e -in "$key" -out "$DIR/file.enc" -k "$passwd" -base64
curl -T "$DIR/file.enc" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/key.enc
rm "$DIR"/file.enc
echo -e "$(date) ${GREEN}Фаза 1 - Получение готовности удаленного узла${END}"
go=3
localport=`shuf -i 20000-65000 -n 1`    # генерация локального порта
start=''
remote=''
timeout1=''
nextcheck=''
timestart=''
until [[ $b ]]
do
echo "$(date) Проверяю папку"
date=`date +%s`
timeout1=60
echo "$(date) Создание файла готовности $date"
echo "$date" > "/tmp/ready-$date-$name.txt"
curl -T "/tmp/ready-$date-$name.txt" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/ready-$name.txt
readyfile=`curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></>n</g' | grep -v $name | grep "ready" | grep "d:displayname" | sed 's/<d:displayname>//g' | sed 's/</d:displayname>//g'`
if [[ -z $readyfile ]]
then
echo -e "$(date) ${RED} Удаленный узел не готов ${END}"
echo "$(date) Жду 60 секунд"
sleep $timeout1
else
remote=$(curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$readyfile)
echo -e "$(date) ${GREEN} Удаленный узел готов ${END}"
start=`curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></>n</g' | grep "start" | grep "d:displayname" | sed 's/-/ /g' | awk '{print $2}'`
if [[ -z $start ]]
then
let nextcheck=$timeout1-$date+$remote
let timestart=$date+$timeout1-$nextcheck
go=$nextcheck
echo "$timestart" > "/tmp/start-$date-$name.txt"
curl -T "/tmp/start-$date-$name.txt" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/start-$date-$name.txt
else
echo "$(date) жду $go секунд"
sleep $go
b=1
a=''
fi
fi
done
echo -e "$(date) ${GREEN}Фаза 2 - Обмен данными и установка соединения${END}"
mydata=''
filename=''
address=''
myip=''
ip=''
port=''
ex=0
until [ $a ]; do
until [[ -n "$mydata" ]]; do
k=`echo "$stuns" | wc -w`
x=1
z=`shuf -i 1-$k -n 1`
for st in $stuns; do
if [[ $x == $z ]]; then
stun=$st;
fi;
(( x++ ));
done
echo "$(date) Подключение и получение данных от STUN сервера: $stun"
sleep 5 && for pid in $(ps xa | grep "stun "$stun" 1 -p "$localport" -v" | grep -v grep | awk '{print $1}'); do kill $pid; done &
mydata=`stun "$stun" 1 -p "$localport" -v 2>&1 | grep "MappedAddress" | sort | uniq`
done
echo -e "$(date) ${GREEN}Мои данные соединения: $mydata${END}"
echo "$(date) Загрузка данных на Яндекс.диск"
echo "$mydata" > "$DIR/mydata"
echo "IntIP $intip" >> "$DIR/mydata"
curl -T "$DIR/mydata" --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$name-ipport.txt
rm "$DIR/mydata"
sleep 5
echo "$(date) Получение файла данных удаленного узла"
filename=$(curl --silent --user "${username}:${password}" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/vpn-$vpn/ | sed 's/></n/g' | grep "d:displayname>" | grep "ipport" | grep -v "$name" |  sed 's|.*d:displayname>||' | sed 's/</ /g' | awk '{print $1}')
if [[ -n "$filename" ]]
then
echo "$(date) Чтение файла данных удаленного узла: $filename"
address=$(curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$filename | grep "MappedAddress" | head -n1 | sed 's/:/ /g')
intip2=$(curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/$filename | grep "IntIP" | head -n1 | awk '{print $2}')
echo "$(date) Определение IP-адреса и порта: $address $sesid2 $tunid2"
ip=$(echo "$address" | awk '{print $3}')
port=$(echo "$address" | awk '{print $4}')
myip=`ip route get "$ip" | head -n 1 | sed 's|.*src ||' | awk '{print $1}'`
if [[ -n "$ip" && -n "$port" && -n "$myip" && -n "$localport" ]];
then
echo -e "$(date) ${GREEN} Соединение $ip $port ${END}"
echo -e  "`date` ${GREEN} $myip:$localport -> $ip:$port ${END}"
curl --silent --user "$username:$password" https://webdav.yandex.ru/vpn-$vpn/key.enc > "$DIR/secret.enc"
openssl AES-256-CBC -d -in "$DIR/secret.enc" -out "$key" -k "$passwd" -base64
chmod 600 "$key"
rm "$DIR/secret.enc"
openvpn --remote $ip --rport $port --lport $localport 
--proto udp --dev tun --float --auth-nocache --verb 3 --mute 20 
--ifconfig "$intip" "$intip2" 
--secret "$key" 
--auth SHA256 --cipher AES-256-CBC 
--ncp-disable --ping 10 --ping-exit 20 
--comp-lzo yes
a=1
b=''
fi
else
if (( $ex >= 5 ))
then
echo "$(date) Сброс"
a=1
b=''
fi
(( ex++ ))
sleep 5
fi
done
done

ಸ್ಕ್ರಿಪ್ಟ್ ಕೆಲಸ ಮಾಡಲು ನಿಮಗೆ ಅಗತ್ಯವಿದೆ:

  1. ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿ ಮತ್ತು ಸಂಪಾದಕದಲ್ಲಿ ಅಂಟಿಸಿ, ಉದಾಹರಣೆಗೆ:
    # nano vpn10.sh 
  2. Yandex.disk (2 ನೇ ಸಾಲು) ಗಾಗಿ ಲಾಗಿನ್ (3 ನೇ ಸಾಲು) ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸೂಚಿಸಿ.
  3. ಸುರಂಗದ ಆಂತರಿಕ IP ವಿಳಾಸವನ್ನು ಸೂಚಿಸಿ (4 ನೇ ಸಾಲು).
  4. ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಂತೆ ಮಾಡಿ:
    # chmod +x vpn10.sh
  5. ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ರನ್ ಮಾಡಿ:
    # ./vpn10.sh nZbVGBuX5dtturD

    ಅಲ್ಲಿ nZbVGBuX5dtturD ಎಂಬುದು ಸಂಪರ್ಕ ID ಅನ್ನು ರಚಿಸಲಾಗಿದೆ ಇಲ್ಲಿ

ರಿಮೋಟ್ ನೋಡ್ನಲ್ಲಿ, ಅದೇ ರೀತಿ ಮಾಡಿ, ಸುರಂಗ ಮತ್ತು ಸಂಪರ್ಕ ID ಯ ಅನುಗುಣವಾದ ಆಂತರಿಕ IP ವಿಳಾಸವನ್ನು ಸೂಚಿಸಿ.

ಆನ್ ಮಾಡಿದಾಗ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಸ್ವಯಂಚಾಲನೆ ಮಾಡಲು, ನಾನು "nohup /<ಸ್ಕ್ರಿಪ್ಟ್‌ಗೆ ಮಾರ್ಗ>/vpn10.sh nZbVGBuX5dtturD > /var/log/vpn10.log 2>/dev/null &" ಫೈಲ್‌ನಲ್ಲಿ ಒಳಗೊಂಡಿರುವ ಆಜ್ಞೆಯನ್ನು ಬಳಸುತ್ತೇನೆ /etc/ rc.local

ತೀರ್ಮಾನಕ್ಕೆ

ಸ್ಕ್ರಿಪ್ಟ್ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಉಬುಂಟು (18.04, 19.10, 20.04) ಮತ್ತು ಡೆಬಿಯನ್ 9 ನಲ್ಲಿ ಪರೀಕ್ಷಿಸಲಾಗಿದೆ. ನೀವು ಯಾವುದೇ ಇತರ ಸೇವೆಯನ್ನು ಟ್ರಾನ್ಸ್‌ಮಿಟರ್ ಆಗಿ ಬಳಸಬಹುದು, ಆದರೆ ಅನುಭವಕ್ಕಾಗಿ ನಾನು Yandex.disk ಅನ್ನು ಬಳಸಿದ್ದೇನೆ.
ಪ್ರಯೋಗಗಳ ಸಮಯದಲ್ಲಿ, ಕೆಲವು ರೀತಿಯ NAT ಪೂರೈಕೆದಾರರು ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲು ಅನುಮತಿಸುವುದಿಲ್ಲ ಎಂದು ಕಂಡುಹಿಡಿಯಲಾಯಿತು. ಮುಖ್ಯವಾಗಿ ಮೊಬೈಲ್ ಆಪರೇಟರ್‌ಗಳಿಂದ ಟೊರೆಂಟ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.

ನಾನು ಪರಿಭಾಷೆಯಲ್ಲಿ ಸುಧಾರಿಸಲು ಯೋಜಿಸುತ್ತೇನೆ:

  • ರಿಮೋಟ್ ನೋಡ್‌ಗೆ ವರ್ಗಾಯಿಸಲು Yandex.disk ಗೆ ನೀವು ಪ್ರಾರಂಭಿಸಿದಾಗ, ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿ ಮತ್ತು ನಕಲಿಸಿ ಪ್ರತಿ ಬಾರಿಯೂ secret.key ನ ಸ್ವಯಂಚಾಲಿತ ಉತ್ಪಾದನೆ (ನವೀಕರಿಸಿದ ಆವೃತ್ತಿಯಲ್ಲಿ ಗಣನೆಗೆ ತೆಗೆದುಕೊಳ್ಳುವುದು)
  • ಇಂಟರ್ಫೇಸ್ಗಳ IP ವಿಳಾಸಗಳ ಸ್ವಯಂಚಾಲಿತ ನಿಯೋಜನೆ
  • Yandex.disk ಗೆ ಅಪ್ಲೋಡ್ ಮಾಡುವ ಮೊದಲು ಡೇಟಾವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ
  • ಕೋಡ್ ಆಪ್ಟಿಮೈಸೇಶನ್

ಪ್ರತಿ ಮನೆಯಲ್ಲೂ IPv6 ಇರಲಿ!

ನವೀಕರಿಸಲಾಗಿದೆ! ಇತ್ತೀಚಿನ ಫೈಲ್‌ಗಳು ಮತ್ತು DEB ಪ್ಯಾಕೇಜ್ ಇಲ್ಲಿ - yandex.disk

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ