Những cuộc phiêu lưu bất ngờ

Những cuộc phiêu lưu bất ngờ

Cách Spotify có thể giúp bạn nghiên cứu daemon, RFC, mạng và quảng bá nguồn mở. Hoặc điều gì sẽ xảy ra nếu bạn không thể trả tiền nhưng bạn thực sự muốn có một số quà tặng cao cấp.

bắt đầu

Vào ngày thứ ba, người ta nhận thấy Spotify đang hiển thị quảng cáo dựa trên quốc gia của địa chỉ IP. Người ta cũng lưu ý rằng ở một số quốc gia, quảng cáo hoàn toàn không được nhập khẩu. Ví dụ, ở Cộng hòa Belarus. Và sau đó một kế hoạch “tuyệt vời” đã được nảy ra nhằm vô hiệu hóa quảng cáo trong tài khoản không cao cấp.

Một chút về Spotify

Nói chung Spotify có chính sách lạ. Anh trai của chúng tôi phải khá khó khăn để mua phí bảo hiểm: thay đổi vị trí trong hồ sơ của anh ấy sang nước ngoài, tìm kiếm một thẻ quà tặng phù hợp chỉ có thể thanh toán bằng PayPal, gần đây hoạt động kỳ lạ và muốn có một loạt tài liệu. Nói chung, nó cũng là một cuộc phiêu lưu, nhưng theo một trật tự khác. Mặc dù hầu hết mọi người làm điều này vì phiên bản di động nhưng tôi không quan tâm đến nó. Do đó, mọi thứ bên dưới sẽ chỉ hữu ích trong trường hợp phiên bản dành cho máy tính để bàn. Hơn nữa, sẽ không có sự mở rộng chức năng. Chỉ cần cắt bỏ một số cái thừa.

Tại sao nó lại phức tạp như vậy?

Và tôi đã nghĩ như vậy khi đăng ký dữ liệu proxy vớ trong cấu hình Spotify. Vấn đề hóa ra là việc xác thực trong tất bằng thông tin đăng nhập và mật khẩu không hoạt động. Ngoài ra, các nhà phát triển thường xuyên làm điều gì đó xung quanh proxy: đôi khi cho phép nó, đôi khi cấm nó, đôi khi phá vỡ nó, điều này dẫn đến toàn bộ nhóm thảo luận bên ngoài trang web.

Người ta quyết định không dựa vào các chức năng không ổn định và tìm thứ gì đó đáng tin cậy và thú vị hơn.

Ở đâu đó người đọc phải hỏi: tại sao không lấy ssh với một chiếc chìa khóa -D và đó là kết thúc của nó? Và nói chung, anh ấy sẽ đúng. Nhưng trước hết, điều này vẫn cần phải được loại bỏ và kết bạn với autossh, để không phải nghĩ đến những kết nối bị rách. Và thứ hai: nó quá đơn giản và nhàm chán.

theo thứ tự

Như thường lệ, chúng ta hãy đi từ trái sang phải, từ trên xuống dưới và mô tả mọi thứ chúng ta cần để thực hiện ý tưởng “đơn giản” của mình.

Đầu tiên bạn cần một proxy

Và có nhiều lựa chọn thay thế cùng một lúc:

  • bạn chỉ có thể truy cập và lấy từ danh sách proxy mở. Rẻ (hay đúng hơn là không có gì), nhưng hoàn toàn không đáng tin cậy và tuổi thọ của các proxy như vậy có xu hướng bằng không. Do đó, cần phải tìm/viết một trình phân tích cú pháp cho danh sách proxy, lọc chúng theo loại và quốc gia mong muốn và câu hỏi về việc thay thế proxy được tìm thấy trong Spotify vẫn còn bỏ ngỏ (à, có lẽ thông qua HTTP_PROXY chuyển và tạo trình bao bọc tùy chỉnh cho tệp nhị phân để tất cả lưu lượng truy cập khác không được gửi đến đó).
  • Bạn có thể mua một proxy tương tự và tự cứu mình khỏi hầu hết các vấn đề được mô tả ở trên. Nhưng với mức giá của proxy, bạn có thể mua ngay gói trả phí trên Spotify và điều này không thực tế đối với nhiệm vụ ban đầu.
  • Hãy nâng cao của bạn. Như bạn có thể đoán, đây là sự lựa chọn của chúng tôi.

Hoàn toàn tình cờ mà bạn có một người bạn có máy chủ ở Cộng hòa Belarus hoặc một quốc gia nhỏ khác. Bạn cần sử dụng cái này và triển khai proxy mong muốn trên đó. Những người sành điệu đặc biệt có thể hài lòng với một người bạn có bộ định tuyến trên DD-WRT hoặc phần mềm tương tự. Nhưng ở đó của mình thế giới tuyệt vời và thế giới này rõ ràng không phù hợp với khuôn khổ của câu chuyện này.

