How to Build a 4G/5G Mobile Proxy Farm with Raspberry Pi

How to Build a 4G/5G Mobile Proxy Farm with Raspberry Pi

Building your own mobile proxy farm is one of the most rewarding (and frustrating) technical projects you can undertake. When it works, you have a self-owned infrastructure of mobile IP addresses that you control completely. When it breaks, you are debugging USB power issues, flaky modem firmware, and carrier-specific quirks at 3 AM.

This guide covers everything from the hardware shopping list to the software configuration, with honest assessments of what works, what does not, and when you should consider using a managed service like DataResearchTools instead.

Why Build Your Own Mobile Proxy Farm?

Advantages

  • Full control: You own the hardware, the IPs, and the data path. No third party can see your traffic.
  • Cost efficiency at scale: After the initial hardware investment, ongoing costs are primarily SIM card data plans.
  • Custom configuration: Rotation intervals, sticky sessions, geographic targeting, and authentication are all under your control.
  • Learning experience: Understanding how mobile proxies work at the hardware level makes you a better user of commercial services.

Disadvantages

  • Upfront cost: Hardware is not cheap, especially when you factor in dongles, SIM cards, powered USB hubs, and cooling.
  • Maintenance burden: Hardware failures, SIM deactivation, firmware updates, and carrier changes require ongoing attention.
  • Limited IP pool: A single SIM card gives you one carrier’s IP pool. Commercial services like DataResearchTools pool thousands of connections across multiple carriers.
  • Geographic limitation: Your proxies are tied to wherever your hardware is physically located.
  • Scalability ceiling: Beyond 50-100 modems, power management, heat, and USB reliability become serious engineering challenges.

Hardware Requirements

Core Components

ComponentRecommendedQuantity (10 Proxy Setup)Approximate Cost
Raspberry Pi 4B (4GB)Yes2-3 (each handles 4-5 modems)$35-55 each
Raspberry Pi 5 (8GB)Better performance2 (each handles 5-6 modems)$80 each
4G USB DongleHuawei E3372h or E327610$15-30 each
5G USB DongleQuectel RM520N-GL10$80-150 each
Powered USB Hub10-port, 60W minimum2-3$30-50 each
SIM CardsData-only plans preferred10Varies by carrier
MicroSD Cards32GB+ Class 102-3$8-12 each
Ethernet SwitchGigabit, 8+ ports1$20-30
Power SupplyReliable UPS recommended1$50-100
CoolingFan or heat sinksPer Pi$5-15

Choosing the Right 4G Dongle

Not all USB dongles work well for proxy purposes. The key requirements are:

  1. AT command support: The dongle must accept AT commands for IP rotation (airplane mode toggle).
  2. Linux compatibility: Must work with Raspberry Pi OS without proprietary drivers.
  3. CDC Ethernet mode: The dongle should present as a network interface, not a serial modem requiring PPP.
  4. Band compatibility: Must support the LTE bands used by your target carrier.

Recommended dongles for Southeast Asia:

Dongle ModelMode4G BandsLinux SupportPrice
Huawei E3372h-153HiLink (Ethernet)B1/3/5/7/8/20Excellent$15-25
Huawei E3372h-320HiLink (Ethernet)B1/3/7/8/20/28Good$20-30
ZTE MF833VRNDIS (Ethernet)B1/3/5/7/8/20/28Good$15-25
Quectel EC25QMI/MBIMB1/3/5/7/8/20/28/38/40/41Excellent$25-40

LTE Band Reference for Southeast Asia

CountryMajor CarriersPrimary LTE Bands
ThailandAIS, DTAC, TrueB1, B3, B7, B28
IndonesiaTelkomsel, XL, IndosatB1, B3, B5, B8, B40
PhilippinesGlobe, SmartB1, B3, B5, B7, B28, B40
MalaysiaMaxis, Celcom, DigiB1, B3, B7, B8, B28, B40
VietnamViettel, Mobifone, VinaphoneB1, B3, B7, B38, B40, B41
SingaporeSingtel, StarHub, M1B1, B3, B7, B8, B28

Software Setup

Step 1: Prepare the Raspberry Pi

# Flash Raspberry Pi OS Lite (64-bit) to the SD card
# Boot and run initial configuration

# Update system
sudo apt update && sudo apt upgrade -y

# Install essential packages
sudo apt install -y \
    usb-modeswitch \
    usb-modeswitch-data \
    network-manager \
    iptables \
    squid \
    dante-server \
    python3-pip \
    python3-flask \
    screen \
    htop \
    usbutils

