Update: Sorry guys, looks like I just needed to reboot the public server.
My goal is to forward port 8096 from my private server to my public server. That, is any traffic at public server's port 8096 should be tunneled to port 8096 of my private server and back.
I've set up a wireguard tunnel and ping is working from one device to the other. In this, 10.8.0.1 is the private server and 10.8.0.2 is the public server.
--- On the private server ---
[Interface]
Address = 10.8.0.1/24
PrivateKey = *****************************************
[Peer]
PublicKey = *****************************************
AllowedIPs = 10.8.0.2
Endpoint = <public-server-addr>:51820
PersistentKeepalive = 25
Now, I'm trying to test the connection using netcat. I'm listening from my private server using nc -l 8096 (I've made sure that the port is unblocked) and trying to connect from a third device using nc <public-server-addr> 8096 but it's not working.
I have no idea what's going on here. Some help from experienced people is very appreciated.
I suspect the mixing of firewalld and iptables might not be helping there.
Other than that, -j REDIRECT might be a bit easier than DNAT, because with DNAT you also need to deal with SNAT too otherwise stuff won't come back to the client properly.
Best way to troubleshoot this would be to tcpdump on both ends, and see if packets are coming in, and if they're also coming out.
You have to have a firewall rule on your public server to tell it to send any traffic on port 8096 to the IP of your private server. Currently, your public server isn't listening on that port, so the packets would just be dropped.
It looks correct, yes. Can you run iptables -L -t nat on the public host after bringing up the wireguard connection to see if it works?
Also, if you can do a netcat to that same port from a local computer to that public endpoint without the wireguard connection running, you can test that the port isn't being blocked anywhere else along the way.
It's been a long time since I did forwarding through wireguard so this might be outdated, missing info or actually doing unneeded stuff but I had this notes saved in some old iptables personal documentation from like 4 years ago that might shed you some light:
Allow first packet to start the connection
iptables -A FORWARD -i eth0 -o wg0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o wg0 -p tcp --syn --dport 443 -m conntrack --ctstate NEW -j ACCEPT