Vì vậy, các lựa chọn của chúng tôi: Squid - không truyền cảm hứng và tôi không muốn proxy HTTP, đã có quá nhiều giao thức này xung quanh. Và trong lĩnh vực SOCKS không có gì hợp lý ngoại trừ Dante vẫn chưa giao hàng. Vì vậy, chúng ta hãy lấy nó.

Đừng chờ đợi hướng dẫn cài đặt và cấu hình của Dante. Anh ta chỉ cần tìm kiếm trên Google và không được quan tâm đặc biệt. Trong cấu hình tối thiểu, bạn cần đưa vào tất cả các loại client pass, socks pass, đăng ký chính xác các giao diện và đừng quên thêm socksmethod: username. Ở dạng này, để xác thực, logopass sẽ được lấy từ người dùng hệ thống. Và phần về bảo mật: cấm truy cập vào localhost, giới hạn người dùng, v.v. - đây hoàn toàn là chuyện cá nhân, tùy thuộc vào chứng hoang tưởng cá nhân.

Triển khai proxy đối diện với mạng

Vở kịch có hai màn.

hành động một

Chúng tôi đã sắp xếp proxy, bây giờ chúng tôi cần truy cập nó từ web toàn cầu. Nếu bạn có một máy có IP trắng ở quốc gia mong muốn thì bạn có thể bỏ qua điểm này một cách an toàn. Chúng tôi không có (như đã đề cập ở trên, chúng tôi được lưu trữ tại nhà bạn bè) và IP trắng gần nhất ở đâu đó ở Đức, vì vậy chúng tôi sẽ nghiên cứu mạng.

Vì vậy, người đọc chú ý sẽ lại hỏi: tại sao bạn không sử dụng dịch vụ hiện có như ngrok hoặc tương tự? Và anh ấy sẽ lại đúng. Nhưng đây là một dịch vụ, nó lại cần phải bị quỷ ám, nó cũng có thể tốn tiền và nói chung là nó không mang tính thể thao. Vì vậy, chúng tôi sẽ tạo ra những chiếc xe đạp từ những vật liệu phế liệu.

Nhiệm vụ: có một proxy ở đâu đó đằng sau NAT, bạn cần treo nó trên một trong các cổng của VPS có IP trắng và nằm ở rìa thế giới.

Thật hợp lý khi cho rằng vấn đề này có thể được giải quyết bằng cách chuyển tiếp cổng (được thực hiện thông qua các phương pháp nêu trên). ssh) hoặc bằng cách kết hợp phần cứng vào mạng ảo thông qua VPN. VỚI ssh chúng tôi biết cách làm việc, autossh Thật nhàm chán khi sử dụng, vì vậy hãy sử dụng OpenVPN.

DigitalOcean có manul tuyệt vời về vấn đề này. Tôi không có gì để thêm vào nó. Và cấu hình kết quả có thể được kết nối khá dễ dàng với ứng dụng khách OpenVPN và systemd. Chỉ cần đặt nó (config) vào /etc/openvpn/client/ và đừng quên thay đổi phần mở rộng thành .conf. Sau đó, kéo dịch vụ [email protected]đừng quên làm điều đó cho cô ấy enable và vui mừng vì mọi thứ đã bay đi.

Tất nhiên, chúng tôi cần vô hiệu hóa mọi chuyển hướng lưu lượng truy cập sang VPN mới được tạo, vì chúng tôi không muốn giảm tốc độ trên máy khách bằng cách chuyển lưu lượng truy cập qua nửa quả bóng.

Và vâng, chúng tôi cần đăng ký địa chỉ IP tĩnh trên máy chủ VPN cho máy khách của mình. Điều này sẽ cần thiết ở phần sau của câu chuyện. Để làm điều này bạn cần kích hoạt ifconfig-pool-persist, biên tập ipp.txt, đi kèm với OpenVPN và bật client-config-dir, đồng thời chỉnh sửa cấu hình của ứng dụng khách mong muốn bằng cách thêm ifconfig-push với mặt nạ chính xác và địa chỉ IP mong muốn.

Màn hai

Bây giờ chúng ta có một chiếc máy trên “mạng” đối diện với Internet và có thể được sử dụng cho những mục đích ích kỷ. Cụ thể là chuyển hướng một phần lưu lượng truy cập qua nó.

Vì vậy, một nhiệm vụ mới: bạn cần tắt lưu lượng đến một trong các cổng VPS có IP màu trắng để lưu lượng này đi đến mạng ảo mới kết nối và phản hồi có thể quay trở lại từ đó.