Step 2: Configure USB Dongles

# Check connected dongles
lsusb

# You should see entries like:
# Bus 001 Device 003: ID 12d1:14db Huawei Technologies Co., Ltd. E353/E3131

# If the dongle shows as a storage device (CD-ROM mode),
# usb-modeswitch should handle the switch automatically.
# Check if it created a network interface:
ip addr show

# You should see interfaces like:
# eth1, eth2, etc. (for HiLink dongles)
# or wwan0, wwan1 (for QMI/MBIM dongles)

Step 3: Set Up Network Interfaces

For each dongle, create a network configuration:

# /etc/NetworkManager/system-connections/modem1.nmconnection
[connection]
id=modem1
type=gsm
interface-name=cdc-wdm0
autoconnect=true

[gsm]
apn=internet
number=*99#

[ipv4]
method=auto
route-metric=200

[ipv6]
method=auto

Step 4: Install Proxy Server Software

Option A: 3proxy (Lightweight, Recommended)

# Install 3proxy
cd /tmp
git clone https://github.com/3proxy/3proxy.git
cd 3proxy
make -f Makefile.Linux
sudo make -f Makefile.Linux install

Configure 3proxy for each modem:

# /etc/3proxy/3proxy.cfg
daemon
log /var/log/3proxy/3proxy.log

# Authentication
users admin:CL:your_password

# Proxy for modem 1 (eth1)
auth strong
allow admin
proxy -p10001 -i0.0.0.0 -e192.168.8.100
socks -p20001 -i0.0.0.0 -e192.168.8.100

# Proxy for modem 2 (eth2)
proxy -p10002 -i0.0.0.0 -e192.168.9.100
socks -p20002 -i0.0.0.0 -e192.168.9.100

Option B: Squid (Full-Featured)

# /etc/squid/squid.conf

# Access control
acl proxy_users proxy_auth REQUIRED
http_access allow proxy_users
http_access deny all

# Authentication
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm Proxy Server

# Modem 1 listener
http_port 10001
tcp_outgoing_address 192.168.8.100 port 10001

# Modem 2 listener
http_port 10002
tcp_outgoing_address 192.168.9.100 port 10002

Step 5: IP Rotation Script

The core feature of a mobile proxy is IP rotation. This is achieved by briefly disconnecting the modem from the cellular network, forcing the carrier to assign a new IP:

#!/usr/bin/env python3
"""
IP Rotation script for mobile proxy farm.
Rotates IP by toggling the modem's cellular connection.
"""

import subprocess
import time
import requests
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("ip_rotator")

class ModemRotator:
    def __init__(self, modem_config):
        self.config = modem_config

    def get_current_ip(self, interface):
        """Get the current external IP through this interface"""
        try:
            proxy = {"http": f"http://127.0.0.1:{self.config['proxy_port']}"}
            response = requests.get(
                "https://api.ipify.org?format=json",
                proxies=proxy,
                timeout=10
            )
            return response.json()["ip"]
        except Exception as e:
            logger.error(f"Failed to get IP: {e}")
            return None

    def rotate_hilink(self, modem_ip="192.168.8.1"):
        """Rotate IP on Huawei HiLink dongles via their web API"""
        import xml.etree.ElementTree as ET

        # Get session token
        token_response = requests.get(
            f"http://{modem_ip}/api/webserver/SesTokInfo"
        )
        root = ET.fromstring(token_response.text)
        session = root.find("SesInfo").text
        token = root.find("TokInfo").text

        headers = {
            "Cookie": session,
            "__RequestVerificationToken": token,
            "Content-Type": "application/xml"
        }

        # Toggle airplane mode ON
        data = '<?xml version="1.0" encoding="UTF-8"?><request><dataswitch>0</dataswitch></request>'
        requests.post(
            f"http://{modem_ip}/api/dialup/mobile-dataswitch",
            data=data,
            headers=headers
        )

        time.sleep(3)

        # Get new token (session may have changed)
        token_response = requests.get(
            f"http://{modem_ip}/api/webserver/SesTokInfo"
        )
        root = ET.fromstring(token_response.text)
        session = root.find("SesInfo").text
        token = root.find("TokInfo").text

        headers["Cookie"] = session
        headers["__RequestVerificationToken"] = token

        # Toggle airplane mode OFF
        data = '<?xml version="1.0" encoding="UTF-8"?><request><dataswitch>1</dataswitch></request>'
        requests.post(
            f"http://{modem_ip}/api/dialup/mobile-dataswitch",
            data=data,
            headers=headers
        )

        time.sleep(5)  # Wait for new IP assignment

    def rotate_at_command(self, device_path="/dev/ttyUSB0"):
        """Rotate IP using AT commands (for non-HiLink modems)"""
        import serial

        ser = serial.Serial(device_path, 115200, timeout=5)

        # Enable airplane mode
        ser.write(b"AT+CFUN=4\r\n")
        time.sleep(3)

        # Disable airplane mode
        ser.write(b"AT+CFUN=1\r\n")
        time.sleep(8)

        ser.close()

    def rotate_and_verify(self, method="hilink"):
        """Rotate IP and verify the change"""
        old_ip = self.get_current_ip(self.config["interface"])
        logger.info(f"Current IP: {old_ip}")

        if method == "hilink":
            self.rotate_hilink(self.config["modem_ip"])
        elif method == "at_command":
            self.rotate_at_command(self.config["device_path"])

        # Verify new IP
        new_ip = self.get_current_ip(self.config["interface"])
        logger.info(f"New IP: {new_ip}")

        if new_ip and new_ip != old_ip:
            logger.info("IP rotation successful")
            return True
        else:
            logger.warning("IP rotation may have failed")
            return False


