IP Blocked Recovery
Diagnose
Run from your own machine (no SSH needed):
meridian test 198.51.100.10
If the TCP check on port 443 fails from your network but works from elsewhere (another network, a VPN, the ping tool), the IP is most likely blocked. A TCP failure everywhere usually means a cloud firewall or a server that is down.
Immediate relief
If you deployed with a domain (--domain) and the record is proxied through Cloudflare, the XHTTP and WSS paths still work — they reach Cloudflare, not your blocked IP. Apps using the Xray JSON or Mihomo subscription switch over on their own; others can pick the XHTTP or WSS entry by hand.
If you have a relay, clients connecting through it are unaffected as long as the relay itself can still reach the exit.
Recovery options
Add a replacement exit
The fastest path, as long as your control-plane server (the one running the panel) is still reachable from your machine:
# 1. Get a new VPS from your provider (new IP)
# 2. Add it to the fleet
meridian node add 198.51.100.20 --name replacement
Clients keep their accounts. They receive the new exit on their next subscription refresh — ask them to refresh in their app if it doesn’t happen on its own.
Or move the blocked exit to a new server
node replace moves an exit to a fresh server, keeping its ID, keys, protocol paths, and relays, then cleans up the old server:
meridian node replace exit-1 198.51.100.20
Clients pick up the new address on their next subscription refresh. The control-plane server itself can’t be moved this way yet.
Add a domain for CDN fallback
If you weren’t using a domain, add one to the new exit:
meridian node add 198.51.100.20 --domain vpn.example.com
See Domain mode for the Cloudflare steps.
Add a relay
A relay on a domestic server gives users an entry point that stays reachable when foreign IPs are blocked:
meridian relay add 203.0.113.10 --exit 198.51.100.20
Moving an existing relay to a different exit isn’t available yet; deploy a new relay against the new exit instead.
If the control-plane server is lost
node add and relay add need the panel. If the server that hosted it is gone and cannot be restored, there is no automatic migration yet: deploy a fresh server with meridian deploy, then recreate each client with meridian client add. Each person gets a new link.
Managing from more than one machine
Everything Meridian knows about a fleet lives in ~/.config/meridian/ on the machine you deploy from. To manage the fleet from a second machine, copy that whole directory over, and copy it again after each change you make elsewhere.
You can’t accidentally undo another machine’s work. The control server keeps a small record of the last change applied (/var/lib/meridian/fence.json). Before changing anything, Meridian compares your copy with that record, and meridian plan warns ahead of time if an apply would be refused:
- “Another machine changed this fleet”: your copy is out of date. Copy
~/.config/meridian/from the machine that applied last, then run the command again. - “Another apply is running”: someone is changing the fleet right now. Wait for them to finish. If that run crashed, its claim expires within 30 minutes; a crashed run on your own machine doesn’t block you at all.
- “This control server belongs to a different copy of the fleet”: this
~/.config/meridian/was never copied from the machine that manages the fleet.
Prepare before a block
- Add a relay on a domestic server:
meridian relay add RELAY_IP --exit EXIT_IP - Use a domain for CDN fallback: deploy with
--domain vpn.example.com - Both — clients then have three ways in: relay (domestic), CDN (Cloudflare), and direct
- Back up
~/.config/meridian/— it is what lets you manage the fleet from another machine
Keep the old server
Don’t tear down the blocked server right away — blocks are sometimes lifted after days or weeks. Check now and then:
meridian test 198.51.100.10
When you no longer need it, remove it with meridian node remove.