Giải pháp: tất nhiên iptables! Khi nào khác bạn mới có cơ hội tuyệt vời như vậy để thực hành với anh ấy?

Cấu hình cần thiết có thể được tìm thấy khá nhanh chóng, trong ba giờ, hàng trăm lời chửi thề và một số dây thần kinh lãng phí, bởi vì việc gỡ lỗi mạng là một quy trình rất cụ thể.

Trước tiên, bạn cần kích hoạt chuyển hướng lưu lượng truy cập trong kernel. Thứ này được gọi là ipv4.ip_forward và được kích hoạt hơi khác nhau tùy thuộc vào hệ điều hành và trình quản lý mạng.

Thứ hai, bạn cần chọn một cổng trên VPS và gộp tất cả lưu lượng truy cập vào cổng đó vào mạng con ảo. Điều này có thể được thực hiện, ví dụ như thế này:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -j DNAT --to-destination 10.8.0.2:8080

Ở đây chúng tôi chuyển hướng tất cả lưu lượng TCP đến cổng 8080 của giao diện bên ngoài sang máy có IP 10.8.0.2 và cùng cổng 8080.

Dành cho những người muốn biết chi tiết bẩn thỉu của công việc netfilter, iptables và định tuyến nói chung, nhất thiết phải xem xét này hoặc này.

Vì vậy, bây giờ các gói của chúng tôi bay đến mạng con ảo và... chúng vẫn ở đó. Chính xác hơn, phản hồi từ proxy vớ sẽ quay trở lại cổng mặc định trên máy có Dante và người nhận sẽ bỏ nó, bởi vì trong các mạng, thông lệ là gửi yêu cầu đến một IP và nhận phản hồi từ một IP khác. Vì vậy, chúng ta cần tiếp tục gợi ý.

Vì vậy, bây giờ bạn cần chuyển hướng tất cả các gói từ proxy trở lại mạng con ảo về phía VPS có IP màu trắng. Ở đây tình hình tệ hơn một chút, bởi vì nó chỉ là iptables chúng tôi sẽ không có đủ, bởi vì nếu chúng tôi sửa địa chỉ đích trước khi định tuyến (PREROUTING), thì gói của chúng tôi sẽ không bay lên Internet và nếu chúng tôi không sửa nó, gói sẽ chuyển đến default gateway. Vì vậy, bạn cần làm như sau: hãy nhớ chuỗi mangle, để đánh dấu các gói thông qua iptables và gói chúng trong một bảng định tuyến tùy chỉnh sẽ đưa chúng đến nơi chúng cần đến.

Không sớm nói hơn làm:

iptables -t mangle -A OUTPUT -p tcp --sport 8080 -j MARK --set-mark 0x80
ip rule add fwmark 0x80 table 80
ip route add default via 10.8.0.1 dev tun0 table 80

Chúng tôi lấy lưu lượng đi, đánh dấu mọi thứ bay từ cổng mà proxy đặt (8080 trong trường hợp của chúng tôi), chuyển hướng tất cả lưu lượng được đánh dấu đến bảng định tuyến bằng số 80 (nói chung, số này không phụ thuộc vào bất cứ điều gì, chúng tôi chỉ muốn to) và thêm một quy tắc duy nhất, theo đó tất cả các gói có trong bảng này sẽ chuyển đến mạng con VPN.

Tuyệt vời! Bây giờ các gói sẽ quay trở lại VPS... và chết ở đó. Bởi vì VPS không biết phải làm gì với chúng. Do đó, nếu không bận tâm, bạn có thể chỉ cần chuyển hướng tất cả lưu lượng truy cập đến từ mạng con ảo trở lại Internet:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 172.42.1.10

Tại đây, mọi thứ đến từ mạng con 10.8.0.0 với mặt nạ 255.255.255.000 đều được gói trong source-NAT và chuyển đến giao diện mặc định, được chuyển sang Internet. Điều quan trọng cần lưu ý là điều này sẽ chỉ hoạt động nếu chúng tôi chuyển tiếp cổng một cách minh bạch, nghĩa là cổng đến trên VPS khớp với cổng proxy của chúng tôi. Nếu không bạn sẽ phải chịu đựng nhiều hơn một chút.

Ở đâu đó bây giờ mọi thứ sẽ bắt đầu hoạt động. Và chỉ còn lại một chút: đừng quên đảm bảo rằng tất cả các cấu hình iptables и route không tiếp tục sau khi khởi động lại. Vì iptables có những tập tin đặc biệt như /etc/iptables/rules.v4(trong trường hợp Ubuntu), nhưng đối với các tuyến thì mọi thứ phức tạp hơn một chút. Tôi đẩy họ vào up/down Các tập lệnh OpenVPN, mặc dù tôi nghĩ chúng có thể được thực hiện tốt hơn.