# Configuration for a 10-modem setup
MODEM_CONFIGS = [
    {
        "id": "modem_1",
        "interface": "eth1",
        "modem_ip": "192.168.8.1",
        "proxy_port": 10001,
        "socks_port": 20001,
        "method": "hilink"
    },
    {
        "id": "modem_2",
        "interface": "eth2",
        "modem_ip": "192.168.9.1",
        "proxy_port": 10002,
        "socks_port": 20002,
        "method": "hilink"
    },
    # ... additional modems
]

Step 6: Management API

Build a simple API to control your proxy farm remotely:

from flask import Flask, jsonify, request
import threading

app = Flask(__name__)

# Initialize rotators for each modem
rotators = {}
for config in MODEM_CONFIGS:
    rotators[config["id"]] = ModemRotator(config)

@app.route("/api/proxies", methods=["GET"])
def list_proxies():
    """List all available proxies"""
    proxies = []
    for modem_id, rotator in rotators.items():
        ip = rotator.get_current_ip(rotator.config["interface"])
        proxies.append({
            "id": modem_id,
            "http_port": rotator.config["proxy_port"],
            "socks_port": rotator.config["socks_port"],
            "current_ip": ip,
            "interface": rotator.config["interface"]
        })
    return jsonify(proxies)

@app.route("/api/rotate/<modem_id>", methods=["POST"])
def rotate_ip(modem_id):
    """Rotate IP for a specific modem"""
    if modem_id not in rotators:
        return jsonify({"error": "Modem not found"}), 404

    rotator = rotators[modem_id]
    success = rotator.rotate_and_verify()

    return jsonify({
        "modem_id": modem_id,
        "success": success,
        "new_ip": rotator.get_current_ip(rotator.config["interface"])
    })

@app.route("/api/rotate/all", methods=["POST"])
def rotate_all():
    """Rotate IPs for all modems"""
    results = {}
    threads = []

    def rotate_modem(modem_id, rotator):
        success = rotator.rotate_and_verify()
        results[modem_id] = {
            "success": success,
            "new_ip": rotator.get_current_ip(rotator.config["interface"])
        }

    for modem_id, rotator in rotators.items():
        t = threading.Thread(target=rotate_modem, args=(modem_id, rotator))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

    return jsonify(results)

@app.route("/api/health", methods=["GET"])
def health_check():
    """Check health of all modems"""
    health = {}
    for modem_id, rotator in rotators.items():
        ip = rotator.get_current_ip(rotator.config["interface"])
        health[modem_id] = {
            "status": "online" if ip else "offline",
            "ip": ip
        }
    return jsonify(health)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

Scaling Your Proxy Farm

10-Modem Setup (Starter)

  • 2 Raspberry Pi 4B units
  • 2 powered USB hubs (7-port each)
  • 10 Huawei E3372h dongles
  • 10 SIM cards
  • Total hardware cost: approximately $400-600

25-Modem Setup (Medium)

  • 4-5 Raspberry Pi 4B units
  • 4 powered USB hubs (7-port each)
  • 25 dongles
  • 25 SIM cards
  • Consider a dedicated mini server rack
  • Total hardware cost: approximately $900-1,400

