# Sentry Tunnel for Bedrock/Geyser/PocketMine/VoiceChat

{% hint style="danger" %}
For customers using the Pterodactyl panel, you may need to contact us during the setup process, as Pterodactyl reserves all private IP addresses, which can prevent the creation of the tunnel. Refer to this [debug section](https://docs.tcpshield.com/common-issues-and-debugging#id-2.-error-nexthop-has-invalid-gateway).
{% endhint %}

## 1. Ensure a working Geyser Instance

Before proceeding, make sure your Geyser instance is running. Follow the instructions in the [Geyser documentation](https://geysermc.org/wiki/geyser/setup/) to set up your server. In this example, we have a Bedrock server up and running on `108.61.149.182:19132` :

<figure><img src="https://530345640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWXTvAX8gueFZ5txjDV%2Fuploads%2FNeeJX8JBhB7ATuPtfY7h%2Fimage.png?alt=media&#x26;token=6f964c15-ec5a-49aa-abe0-bc0730bc1ca0" alt=""><figcaption><p>Bedrock server using Geyser-Standalone</p></figcaption></figure>

For TCPShield customers running PocketMine MP, please consult their [official guide](https://doc.pmmp.io/en/rtfd/installation.html).

## 2. Create your Sentry Tunnel

Once your Geyser instance is up and running, create a Sentry Tunnel and enter the correct IP address of your Geyser server in the “Endpoint” field. You can leave the “Port” field blank—your application will continue listening on its default port. Sentry Tunnel simply forwards traffic to the original port over the backend IP.

<figure><img src="https://530345640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWXTvAX8gueFZ5txjDV%2Fuploads%2Fxtu6iwMB2zUeIe9fgNVj%2Fimage.png?alt=media&#x26;token=6edfa284-e7eb-4052-9439-e5393cf303b8" alt=""><figcaption><p>Tunnel Creation</p></figcaption></figure>

## 3. Run the VXLAN Creation Script

<figure><img src="https://530345640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWXTvAX8gueFZ5txjDV%2Fuploads%2Fxt9o3C1oG2u1ph5P8Y6x%2Fimage.png?alt=media&#x26;token=7bafd9b1-3ec6-435e-916a-bc23e6dad6a5" alt=""><figcaption><p>Tunnel Overwiew page</p></figcaption></figure>

After creating the tunnel, navigate to the bottom of the Overview page, then copy and run your VXLAN creation script. If you encounter any errors, refer to the [troubleshooting section](https://docs.tcpshield.com/vxlan/common-issues-and-debugging). To verify that the tunnel was created successfully, run the following command:

```
ip -s link show vxlan_<id>
```

Example output:

```
root@admin:~# ip -s link show vxlan_47
418: vxlan_47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 12:cc:cb:ab:1f:e8 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped missed  mcast
    341644143  2036858  0       0       0      0
    TX: bytes  packets  errors  dropped carrier collsns
    53378176   387353   0       0       0      0
```

At this point you should also be able to ping the tunnel's local IP address:

```
root@admin:~# ping 172.18.128.2
PING 172.18.128.2 (172.18.128.2) 56(84) bytes of data.
64 bytes from 172.18.128.2: icmp_seq=1 ttl=64 time=51.6 ms
64 bytes from 172.18.128.2: icmp_seq=2 ttl=64 time=50.9 ms
64 bytes from 172.18.128.2: icmp_seq=3 ttl=64 time=50.0 ms
64 bytes from 172.18.128.2: icmp_seq=4 ttl=64 time=50.0 ms
```

## 4. Whitelist VXLAN and Backend Ports

Ensure both the VXLAN port and your backend port are properly whitelisted. You can achieve this using either UFW or iptables. <mark style="color:purple;">This step might not be necessary, but worth mentioning nonetheless</mark>.

### Using UFW

```
ufw allow <port>/udp
ufw allow <port>/tcp
```

Then verify the status by running:

```
ufw status
```

### Using iptables

```
iptables -A INPUT -p udp --dport <PORT> -j ACCEPT
iptables -A INPUT -p tcp --dport <PORT> -j ACCEPT
iptables -A OUTPUT -p tcp --sport <PORT> -j ACCEPT
iptables -A OUTPUT -p udp --sport <PORT> -j ACCEPT
```

Then verify your configuration by running:

```
iptables-save
```

{% hint style="warning" %} <mark style="color:purple;">IMPORTANT: For customers using Pterodactyl, ensure that you open the VXLAN port on the panel itself. This can be done by navigating to the</mark> <mark style="color:purple;"></mark><mark style="color:purple;">**Network**</mark> <mark style="color:purple;"></mark><mark style="color:purple;">tab and selecting</mark> <mark style="color:purple;"></mark><mark style="color:purple;">**Create Allocation**</mark><mark style="color:purple;">. For more information, visit this</mark> [<mark style="color:purple;">guide</mark>](https://knowledgebase.aquatis.host/books/pterodactyl-guides/page/how-do-i-addopen-a-server-port-on-pterodactyl)<mark style="color:purple;">.</mark>
{% endhint %}

## 5. Update the config file

### 5.1 Geyser&#x20;

Next, update the `address` (under the `Bedrock` section) in the Geyser configuration file to the public IP address of your VXLAN tunnel. For example, if your public IP is `104.234.6.128`, make the necessary changes to the config. The port of the server stays the same, aka `19132`.

<figure><img src="https://530345640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWXTvAX8gueFZ5txjDV%2Fuploads%2FEPcUzeO8euqyHnUoYCXR%2Fimage.png?alt=media&#x26;token=387341f2-7064-423e-a0a7-8d0e09ae2e96" alt=""><figcaption><p>Update Geyser's backend IP Address</p></figcaption></figure>

Also make sure `enable-proxy-connections: false` . On newer Geyser version, this setting is also called `haproxy-protocol`, but make sure you only edit the one located inside the `bedrock` section.

After restarting the server, double-check that the service is running properly by running the following command:

```
netstat -plunt | grep 104.234.6.128
```

The output should look similar to this:

```
root@admin:~# netstat -plunt | grep 104.234.6.128
udp     0   0 104.234.6.128:19132 0.0.0.0:*                        1546258/java
udp     0   0 104.234.6.128:19132 0.0.0.0:*                        1546258/java
```

### 5.2 PocketMine MP

By default PocketMine will always listen on `0.0.0.0` , hence you have to navigate to your `server.properties`  and update `server-ip` to the tunnel Public IP Address. If not available, simply add it in the file. Example config:

```
#Properties Config file
#Tue Jul 8 11:04:48 UTC 2025
language=eng
motd=TCPShield Test
server-port=19132
server-ip=104.234.6.128
server-portv6=19133
gamemode=SURVIVAL
...
```

Restart the server and you should see the MP server is listening on the correct interface:

```
root@admin:~# netstat -plunt | grep 104.234.6.128
udp        0      0 104.234.6.128:19132     0.0.0.0:*       1095804/PocketMine- 
```

## 6. Final Step

At this point, the connection to your Bedrock server will be using the public IP `104.234.6.128`. Create an A record that points directly to this IP address on your preferred DNS manager:

<figure><img src="https://530345640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWXTvAX8gueFZ5txjDV%2Fuploads%2FGrs7XtnTLnR0guiCYAOE%2Fimage.png?alt=media&#x26;token=e7791662-f894-41dd-94ce-3fafb8106ca8" alt=""><figcaption></figcaption></figure>

<figure><img src="https://530345640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWXTvAX8gueFZ5txjDV%2Fuploads%2FeDcjEUn6uYbrvLhEkIIA%2Fimage.png?alt=media&#x26;token=11a7e25d-fe13-495e-89bd-9411a832b004" alt=""><figcaption><p>The Geyser instance running on 104.234.6.128:19132</p></figcaption></figure>

<figure><img src="https://530345640-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWXTvAX8gueFZ5txjDV%2Fuploads%2FsxbLF5a8ecs15ogLYLTb%2Fimage.png?alt=media&#x26;token=b9af9b04-c0e8-4d35-a2be-5241d05ee4a6" alt=""><figcaption><p>Your PocketMine MP instance running on 104.234.6.128:19132</p></figcaption></figure>

And that's it, happy gaming!

## 7. Voice chat setup:

{% hint style="info" icon="square-exclamation" %} <mark style="color:$primary;background-color:blue;">**I**</mark><mark style="color:$primary;background-color:blue;">**MPORTANT**</mark><mark style="color:$primary;background-color:blue;">: Since VXLAN is fairly complicated for most users, if you just require voice chat support and nothing else, please contact our support staffs on Discord to have it deployed.</mark>
{% endhint %}

### 7.1 [Simple Voice Chat](https://modrinth.com/plugin/simple-voice-chat/versions)

There are 2 values to update:\
\- To make sure SVC's listening on the  correct IP address, `bind_address` should be using the tunnel `public IP` .

\- You would then specifiy the `voice_host` to `tunnel_IP:port` so the clients can connect to it.\
Example config file:

```
# Simple Voice Chat proxy config v2.6.4

# The port number to use for the voice chat communication.
# Audio packets are always transmitted via the UDP protocol on the port number
# specified here, independently of other networking used for the game server.
# Set this to '-1' to use the same port number as the one used by the proxy.
port=24454
# The proxy IP address to bind the voice chat to
# Leave blank to use the proxy bind address
# To bind to the wildcard IP address, use '*'
bind_address=104.234.6.128
# The hostname that clients should use to connect to the voice chat
# This may also include a port, e.g. 'example.com:24454' or just a port, e.g. '24454'
# Do NOT change this value if you don't know what you're doing
voice_host=104.234.6.128:24454
# If the voice chat proxy server should reply to external pings
allow_pings=true

```

### 7.2 [Plasmo Voice](https://plasmovoice.com/)

Shout out to a very detailed [documentation](https://plasmovoice.com/docs/server/advanced/) on their side.&#x20;

To setup PlasmoVoice with VLXAN tunnel, you need to:\
\- Change the IP and port of \[host] and \[host.public] to match your VXLAN's `public IP` and your specific `port` .\
\- Example config:

```
[host]  # The IP:PORT your voice chat instance is running on
ip = "104.234.6.128"
port = 25577

[host.public]
ip = "104.234.6.128" # The IP of the public voice chat server 
port = 25577         # The port of the public voice chat server 
```

<br>
