Multicraft: Port Forwarding through a GRE Tunnel
For the past week I've been attempting to protect a server from DOS attacks by utilizing a GRE tunnel from a VPS to a dedicated machine without much success.
Visual:
User --> VPS --> Dedicated Server
I've followed several guides BUYVM and Minecraft DDOS Protection and modified it as needed.
What I've done so far:
On both machines the following kernel modules are loaded
ip_gre
ip_nat_pptp
ip_conntrack_pptp
Additionally ipv4 port forwarding is enabled on both machines.
Setting up GRE on the dedicated machine:
ip tunnel add veridian mode gre remote VPS_EXTERN_IP local DEDICATED_EXTERN_IP ttl 255
ip link set veridian up
ip addr add 10.10.10.1/24 dev veridian
This produces the interface:
veridian Link encap:UNSPEC HWaddr 3F-8D-F2-FA-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.10.10.1 P-t-P:10.10.10.1 Mask:255.255.255.0
inet6 addr: fe80::200:5efe:3f8d:f2fa/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MTU:1476 Metric:1
RX packets:4016 errors:0 dropped:0 overruns:0 frame:0
TX packets:3970 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:338404 (338.4 KB) TX bytes:359357 (359.3 KB)
Setting up GRE on the VPS
ip tunnel add gre1 mode gre remote DEDICATED_EXTERN_IP local VPS_EXTERN_IP ttl 255
ip link set gre1 up
ip addr add 10.10.10.2/24 dev gre1
This produces the interface:
gre1 Link encap:UNSPEC HWaddr 68-83-98-C8-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.10.10.2 P-t-P:10.10.10.2 Mask:255.255.255.0
inet6 addr: fe80::200:5efe:6883:98c8/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MTU:1476 Metric:1
RX packets:3743 errors:0 dropped:0 overruns:0 frame:0
TX packets:3811 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:314188 (314.1 KB) TX bytes:335587 (335.5 KB)
Adding the VPS interface IP to the Source Route Table on the Dedicated Server:
echo '100 VERIDIAN' >> /etc/iproute2/rt_tables
ip rule add from 10.10.10.0/24 table VERIDIAN
ip route add default via 10.10.10.2 table VERIDIAN
What Works
From here I can ping the Dedicated Server from the VPS successfully
ping 10.10.10.1
and vice versa
ping 10.10.10.2
Additionally when I setup the NAT entry on the VPS
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -j SNAT --to-source VPS_EXTERN_IP
I can successfully retrieve the external IP of the VPS from the Dedicated Server by running:
curl http://www.cpanel.net/showip.cgi --interface 10.10.10.1
What Doesn't Work - Port Forwarding
On the VPS I now run:
iptables -t nat -A PREROUTING -p tcp -d VPS_EXTERN_IP --dport 25565 -j DNAT --to-destination 10.10.10.1:25565
iptables -A FORWARD -p tcp -d 10.10.10.1 --dport 25565 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
I now attempt to connect to the gaming server through the VPS's external IP address without any success.
I've been fighting with this for over a week any help would be much appreciated.
Update
Everything above is correct.
A bit more debugging and I found that the wrapper daemon (Multicraft) for the game server blocks localhost connections when the external ip is set for the game instance.
The solution is to set the IP to 0.0.0.0 and the port forwarding works perfectly.
As I don't see it in your shown documentation, I'm going to assume you forgot to enable IP forwarding.
Run the following command to verify that this is indeed the case:
sysctl net.ipv4.ip_forward
If IP forwarding is indeed disabled you should see:
net.ipv4.ip_forward = 0
If this is your problem, run:
sysctl -w net.ipv4.ip_forward=1
Possibly your problem is with the ports not being open / firewalls blocking the ports.
You can easily test this from your VPS to your dedicated machine using nmap:
nmap -A 10.10.10.2/24 -p 25565
And from your client machine to your externally accessible machine in the same way, but replace 10.10.10.2
with your VPS external address.