Streisand, v2Box, Happ and v2RayTun proxy setup (iOS)
Published: 26 August 2026 · 7 min read
TL;DR: All four free iOS clients accept the same Xray configuration. Paste one with a "protocol": "socks" outbound for gw.roamproxy.com:41080 and your dashboard user and pass as separate fields, import from the clipboard, select it, connect. Do not use the http outbound — it leaves non-HTTP traffic and DNS outside the proxy while an IP-check page still looks correct. If your network cannot reach the gateway directly, add "proxySettings": {"tag": "upstream"} to the Roam outbound. Verify on ip.sb and two or three real apps.
What you need before you start
Every app in this tutorial reads the same four values. Get them from your Roam dashboard and keep that tab open.
| Field | Value |
|---|---|
| Server | gw.roamproxy.com |
| Port | 41080 |
| Username | generated in the dashboard |
| Password | generated in the dashboard |
Read this first if your network is restricted. Roam is an exit-IP layer: it changes the address the destination site sees. It is not a tunnel out of a network that blocks outbound connections. If your iPhone cannot reach gw.roamproxy.com:41080 directly, a plain Roam entry fails in a way that looks like a broken product. On such a network you need the proxySettings chain from Step 5, which sends Roam through a node that already works for you.
Step 1 — Pick an app
Shadowrocket is the best-known iOS client, but it is paid and not listed in every App Store region. These four are free, built on Xray-core, and available in more storefronts; they all accept the same Xray configuration, so the rest of this guide applies to each:
| App | Notes |
|---|---|
| Streisand | Free, no account. Imports links, subscriptions and raw Xray JSON. |
| v2Box | Free with an optional paid tier. Manual entry forms plus config import. |
| Happ | Free. Popular in Russian-speaking regions; imports links and configs from the clipboard. |
| v2RayTun | Free. Same Xray base; clipboard and file import. |
If one of them is missing from your App Store, try the next — availability changes by region and over time. The configuration below is the same for all of them.
Step 2 — Write the Roam configuration
Some of these apps have a form for a SOCKS server; all of them import a raw Xray configuration from the clipboard, and that path avoids the differences between their forms. This is the complete, minimal outbound for Roam — replace the two credential values and keep everything else:
{
"outbounds": [
{
"tag": "roam",
"protocol": "socks",
"settings": {
"servers": [
{
"address": "gw.roamproxy.com",
"port": 41080,
"users": [ { "user": "username", "pass": "password" } ]
}
]
}
},
{ "tag": "direct", "protocol": "freedom" }
]
}
Three things worth knowing about this file:
"protocol": "socks"is the whole point. Xray also has anhttpoutbound, and Roam accepts both, but an HTTP outbound only carries HTTP and HTTPS — DNS and every other protocol leak out over your normal connection. The symptom is an IP-check page that shows the new address while other apps time out. Usesocks.- The credentials are separate JSON fields, so a password containing
@,#or:needs no escaping. Paste it as-is between the quotes. - The first outbound is the default, so
roamstays first. The app adds its own inbound and DNS sections around this.
If you prefer the app's own form instead, choose the SOCKS (or Socks5) type, enter the server, port, username and password, and leave TLS off — the gateway speaks plain SOCKS5 on port 41080.
Step 3 — Import it and connect
- Copy the whole JSON above (with your credentials filled in) on your phone.
- Open the app → + → Import from clipboard (Streisand and Happ) or Add config / Custom config (v2Box and v2RayTun). Give it a name such as
Roam. - Tap the new entry so it is the selected one. Adding an entry does not select it.
- Tap Connect. The first time, iOS asks permission to add a VPN configuration — tap Allow and confirm with Face ID or Touch ID.
The status turning to Connected means the local service started — it does not yet prove the Roam gateway accepted your credentials. Step 4 does that.
Step 4 — Verify (properly)
Open https://ip.sb in Safari and confirm a Roam exit IP in the region you expect. Most of these apps also have a latency test on the entry: a millisecond value means the gateway answered; a timeout means it did not.
Checking ip.sb alone is not enough. Open two or three apps you actually use. If ip.sb shows the new IP but other things stall, the config is wrong — almost always the http-vs-socks issue from Step 2, or a routing mode that bypasses part of your traffic — and you should go to connected but not working. While verifying, set the app's routing to Global if it offers the choice; switch back to rule-based routing afterwards.
Optional: verify the credentials from a computer
Testing outside the app tells you whether a problem is with your credentials or with the app. Note the form: -x takes the proxy address and -U passes the credentials separately.
curl -v -x socks5h://gw.roamproxy.com:41080 -U 'username:password' https://ip.sb
If curl returns a Roam IP but the phone does not, the credentials are fine and the problem is in the app. If curl fails too, re-copy the username and password from the dashboard.
Step 5 — Chaining behind an upstream hop
Skip this step if Step 4 already works. You need it when your network cannot reach the gateway directly. iOS runs one VPN at a time, so you cannot stack another VPN app under this one. Instead, tell Xray to send the Roam outbound through a second outbound you already have. The path becomes: your phone → your upstream node → Roam gateway → destination. The destination still sees the Roam exit IP.
Add the outbound of the node that already works for you to the same list (copy it from a config you already have), then add proxySettings to the Roam outbound:
"outbounds": [
{
"tag": "roam",
"protocol": "socks",
"settings": { "servers": [ { "address": "gw.roamproxy.com", "port": 41080,
"users": [ { "user": "username", "pass": "password" } ] } ] },
"proxySettings": { "tag": "upstream" }
},
{ "tag": "upstream", "protocol": "…your existing node…", "settings": { } },
{ "tag": "direct", "protocol": "freedom" }
]
Keep roam first. If the chain fails, test the hops separately: connect with the upstream entry alone and confirm you have working internet, then re-select the chained config. A chain that fails at hop one looks identical to one that fails at hop two. Shadowrocket exposes the same thing in its interface as Chain Proxy; Android clients are covered in the v2rayNG and NekoBox guides.
Everyday use
Once the setup is verified, use the app's per-app or rule-based routing to keep bulk traffic off the metered proxy. Residential traffic is billed per gigabyte, so video, iOS updates and App Store downloads should not go through Roam. Any app that already had an open connection when you connected keeps that connection until it reconnects — force-close it to be sure.
Plans and what a session costs
Rotating residential traffic is billed at $2/GB with no monthly minimum, so a phone used for testing costs cents rather than a subscription. If you need one address that stays the same across sessions — anything with a login that reacts badly to a changing IP — a static residential IP is $4/IP/month. New accounts receive 300MB of trial traffic on their first top-up (from $2), which is more than enough to complete this tutorial and confirm the exit IP behaves the way your target site expects.
FAQ
The app says Connected, but nothing loads.
Connected only means the local VPN started. Either a different entry is still selected — adding and selecting are separate actions — or the gateway is rejecting the credentials. Run the entry's latency test: a millisecond value means the gateway answered, so re-check socks-vs-http and the routing mode; a timeout means it did not, so re-copy the username and password from the dashboard, and if your network is restricted, go to Step 5.
Which of the four should I pick?
They accept the same configuration, so pick the one available in your App Store region and keep it updated. Streisand is the simplest if you only need to import a config; v2Box has the most complete manual forms; Happ and v2RayTun are the common choices in Russian-speaking regions. If you can buy Shadowrocket, its Chain Proxy setting is the easiest way to chain without editing JSON.
My dashboard shows traffic being used, but pages will not load.
Billed traffic means authentication succeeded and the gateway is carrying data — your credentials are fine. The failure is in what is being carried: the outbound type or DNS. Make sure the outbound is protocol socks, not http. If it is already socks and pages still fail, see connected but not working.
Can I chain Roam behind another VPN app instead of editing the config?
Not on iOS — only one VPN configuration is active at a time, and turning on a second app disconnects the first. The chain has to live inside one app's configuration, which is what proxySettings in Step 5 does.
Roam is the exit-IP layer for this setup: rotating residential at $2/GB, static residential at $4/IP/month, no monthly minimum. Create an account and get 300MB of trial traffic on your first top-up — enough to finish this tutorial and confirm the exit IP behaves the way your target site expects.