50+ Modem Setup (Large)

  • Switch to dedicated x86 servers (Intel NUC or similar)
  • Industrial USB hubs with individual port power management
  • Professional rack mounting
  • Dedicated cooling solution
  • UPS power backup
  • Total hardware cost: approximately $2,500-5,000+

Common Scaling Challenges

ChallengeCauseSolution
USB disconnectionsPower insufficientHigher wattage USB hubs, dedicated power per dongle
OverheatingDense modem packingActive cooling, spacing, air conditioning
IP reuseSmall carrier IP poolMultiple carriers, more SIM cards
Modem hangFirmware bugsScheduled daily reboots, watchdog scripts
Network conflictsMultiple subnetsCareful network configuration, VLAN management

When to DIY vs When to Use a Service

Build Your Own When:

  • You need complete traffic privacy (no third-party can inspect your data)
  • You require specific carrier IPs that commercial services do not offer
  • You have the technical skills and time for ongoing maintenance
  • Your proxy usage is consistent and predictable (not bursty)
  • You are in a geographic location where commercial proxy services are limited

Use DataResearchTools When:

  • You need proxies across multiple countries (DataResearchTools covers all major SEA markets)
  • You want instant scalability without hardware procurement delays
  • You need high uptime guarantees (99.9% SLA)
  • Your team lacks the hardware/networking expertise for farm management
  • You need access to thousands of IPs (far more than a small farm provides)
  • You want to avoid the capital expenditure of hardware
  • You need redundancy and failover that a single-location farm cannot provide

Hybrid Approach

Many professional users run a small DIY farm for their most sensitive operations (where complete traffic control matters) while using DataResearchTools mobile proxies for high-volume, multi-geography tasks. This gives the best of both worlds: privacy when you need it, and scale when you need it.

Troubleshooting Common Issues

Modem Not Detected

# Check USB devices
lsusb

# Check dmesg for errors
dmesg | tail -50

# Try resetting USB bus
sudo usbreset /dev/bus/usb/001/003

# If modem is in CD-ROM mode, force switch
sudo usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000a11062000000000000100000000000000'

IP Not Rotating

# Verify modem has network connection
ping -I eth1 8.8.8.8

# Check if AT commands reach the modem
echo -e "AT+CFUN?\r" > /dev/ttyUSB0
cat /dev/ttyUSB0

# Try manual network disconnect/reconnect
nmcli connection down modem1 && sleep 5 && nmcli connection up modem1

High Latency

  • Check signal strength: AT+CSQ command (values 10-31 are acceptable)
  • Try a different carrier with better coverage at your location
  • Position antennas near windows or use external antennas
  • Avoid USB 2.0 hubs; use USB 3.0 for better throughput

Security Considerations

Exposing Your Proxy Farm to the Internet

If your proxy farm is accessible from the internet:

  1. Always use authentication: Never run an open proxy
  2. Use a VPN or SSH tunnel: Instead of exposing proxy ports directly
  3. Firewall rules: Only allow connections from your known IP addresses
  4. Rate limit management API: Prevent brute-force attacks on your control panel
  5. Log everything: Monitor for unauthorized access attempts

SIM Card Security

  • Register SIM cards in compliance with local regulations
  • Store SIM PINs securely
  • Monitor for unusual charges or carrier messages indicating misuse
  • Keep spare SIM cards ready for quick replacement

Conclusion

Building a 4G/5G mobile proxy farm with Raspberry Pi is a technically satisfying project that gives you complete control over your proxy infrastructure. The key components are reliable USB dongles, properly configured Linux networking, proxy server software, and an IP rotation mechanism.

However, be realistic about the limitations. A DIY farm of 10-25 modems provides a fraction of the IP diversity and geographic coverage that a commercial service like DataResearchTools offers out of the box. The maintenance burden is real, and hardware failures will happen at inconvenient times.

For most use cases, the optimal strategy is to start with DataResearchTools mobile proxies for immediate coverage across Southeast Asian markets, and build a small DIY farm alongside it for specialized needs. This way you get the scale and reliability of a professional service while maintaining the control and privacy of self-owned infrastructure for your most sensitive operations.

Whether you build, buy, or combine both approaches, understanding how mobile proxy farms work at the hardware level makes you a more effective proxy user and helps you make better decisions about your infrastructure investments.


Related Reading

last updated: April 3, 2026

Scroll to Top
message me on telegram

Resources

Proxy Signals Podcast
Operator-level insights on mobile proxies and access infrastructure.

Multi-Account Proxies: Setup, Types, Tools & Mistakes (2026)