Время летит так быстро, что прошло две недели с момента публикации последней статьи из этой серии "Руководство по созданию агента 4G коммерческого уровня [Подготовка]" У меня нет времени писать статью, поэтому я воркую.
Затем в подготовительной части мы узнали об аппаратном и программном обеспечении, необходимом для сборки 4G-прокси, а также узнали о преимуществах и недостатках различных вариантов. Теперь мы можем приступить к собственно строительству, и я думаю, что все давно этого ждали.
Основная мысль
Из названия этой статьи мы видим, что на этот раз план строительства в основном использует Docker, Вам может быть интересно, какое отношение Docker имеет к созданию прокси 4G?
Ну, это большое дело. Давайте разберемся во всем. Давайте посмотрим на основной процесс создания 4G-агента:
-
Вызовите коммутируемое соединение сетевой карты, и после успешного коммутируемого соединения будет создана виртуальная сетевая карта. (В обычных условиях вы можете использовать эту виртуальную сетевую карту для доступа в Интернет)
-
В случае нескольких сетевых карт повторяйте первый шаг, чтобы получить несколько виртуальных сетевых карт.
-
Запустите прокси-сервер, чтобы он использовал виртуальный сетевой адаптер в качестве исходящего сетевого адаптера, а физический сетевой адаптер, обращающийся к интрасети, — в качестве входящего сетевого адаптера.
Однако есть проблема.Согласно моим предыдущим результатам тестирования, в настоящее время в среде Linux нет HTTP-прокси-сервера, который может указать исходящую сетевую карту и входящую сетевую карту соответственно.Ну...это очень хлопотно. , т.к. если бы мы не смогли этого сделать, возникли бы следующие проблемы:
- И исходящая, и входящая сеть находятся на виртуальной сетевой карте, и доступ к прокси-серверу должен осуществляться через общедоступную сеть.
- Сетевая запись — это физическая сетевая карта, но исходящая сеть заблокирована прокси-сервером на определенную, и использование нескольких сетевых карт невозможно.
Хм... так что вместо прокси-серверов HTTP, как насчет использования прокси-серверов Socks5, которые часто используются для каких-то дерьмовых вещей? Если вы можете указать сетевую карту, используйте такой инструмент, как Privoxy, чтобы преобразовать прокси-сервер Socks5 в прокси-сервер HTTP. (Версия известного программного обеспечения для поддержки стен для Windows представляет собой HTTP-прокси, подобный этому)
После некоторых попыток я обнаружил, что хотя в некоторых документах прокси-сервера Socks5 говорится, что сетевую карту можно указать, после следования инструкциям он, похоже, не может напрямую добиться желаемого эффекта (либо он все еще заблокирован на определенном один, или Не удается получить доступ к Интернету), так что есть еще некоторые проблемы. Возможно, для работы потребуется сотрудничество с настройками таблицы маршрутизации, но у меня нет глубокого понимания сетевой инженерии, и я не разбирался в этом несколько дней, поэтому мне нужно думать о других способах.
Вот тогда я и подумал о вещи — Docker, его можно использовать для решения этой проблемы!
Поскольку после создания контейнера Docker, независимо от количества внешних сетевых карт, сетевая карта внутри контейнера будет иметь только одну собственную виртуальную сетевую карту Docker (используемую для связи между контейнерами) и локальный петлевой интерфейс (не заботиться об этом), и мы. Когда набор номера выполняется в контейнере, новая сгенерированная виртуальная сетевая карта не повлияет на внешний мир или другие контейнеры. В этом случае прокси-серверу не нужно указывать сетевую карту, и он может начни и беги!
Итак, теперь весь процесс завершен, давайте перейдем к фактической ссылке операции, чтобы увидеть это!
Системные аспекты
Существует много вариантов системы для метода построения этой версии Docker.Поскольку в качестве образца устройства я использовал Raspberry Pi, я решил использовать Raspbian (эксклюзивная версия Debian для Raspberry Pi). Если вы используете другие устройства, просто выберите систему, которую вы обычно используете.
Итак, первый шаг после подготовки — это, конечно же, загрузить и установить Docker.Здесь я использую скрипт установки в один клик, официально предоставленный Docker, для его установки:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 出自官方文档:https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-convenience-script
Этот скрипт установки в один клик теоретически можно использовать во всех дистрибутивах Linux.В конце концов, он уже давно отсутствует.Если нет, воспользуйтесь поисковой системой, чтобы найти нужную информацию.
После установки Docker у вас есть два варианта:
- Войдите в режим опыта, чтобы понять конкретные детали операции.
- Не читайте этот абзац, перейдите к концу этой статьи и используйте колесо, которое я написал напрямую.
запустить контейнер
Для опыта давайте просто запустим такой контейнер Docker и выполним следующую команду:
sudo docker run -it --rm --privileged -p 3128:3128 ubuntu:18.04 bash
Смысл вышеуказанной команды в том, чтобы запустить контейнер с внутренней системой Ubuntu18.04 и войти в оболочку внутри контейнера для выполнения
bash
команда, если вы выйдете из bash, контейнер будет автоматически уничтожен; затем порт 3128 в контейнере отображается на внешний мир, и сопоставленный внешний порт также 3128; наконецprivileged
Этот параметр включает привилегированный режим, который используется для сопоставления устройства сетевой карты с контейнером.Если загрузка изображений идет медленно, вы можете выполнить поиск по запросу «ускоритель Docker» или напрямую поддержать стену.
Проверьте, в порядке ли сетевая карта
После входа в контейнер мы можем выполнитьls /dev/ttyUSB*
Проверьте, нормально ли распознается сетевая карта (вне контейнера она такая же, потому что включен привилегированный режим).Если это та же сетевая карта 4G, которую я купил, вы увидите 4, когда вставлена только одна сетевая карта. устройство.
Различные сетевые карты 4G и комбинации оборудования могут различаться, пожалуйста, ознакомьтесь с реальной ситуацией.
Если вы можете увидеть4✖4G网卡个数
Если оборудование ttyUSB не вызывает проблем, мы можем приступить к следующему шагу.
онлайн
Следующее, что нужно сделать, это набрать номер.Для набора номера вы можете использовать такой инструмент, как Wvdial, или вы можете использовать сценарий набора номера, предоставленный такой компанией, как Fanconn (прямой вызов PPPD), и эффект будет разные. Если продавец не предоставляет сценарий дозвона, используйте Wvdial, который может автоматически сгенерировать конфигурацию и использовать ее «из коробки».
Со своей стороны, так как технический персонал Fanconn напрямую предоставил скрипт дозвона, я буду использовать этот скрипт.В интернете Wvdial есть много подробных документов, поэтому я не буду упоминать его здесь, а друзья, которым это нужно, могут поискать сами.
Если вы используете этот скрипт дозвона от Fanconn (мне не нужно рассказывать, как его завести в контейнер?), то прямо вapt install ppp
После установки средства набора номера используйтеchmod +x quectel-pppd.sh
Добавьте разрешение на выполнение в сценарий коммутируемого доступа, затем./quectel-pppd.sh /dev/ttyUSB3
Вот и все.
используется при наборе номера
/dev/ttyUSB3
Это относится к четвертому коммуникационному порту сетевой карты 4G.Пояснение в документе: ttyUSB3→Для соединений PPP или связи AT-команд.Перевод используется для соединения PPP или связи AT-команд.
После набора вы можете увидеть статус, подобный следующему рисунку с такими инструментами, как ifconfig:
Видно, что, как упоминалось выше, теперь есть три сетевых карты, одна — собственная Docker, другая — локальный петлевой интерфейс (не обращайте на это внимания), а третья — виртуальная сетевая карта, сгенерированная dial-up. вверх.
Если он не используется в контейнере Docker, также будет wwan0 (или другое имя), который является корпусом сетевой карты 4G.
Проверьте, можно ли нормально подключиться к Интернету
Теперь, если вы используете curl--interface
Если параметр указывает виртуальную сетевую карту для выполнения запроса (например:curl --interface ppp0 https://ip.cn
), запрос уже может быть успешным, а IP также будет присвоен оператором, соответствующим используемой вами SIM-карте.
Поскольку образы Docker обычно чрезвычайно упрощены, образы Ubuntu не поставляются с такими пакетами, как net-tools, iputils-ping, vim, curl и т. д., которые необходимо устанавливать сами по себе. Поэтому, если вы обнаружите, что ifconfig, ping, curl, vim не работают, не паникуйте, это нормально, выполните
apt install 包名
команда для установки.
Если вы не можете сделать прямой запрос, возможно, проблема с разрешением DNS.Вы можете попробовать пропинговать общедоступный IP-адрес (например:ping 1.1.1.1
) и доменное имя (например:ping ip.cn
), Но если IP может пинговать доменное имя, будет сообщено, что разрешение DNS не удается, мы можем подтвердить, что задача настроек DNS.
Если задача настроек DNS возникает, когда отображается настройка DNS, она обычно записывается в конфигурации, и мы можем вручную настроить DNS вручную (вы хотите заставить указание DNS):
# 以下为阿里云的公共DNS
echo 'nameserver 223.5.5.5' >> /etc/resolv.conf
echo 'nameserver 223.6.6.6' >> /etc/resolv.conf
В контейнере Docker это
/etc/resolv.conf
Также в файле может быть два содержимого, которые требуются самому контейнеру, его рекомендуется не удалять/не перезаписывать, иначе контейнеры не смогут взаимодействовать друг с другом по имени контейнера.
Запустите прокси-сервер
Затем, после тестирования диалапа, мы действительно можем выйти в Интернет через сетевую карту 4G, мы можем запустить прокси-сервер, здесь я использую TinyProxy.
Тест показал, что Squid занимает больше ресурсов, что не способствует использованию нескольких сетевых карт и повлияет на верхний предел количества сетевых карт 4G.
Первыйapt install tinyproxy
волна, затемvim /etc/tinyproxy/tinyproxy.conf
Измените конфигурацию.
Конфигурация, которая будет изменена, в основном включает:
- Элемент конфигурации порта изменен на 3128, потому что порт, который мы сопоставили ранее, — 3128.
- Пункт конфигурации Listen изменен на 0.0.0.0, потому что нам нужно использовать этот прокси-сервер на других устройствах.
- Элемент «Разрешить конфигурацию» прокомментирован или изменен на 0,0.0.0/0. По умолчанию 127.0.0.1 сделает другие устройства недоступными.
После того, как он сохранил волну, вы можете сразу выполнитьtinyproxy
Началось...?
Подождите, осталось сделать еще одну операцию! То есть указать маршрут по умолчанию к виртуальной сетевой карте очень просто, выполните следующую команду:
route del -net 0.0.0.0 eth0
route add -net 0.0.0.0 ppp0
Смысл этих двух команд таков: сначала удалите интернет-маршрут по умолчанию, указывающий на сетевую карту eth0, а затем добавьте такой же маршрут, указывающий на сетевую карту ppp0.
Эффект после изменения маршрута по умолчанию заключается в том, что даже если вы не используете curl--interface
параметры, вы также можете напрямую использовать сетевую карту 4G для доступа в Интернет.
Если маршрут по умолчанию не изменен, сетевая карта 4G не будет использоваться без указания сетевой карты, поскольку маршрут по умолчанию указывает на виртуальную сетевую карту самого Docker, а эта сетевая карта указывает на исходную среду интрасети. То есть IP не изменится!
Так что теперь вы можете выполнитьtinyproxy
Запустите прокси-сервер.
Протестируйте прокси-сервер
Что ж, прокси-сервер должен был запуститься нормально, теперь мы можем попробовать подключиться к прокси-серверу в этом контейнере на другом устройстве и посмотреть, сможем ли мы использовать сетевую карту 4G для нормального серфинга в Интернете через нее.
Например, IP-адрес, назначенный моему Raspberry Pi, выглядит следующим образом:192.168.137.66
, то я могу протестировать с помощью команды curl или кода Python следующим образом:
ЗАГЛУШКА:
curl "https://ip.cn"
curl -x "192.168.137.66:3128" "https://ip.cn"
Питон:
import requests
resp = requests.get("https://ip.cn", proxies={"https": "http://192.168.137.66:3128"})
no_proxy_resp = requests.get("https://ip.cn")
print(resp.text)
print(no_proxy_resp.text)
Результаты теста должны совпадать с предыдущим тестом в контейнере.После использования прокси IP становится IP базовой станции назначенным оператором.
Изменить IP
Итак, основной вопрос заключается в том, как изменить IP?
По сути, так же, как и при использовании этих VPS с коммутируемым доступом для настройки прокси-сервера, нам нужно только повторно набрать номер, чтобы изменить IP, и напрямую убить процесс pppd, чтобы он отключил набор.После отключения выполнить скрипт набора номера снова для повторного набора.
Технические специалисты Fanconn также предоставляют скрипт для отключения циферблата, также в
chmod +x quectel-ppp-kill
Дав разрешение на запуск, выполнить./quectel-ppp-kill
Вот и все.
Но следует отметить, что после отключения набора сотовой сети IP все равно будет сохраняться в течение определенного периода времени (конкретное время не ясно, оно также может быть связано с подключенной базовой станцией), поэтому нам нужно заставить сетевую карту снова искать сеть.
Непопулярное маленькое знание: Эффект от включения и выключения авиарежима на мобильнике - опять искать в интернете.Обычно, если просто отключить "мобильные данные", эффект такой же, как и от отключения циферблата.
Как это сделать? Очень просто, всего две строки команд:
AT+CFUN=0
AT+CFUN=1
Но обратите внимание, это AT-команда, а не команда оболочки под Linux.AT-команда - это командный язык модема.Если нам нужно ее выполнить, нам нужно сделать это:
echo "AT+CFUN=0" > /dev/ttyUSB2
# 中间间隔1秒左右
echo "AT+CFUN=1" > /dev/ttyUSB2
используется здесь
/dev/ttyUSB2
Это относится к третьему коммуникационному порту сетевого адаптера 4G.Интерпретация в документе: TTYUSB2 → для командной связи, аналогичен четвертому коммуникационному порту, только он не может использоваться для соединений PPP, может использоваться только для связи AT-команд. .Четвертая причина неиспользования одного и того же коммуникационного порта заключается в том, что порт может быть занят, отдельная прямая самая безопасная зона, которая является оригинальной картой, обеспечивающей два канала связи AT-команд.
После повторного поиска сетевой карты в течение от нескольких секунд до десяти/десятков секунд вы не можете нормально набирать номер. Необходимо дождаться завершения ее инициализации перед успешным набором номера. Конкретное время ожидания зависит от уровня сигнала. Я тестировал. Это обычно занимает менее 5 секунд.
Так что, если вам не удается набрать номер после отключения, повторите попытку позже.
Суммировать
Итак, теперь процесс работы также пройден, и мы также узнали все внутренние детали.Последнее, что нужно сделать, это назначить контейнер для каждой сетевой карты, чтобы мы могли реализовать вышеописанное в начале статьи - «Использование виртуальной сетевой карты» в качестве исходящей сетевой карты и использование физической сетевой карты, которая осуществляет доступ к интрасети, в качестве входящей сетевой карты.
На практике это настроить часть указанной сетевой карты, а затем передать ее при запуске контейнера.Эта функция может быть легко реализована с помощью настроек переменных среды контейнера Docker.
Наконец, мы можем использовать эту идею для создания шаблона docker-compose.Основное содержание шаблона состоит в том, чтобы создать простой контейнерный кластер сетевой карты 4G, а второе — запустить Squid для агрегирования прокси-серверов, так что нам нужно только чтобы указать, когда мы его используем.Прокси-сервер может быть заменен случайным образом, что более удобно в работе.
Хорошо, вышеизложенное является идеей версии Docker пути и всего процесса строительства.Если вам лень видеть, вы можете использовать мои колеса напрямую, просто отправьте сообщение [агент версии 4G Docker] на всеобщее обозрение. число [ночная команда]
Оценка
И последнее, но не менее важное: позвольте мне дать обзор этого метода сборки.
Этот метод построения не идеален, потому что слишком много переменных, и многие места определенно не так стабильны, как нативная поддержка на уровне системы, и при длительном использовании могут возникать различные странные проблемы.
Тогда использование ресурсов Docker на самом деле довольно велико, и он будет тратить много памяти на контейнер запуска.Если это всего две или три сетевые карты, все будет хорошо.Если количество больше, устройства с небольшим объемом памяти например Raspberry Pi 2B вообще не сможет его нести.не живой.
Кроме того, потребление ресурсов самого прокси-сервера относительно велико.При высокочастотных вызовах нагрузка на небольшой процессор Raspberry Pi 2B все еще довольно велика. Даже если я разгоню его процессор, его все равно будет легко протестировать. одновременно, когда ЦП заполнен.
но! На данный момент у меня все еще есть два плана строительства на основе системы маршрутизатора, которые не были написаны! Так что... следите за новостями о других строительных решениях в будущем (косая улыбка).
Автор статьи: "Team NightTeam night" - Loco
Ночная команда была создана в 2019 году, и в нее входят Цуй Цинцай, Чжоу Цзыци, Чен Сянгань, Тан Ифэй, Фэн Вэй, Цай Цзинь, Дай Хуанцзинь, Чжан Ецин и Вэй Шидун.
Используемые языки программирования включают, помимо прочего, Python, Rust, C++, Go, а области охватывают поисковый робот, глубокое обучение, разработку услуг, хранилище объектов и т. д. Команда не добрая и не злая, они делают только то, что считают правильным, пожалуйста, будьте осторожны.