Common issues and Debugging
This page provide the most common pitfalls users might have with VXLAN tunnel. This page is largely under construction as we are gathering more edge cases. Your feedback is much appreciated.
1. VXLAN Setup Check List
It is crucial to ensure that you can directly connect to the services or games you are hosting using their IPv4 address and port. For instance, in this setup documentation, the Ragnarok server was accessible via 108.61.149.182:6900. If your VXLAN tunnel is not functioning correctly, several potential causes may exist. Below are some best practices to follow to confirm that your service is properly set up and running.
1.1. Verifying tunnel creation
After running the setup script, you can run the following commands to check your tunnel configuration:
ip -s link show vxlan_<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
543784518 3037392 0 0 0 0
TX: bytes packets errors dropped carrier collsns
154324621 1408584 0 0 0 0 You should see 0 under the errors and dropped columns. Any other numbers would indicate packets being dropped (possibly from a firewall).
1.2. Interface traffic
To verify that your VXLAN tunnel has been properly established, you can ping the Private IP Address of your tunnel. You should see responses like the example below:
The local IP address here corresponds to the VXLAN interface running on our anycast server, so the latency you observe will vary depending on your backend’s location. For further debugging, run:
as it can confirm whether the virtual link is properly resolving IP-to-MAC, something ping won't be able to show:
In this example, the private interface IP resolves to a MAC address within the tunnel, which is 02:ab:cd:34:56:78
As for your tunnel's Public IP Address , the reply should looks something like this (with <1ms latency):
You can also check the output of:
If the tunnel was properly created, you will see your private IP address in the output.
1.3 Firewall Configuration
There are two potential scenarios:
Cloud Provider Firewall: Major cloud providers like Linode, AWS, and Azure have default security group or firewall settings that may block traffic before it even reaches your VPS. In this case, you can navigate to your provider's control panel and allow traffic from TCPShield to your backend ports.
Server Firewall: If you are using a server firewall such as
netfilter,iptables, orufw, you will need to open both the backend port and the VXLAN port to accept external connections, or, in rare cases, explicitly whitelist the VXLAN interfaces.
Using iptables to Accept Connections to Your Backend Port
Notes: To remove these rules, simply replace -A with -D to delete them.
Using UFW :
To delete these rules, use the following command:
sudo ufw delete allow /udp
sudo ufw delete allow /tcp
Whitelisting VXLAN Interface (Optional)
Although this step is typically not necessary, you can whitelist the VXLAN interface explicitly using iptables:
Using UFW:
2. Error: Nexthop has invalid gateway (Pterodactyl / Wings).
If you're running Pterodactyl (or other Docker-based services), you might encounter the error:
Nexthop has invalid gateway
This usually happens when the VXLAN tunnel attempts to bind to an IP address that is already reserved by Docker. For example, Pterodactyl’s default bridge network (pterodactyl0) may overlap with the subnet used by VXLAN (172.18.0.0/16), causing the tunnel setup to fail.
To debug:
Check the Local IP Address for VXLAN: It should resemble something like
172.18.132.2.Run
ip routeand you may see an entry like:
In this case, the 172.18.132.2 IP address might conflict with the Docker network configurations. For example, if the pterodactyl0 interface is using 172.18.0.1, this could block the gateway you are trying to use (172.18.132.2), as it lies within the Docker subnet.
✅ SOLUTION: Switch Pterodactyl to use host networking
To prevent Docker from reserving IPs that interfere with your VXLAN setup:
Edit Pterodactyl config Open
/etc/pterodactyl/config.ymland modify the Docker networking section:Restart the network stack and Wings daemon
This change puts all containers on the host network, removing the isolated Docker bridge and preventing subnet conflicts. Your VXLAN tunnel should now initialize without errors.
Forcing outbound traffic to use the right path
We need to check which block Pterodactyl is using to route outbound traffic:
Assuming this output:
You should add this iptables rule:
Which marks packets from the 172.20.0.0/16 network that belong to existing connections so that your routing rules know “this traffic belongs to TCPShield’s VXLAN, send it back through the tunnel.”
3. Tunnel deletion
In case you need to delete the tunnel and re-run the setup script, here is how:
You can also remove the iptables rules in the script, by replacing -A and -I with -D , example:
4. VXLAN tunnel stopped working on server reboot
Sometimes, after rebooting your VM or dedicated server, the VXLAN script may not re-run, causing the service to stop working. To fix this, you can set up a persistent service to automatically run the VXLAN script after each reboot.
Steps to Setup Persistent VXLAN Tunnel:
Edit the
rc.localfile:
Add the following lines to execute the VXLAN script at boot:
Save and exit the editor (
Ctrl+X, thenYto confirm).Make the script executable:
Now, the VXLAN script will run automatically after each reboot, ensuring that the tunnel is re-established.
5. Disable Reverse Path Filtering
By default, most Linux distributions have rp_filter (Reverse Path Filtering) enabled. This is a kernel security feature that drops packets if their source address does not match the expected interface route — a defense mechanism against IP spoofing.
However, in setups using VXLAN or asymmetric routing, this behavior can cause legitimate packets to be dropped if the kernel thinks they arrived from the "wrong" interface. During a tcpdump capture, you may see packets coming in, but no responses being sent by the kernel. For example:
As shown above, there is only ingress traffic from 14.231.20.10, but no outgoing traffic from our VXLAN interface 104.234.6.137. This means the system is silently dropping the replies.
To fix this, disable reverse path filtering for all interfaces and for your VXLAN interface specifically:
This disables strict source route validation, allowing the system to accept packets even if their return path differs — which is common in tunneling setups like VXLAN.
Once reverse path filtering is disabled, you should start seeing bi-directional traffic over your VXLAN tunnel. A successful exchange will show both incoming and outgoing packets during a tcpdump capture. Expected result:
Last updated
Was this helpful?

