Когда очень хочется экспериментов и не хочется вкладываться финансово.
Исходные данные:

  • мобильный телефон с сим-картой;

  • домашний сервер;

  • интернет с выделенным IP.

Цель: сделать мобильный прокси.

Замысел применения в некоторых случаях преодолеть ограничения статического IP в домашнем интернете, который мне нужен для работы.

1. Подготовка сервера.

Этот раздел не представляет особенных сложностей, поэтому просто приведу конфиг для compose.yml для запуска FRP.

1.1. Настройка FRPS

Скрытый текст
[common]
bind_port = 7000

dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = strongpassword

# чтобы сервер мог принимать reverse-proxy от телефона
token = mysecret

1.2. Docker-compose.yml (для Swarm)

Скрытый текст
services:
  frps:
    image: ghcr.io/fatedier/frps:v0.68.1
    command: ["-c", "/etc/frp/frps.ini"]

    restart: always
    ports:
      - "7000:7000"      # основной порт FRP
      - "7500:7500"      # dashboard
      - "2001:2001"      # socks5-выход через phone-1
      - "2002:2002"      # socks5-выход через phone-2

    configs:
      - source: frps-conf
        target: /etc/frp/frps.ini

configs:
  frps-conf:
    name: frps-conf-${TIMESTAMP}
    file: ./prod.ini

1.3. Скрипт для запуска

Скрытый текст
#!/bin/bash
set -e

TIMESTAMP=$(date +%s)
export TIMESTAMP

cd frps

docker context use swarm
docker stack deploy --with-registry-auth --compose-file docker-compose.yml frps

docker context create - технология, которую предлагается освоить самостоятельно.

2. Подготовка телефона

Здесь сложнее: нам нужно собрать FRPC (Client) для валяющегося дома телефона на Android. Готовых сборок не нашёл.

2.1. Установка Termius.

С любого маркета - сложностей не возникает.

2.2. Сборка FRPC

Проблема: FRP актуальных версий несовместим с Android. Причина: современные версии FRP используют библиотеку anet, которая обращается к внутреннему полю net.zoneCache. В Android‑сборках Go это поле отсутствует, поэтому сборка падает.

Решение: использовать FRP 0.51.3 — последнюю совместимую версию.

pkg update
pkg install golang git
git clone --branch v0.51.3 https://github.com/fatedier/frp ~/frp
cd ~/frp

Создаём фиктивный dist для embed.go (FRP использует go:embed, который не допускает пустых директорий.)

mkdir -p web/frpc/dist 
echo “dummy” > web/frpc/dist/index.html

Собираем frpc под Android ARM64

GOOS=android GOARCH=arm64 CGO_ENABLED=0 go build -tags no_ui -o frpc-android ./cmd/frpc

Проверяем результат

./frpc-android -v

Если всё прошло успешно, вы увидите:

frpc version 0.51.3

2.3. Запуск FRPC

Готовим конфиг:

nano phone1.ini

содержимое файла:

[common]
server_addr = yourdomain
server_port = 7000
token       = super_secret

# SOCKS5 наружу
[socks]
type = tcp
remote_port = 2001

plugin = socks5
# plugin = http_prox

plugin_user = login
plugin_passwd = password

для ручного запуска:

./frpc-android -c phone1.ini

но нам это не нужно - гораздо интересней автозапуск.

2.4. Автозапуск и работа в фоне.

Прежде всего работа Termux при выключенном экране

termux-wake-lock

Автоматическое переподключение при обрыве

nano ~/frp/run_frpc.sh

Содержимое файла:

#!/data/data/com.termux/files/usr/bin/sh
cd $HOME/frp

while true
do
    echo "Starting FRPC..."
    ./frpc-android -c phone1.ini

    echo "FRPC stopped. Restarting in 1 second..."
    sleep 1
done

и конечно, не забываем поменять права:

chmod +x ~/frp/run_frpc.sh

Автозапуск FRPC при старте телефона (Termux:Boot)

mkdir -p ~/.termux/boot
nano ~/.termux/boot/frpc.sh

Вставить текст:

#!/data/data/com.termux/files/usr/bin/sh
termux-wake-lock
cd $HOME/frp
nohup ./run_frpc.sh >/dev/null 2>&1 &

и снова не забываем про права:

chmod +x ~/.termux/boot/frpc.sh

Перезапускаем телефон - все стартует автоматически.

3. Пользуемся

curl --socks5-user user:password --socks5 yourdomain:2001 https://ifconfig.me

Остается только следить за тем, чтобы телефон к wi-fi не подключился, а то смысл потеряется ...