Bao bọc lưu lượng truy cập từ ứng dụng trong proxy

Vì vậy, chúng tôi có một proxy có xác thực ở quốc gia mong muốn, có thể truy cập được qua địa chỉ IP tĩnh màu trắng. Tất cả những gì còn lại là sử dụng nó và chuyển hướng lưu lượng truy cập từ Spotify đến đó. Nhưng có một sắc thái, như đã đề cập ở trên, mật khẩu đăng nhập cho proxy trong Spotify không hoạt động, vì vậy chúng tôi sẽ tìm cách khắc phục nó.

Để bắt đầu, chúng ta hãy nhớ về Ủy quyền. Những thứ tuyệt vời, nhưng nó có giá tương đương một con tàu vũ trụ ($40). Với số tiền này, chúng ta lại có thể mua phí bảo hiểm và hoàn thành nó. Do đó, chúng tôi sẽ tìm kiếm các tính năng tương tự miễn phí và cởi mở hơn trên Mac (vâng, chúng tôi muốn nghe nhạc trên Mac). Hãy cùng khám phá toàn bộ một công cụ: gần. Và chúng tôi sẽ vui vẻ đi chọc anh ấy.

Nhưng niềm vui sẽ ngắn ngủi vì hóa ra bạn cần bật chế độ gỡ lỗi và phần mở rộng kernel tùy chỉnh trong MacOS, gửi một cấu hình đơn giản và hiểu rằng công cụ này có cùng một vấn đề như Spotify: nó không thể vượt qua xác thực bằng cách sử dụng mật khẩu đăng nhập trên vớ-proxy.

Đâu đó quanh đây đã đến lúc bạn phải lo lắng và mua một sản phẩm cao cấp... nhưng không! Hãy thử yêu cầu sửa nó, nó là nguồn mở! Chúng ta hãy làm . Và để đáp lại, chúng ta nhận được một câu chuyện đau lòng về việc người bảo trì duy nhất không còn chiếc MacBook nữa và phải xử lý nó chứ không phải cách khắc phục.

Chúng ta sẽ lại buồn nữa. Nhưng rồi chúng ta sẽ nhớ về tuổi trẻ và C của mình, bật chế độ gỡ lỗi trong Dante, tìm hiểu hàng trăm kilobyte nhật ký, đi tới RFC1927 để biết thông tin về giao thức SOCKS5, hãy xem Xcode và tìm ra vấn đề. Chỉ cần sửa một ký tự trong danh sách mã phương thức mà khách hàng cung cấp để xác thực là đủ và mọi thứ bắt đầu hoạt động như kim đồng hồ. Chúng tôi vui mừng, chúng tôi thu thập bản phát hành nhị phân, chúng tôi làm yêu cầu kéo và chúng ta đi vào lúc hoàng hôn và đi đến điểm tiếp theo.

Tự động hóa nó

Một khi Proximac hoạt động, nó cần phải bị loại bỏ và lãng quên. Có một hệ thống khởi tạo toàn bộ phù hợp cho việc này, được tìm thấy trong MacOS, đó là khởi động.

Chúng tôi tìm thấy nó một cách nhanh chóng thủ công và chúng tôi hiểu rằng điều này hoàn toàn không phải systemd và ở đây nó gần như là một tin sốt dẻo và xml. Không có cấu hình ưa thích nào cho bạn, không có lệnh như status, restart, daemon-reload. Chỉ có loại khó tính start-stop, list-grep, unload-load và nhiều điều kỳ lạ khác. Vượt qua tất cả những điều này chúng tôi viết plist, đang tải. Không hoạt động. Chúng tôi nghiên cứu phương pháp gỡ lỗi con quỷ, gỡ lỗi nó, hiểu những gì ở đó ENV thậm chí PATH chúng tôi đã không giao cái bình thường, chúng tôi tranh luận, chúng tôi mang nó vào (thêm /sbin и /usr/local/bin) và cuối cùng chúng tôi hài lòng với khả năng tự khởi động và hoạt động ổn định.

Thở ra

Kết quả là gì? Một tuần phiêu lưu, một sở thú quỳ gối từ những dịch vụ thân thương và làm những gì được yêu cầu. Một chút kiến ​​thức về những lĩnh vực kỹ thuật còn mơ hồ, một chút về nguồn mở và nụ cười trên môi khi nghĩ “Tôi đã làm được!”

Tái bút: đây không phải là lời kêu gọi tẩy chay các nhà tư bản, tiết kiệm cho các trận đấu hay để hoàn toàn xảo quyệt, mà chỉ là một dấu hiệu cho thấy khả năng nghiên cứu và phát triển mà nói chung, bạn không mong đợi chúng.

Nguồn: www.habr.com

Thêm một lời nhận xét