Jump to content

Troubleshooting:Port Forwarding Troubleshooting: Difference between revisions

From jb-vpn.uk Wiki
Added troubleshooting guide: Port Forwarding Troubleshooting Guide (troubleshooting)
 
Major update - troubleshooting guide: Port Forwarding Troubleshooting Guide (108 sections) (troubleshooting)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
= Port Forwarding Troubleshooting Guide =
== Overview ==
== Overview ==


Line 6: Line 4:


'''Port Forwarding Configuration:'''
'''Port Forwarding Configuration:'''
'' '''External Access''': <code>ssh -p 22222 user@87.106.61.62</code>
* '''External Access''': <code>ssh -p 22222 user@87.106.61.62</code>
'' '''Internal Target''': <code>10.8.0.2:22</code> (Synology NAS via VPN)
 
'' '''Network Interface''': <code>ens6</code> (external interface)
* '''Internal Target''': <code>10.8.0.2:22</code> (Synology NAS via VPN)
'' '''VPN Interface''': <code>tun0</code> (OpenVPN tunnel)
 
'' '''Cloud Provider''': IONOS
* '''Network Interface''': <code>ens6</code> (external interface)
 
* '''VPN Interface''': <code>tun0</code> (OpenVPN tunnel)
 
* '''Cloud Provider''': IONOS


----
----
Line 22: Line 24:
IONOS uses a cloud firewall that must be configured through the IONOS Cloud Panel:
IONOS uses a cloud firewall that must be configured through the IONOS Cloud Panel:


= '''Log in to IONOS Cloud Panel:''' =
==== '''Log in to IONOS Cloud Panel:''' ====
   '' Navigate to: https://dcd.ionos.com/
   * Navigate to: https://dcd.ionos.com/
   '' Select your Data Center → Server & Cloud → Servers
 
   * Select your Data Center → Server & Cloud → Servers
 
== '''Configure Firewall Rules:''' ==
  * Select your VPS server
 
  * Go to '''Firewall''' section
 
  * Click '''Add Rule''' or edit existing rules
 
== '''Add Firewall Rule for Port 22222:''' ==
  * '''Name''': SSH Port Forward (or any descriptive name)


= '''Configure Firewall Rules:''' =
   * '''Protocol''': TCP
   '' Select your VPS server
  '' Go to '''Firewall''' section
  '' Click '''Add Rule''' or edit existing rules


= '''Add Firewall Rule for Port 22222:''' =
   * '''Port''': 22222
   '' '''Name''': SSH Port Forward (or any descriptive name)
  '' '''Protocol''': TCP
  '' '''Port''': 22222
  '' '''Source''': 0.0.0.0/0 (or restrict to specific IPs for security)
  '' '''Action''': Allow
  '' '''Priority''': Set appropriate priority (lower numbers = higher priority)


= '''Apply Changes:''' =
  * '''Source''': 0.0.0.0/0 (or restrict to specific IPs for security)
  '' Save the firewall rule
  '' Changes are applied immediately (no server restart required)


= '''Verify IONOS Firewall:''' =
  * '''Action''': Allow
   '' Ensure the firewall rule is active and enabled
 
   '' Check that no higher-priority DROP rules are blocking the port
  * '''Priority''': Set appropriate priority (lower numbers = higher priority)
   '' Verify the rule applies to the correct network interface
 
== '''Apply Changes:''' ==
  * Save the firewall rule
 
  * Changes are applied immediately (no server restart required)
 
== '''Verify IONOS Firewall:''' ==
   * Ensure the firewall rule is active and enabled
 
   * Check that no higher-priority DROP rules are blocking the port
 
   * Verify the rule applies to the correct network interface


=== IONOS-Specific Notes ===
=== IONOS-Specific Notes ===


'' '''Firewall Location''': IONOS firewall is managed at the cloud infrastructure level, not on the VPS
* '''Firewall Location''': IONOS firewall is managed at the cloud infrastructure level, not on the VPS
'' '''No Security Groups''': IONOS uses a direct firewall per server, not security groups
 
'' '''Rule Priority''': Lower priority numbers are evaluated first
* '''No Security Groups''': IONOS uses a direct firewall per server, not security groups
'' '''Immediate Effect''': Firewall changes take effect immediately without server restart
 
'' '''Multiple Rules''': You can have multiple rules; ensure no conflicting DROP rules have higher priority
* '''Rule Priority''': Lower priority numbers are evaluated first
 
* '''Immediate Effect''': Firewall changes take effect immediately without server restart
 
* '''Multiple Rules''': You can have multiple rules; ensure no conflicting DROP rules have higher priority


=== Testing IONOS Firewall ===
=== Testing IONOS Firewall ===
Line 60: Line 77:
If you suspect the IONOS firewall is blocking traffic:
If you suspect the IONOS firewall is blocking traffic:


= '''Check IONOS Cloud Panel:''' =
==== '''Check IONOS Cloud Panel:''' ====
   '' Verify the firewall rule exists and is enabled
   * Verify the firewall rule exists and is enabled
  '' Check rule priority (lower numbers = higher priority)
  '' Ensure no DROP rules are blocking the port


= '''Test from different locations:''' =
  * Check rule priority (lower numbers = higher priority)
 
  * Ensure no DROP rules are blocking the port
 
== '''Test from different locations:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
  # Test from external IP (not from the VPS itself)
=== Test from external IP (not from the VPS itself) ===
   ssh -v -p 22222 user@87.106.61.62
   ssh -v -p 22222 user@87.106.61.62
</pre>
</pre>


= '''Check if packets reach the VPS:''' =
== '''Check if packets reach the VPS:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
  # On the VPS, check if packets are hitting iptables rules
=== On the VPS, check if packets are hitting iptables rules ===
   iptables -t nat -L PREROUTING -n -v | grep 22222
   iptables -t nat -L PREROUTING -n -v | grep 22222
  # If packet count doesn't increase, packets are blocked before reaching VPS
=== If packet count doesn't increase, packets are blocked before reaching VPS ===
</pre>
</pre>


Line 85: Line 104:


<pre class="lang-bash">
<pre class="lang-bash">
= 1. Check if VPN is running =
=== 1. Check if VPN is running ===
systemctl status openvpn-server@server.service
systemctl status openvpn-server@server.service


= 2. Verify VPN tunnel is up =
== 2. Verify VPN tunnel is up ==
ip addr show tun0
ip addr show tun0


= 3. Check if Synology is connected to VPN =
== 3. Check if Synology is connected to VPN ==
ping -c 2 10.8.0.2
ping -c 2 10.8.0.2
cat /etc/openvpn/server/ipp.txt | grep "10.8.0.2"
cat /etc/openvpn/server/ipp.txt | grep "10.8.0.2"


= 4. Verify iptables rules are active =
== 4. Verify iptables rules are active ==
iptables -t nat -L PREROUTING -n -v | grep 22222
iptables -t nat -L PREROUTING -n -v | grep 22222
iptables -t filter -L FORWARD -n -v | grep "10.8.0.2"
iptables -t filter -L FORWARD -n -v | grep "10.8.0.2"


= 5. Check IP forwarding is enabled =
== 5. Check IP forwarding is enabled ==
cat /proc/sys/net/ipv4/ip_forward  # Should output: 1
cat /proc/sys/net/ipv4/ip_forward  # Should output: 1


= 6. Verify SSH is NOT listening on port 22222 (should only be on 22) =
== 6. Verify SSH is NOT listening on port 22222 (should only be on 22) ==
ss -tlnp | grep 22222  # Should return nothing
ss -tlnp | grep 22222  # Should return nothing
</pre>
</pre>
Line 116: Line 135:
iptables -t nat -A PREROUTING -i ens6 -p tcp --dport 22222 -j DNAT --to-destination 10.8.0.2:22
iptables -t nat -A PREROUTING -i ens6 -p tcp --dport 22222 -j DNAT --to-destination 10.8.0.2:22
</pre>
</pre>
'' '''Purpose''': Redirects incoming traffic on port 22222 to the Synology NAS
* '''Purpose''': Redirects incoming traffic on port 22222 to the Synology NAS
'' '''Interface''': <code>ens6</code> (external/public interface)
 
'' '''Direction''': Incoming → Forwarded
* '''Interface''': <code>ens6</code> (external/public interface)
 
* '''Direction''': Incoming → Forwarded


'''MASQUERADE Rule (POSTROUTING):'''
'''MASQUERADE Rule (POSTROUTING):'''
Line 124: Line 145:
iptables -t nat -A POSTROUTING -d 10.8.0.2/32 -o tun0 -p tcp --dport 22 -j MASQUERADE
iptables -t nat -A POSTROUTING -d 10.8.0.2/32 -o tun0 -p tcp --dport 22 -j MASQUERADE
</pre>
</pre>
'' '''Purpose''': Handles source NAT for forwarded traffic so return packets route correctly
* '''Purpose''': Handles source NAT for forwarded traffic so return packets route correctly
'' '''Interface''': <code>tun0</code> (VPN tunnel)
 
'' '''Direction''': Outgoing forwarded traffic
* '''Interface''': <code>tun0</code> (VPN tunnel)
 
* '''Direction''': Outgoing forwarded traffic


=== 2. iptables Filter Rules (Firewall) ===
=== 2. iptables Filter Rules (Firewall) ===
Line 134: Line 157:
iptables -t filter -A FORWARD -d 10.8.0.2/32 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A FORWARD -d 10.8.0.2/32 -p tcp --dport 22 -j ACCEPT
</pre>
</pre>
'' '''Purpose''': Allows forwarding packets to the Synology SSH port
* '''Purpose''': Allows forwarding packets to the Synology SSH port
'' '''Direction''': Forwarded traffic
 
* '''Direction''': Forwarded traffic


=== 3. Persistence Configuration ===
=== 3. Persistence Configuration ===


'''Files:'''
'''Files:'''
'' <code>/etc/iptables/rules.v4</code> - Saved iptables rules
* <code>/etc/iptables/rules.v4</code> - Saved iptables rules
'' <code>/etc/openvpn/server/server.conf</code> - OpenVPN configuration
 
'' <code>/etc/openvpn/iptables-restore.sh</code> - Script that restores rules when VPN starts
* <code>/etc/openvpn/server/server.conf</code> - OpenVPN configuration
'' <code>/etc/sysctl.conf</code> - Contains <code>net.ipv4.ip_forward=1</code>
 
* <code>/etc/openvpn/iptables-restore.sh</code> - Script that restores rules when VPN starts
 
* <code>/etc/sysctl.conf</code> - Contains <code>net.ipv4.ip_forward=1</code>


'''Services:'''
'''Services:'''
'' <code>netfilter-persistent</code> - Loads iptables rules on boot
* <code>netfilter-persistent</code> - Loads iptables rules on boot
'' <code>openvpn-server@server.service</code> - OpenVPN server service
 
* <code>openvpn-server@server.service</code> - OpenVPN server service


----
----
Line 156: Line 184:


'''Symptoms:'''
'''Symptoms:'''
'' <code>ssh -p 22222 user@87.106.61.62</code> times out
* <code>ssh -p 22222 user@87.106.61.62</code> times out
'' No response from the server
 
* No response from the server


'''Diagnostic Steps:'''
'''Diagnostic Steps:'''


= '''Check if packets are reaching the VPS:''' =
==== '''Check if packets are reaching the VPS:''' ====
   <pre class="lang-bash">
   <pre class="lang-bash">
  # Watch kernel logs for DNAT rule hits
=== Watch kernel logs for DNAT rule hits ===
  # Note: On systems using journald, kern.log may not exist. Use dmesg instead.
=== Note: On systems using journald, kern.log may not exist. Use dmesg instead. ===
   tail -f /var/log/kern.log | grep "DNAT-22222" 2>/dev/null || \
   tail -f /var/log/kern.log | grep "DNAT-22222" 2>/dev/null || \
   dmesg -w | grep "DNAT-22222"
   dmesg -w | grep "DNAT-22222"
    
    
  # Or check recent logs
=== Or check recent logs ===
   dmesg | tail -30 | grep "DNAT-22222"
   dmesg | tail -30 | grep "DNAT-22222"
</pre>
</pre>


= '''Check IONOS cloud firewall:''' =
== '''Check IONOS cloud firewall:''' ==
   '' '''IONOS Cloud Panel''': Log in to https://dcd.ionos.com/
   * '''IONOS Cloud Panel''': Log in to https://dcd.ionos.com/
   '' Navigate to: Server & Cloud → Servers → [Your VPS] → Firewall
 
   '' Verify TCP port 22222 has an '''ALLOW''' rule configured
   * Navigate to: Server & Cloud → Servers → [Your VPS] → Firewall
   '' Check rule priority (lower numbers = higher priority)
 
   '' Ensure no DROP rules with higher priority are blocking the port
   * Verify TCP port 22222 has an '''ALLOW''' rule configured
   '' '''This is the most common cause of timeouts on IONOS'''
 
  '' See "IONOS Cloud Provider Configuration" section above for detailed steps
   * Check rule priority (lower numbers = higher priority)
 
   * Ensure no DROP rules with higher priority are blocking the port
 
   * '''This is the most common cause of timeouts on IONOS'''


= '''Verify VPN is running:''' =
  * See "IONOS Cloud Provider Configuration" section above for detailed steps
 
== '''Verify VPN is running:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   systemctl status openvpn-server@server.service
   systemctl status openvpn-server@server.service
Line 187: Line 222:
</pre>
</pre>


= '''Check if Synology is connected:''' =
== '''Check if Synology is connected:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   ping -c 2 10.8.0.2
   ping -c 2 10.8.0.2
Line 194: Line 229:


'''Solution:'''
'''Solution:'''
'' If no logs appear: '''Check IONOS firewall in Cloud Panel''' (most common issue)
* If no logs appear: '''Check IONOS firewall in Cloud Panel''' (most common issue)
   '' Verify port 22222 is allowed in IONOS firewall rules
 
   '' Check rule priority and ensure no blocking rules override it
   * Verify port 22222 is allowed in IONOS firewall rules
'' If logs appear but connection fails: Check Synology VPN connection
 
'' If Synology is not in ipp.txt: Reconnect Synology to VPN
   * Check rule priority and ensure no blocking rules override it
 
* If logs appear but connection fails: Check Synology VPN connection
 
* If Synology is not in ipp.txt: Reconnect Synology to VPN


----
----
Line 205: Line 244:


'''Symptoms:'''
'''Symptoms:'''
'' Port forwarding works initially
* Port forwarding works initially
'' After reboot, connections time out
 
* After reboot, connections time out


'''Diagnostic Steps:'''
'''Diagnostic Steps:'''


= '''Check if iptables rules are loaded:''' =
==== '''Check if iptables rules are loaded:''' ====
   <pre class="lang-bash">
   <pre class="lang-bash">
   iptables -t nat -L PREROUTING -n -v | grep 22222
   iptables -t nat -L PREROUTING -n -v | grep 22222
</pre>
</pre>
   '' If rule is missing, rules weren't loaded
   * If rule is missing, rules weren't loaded


= '''Verify persistence services are enabled:''' =
== '''Verify persistence services are enabled:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   systemctl is-enabled netfilter-persistent
   systemctl is-enabled netfilter-persistent
Line 222: Line 262:
</pre>
</pre>


= '''Check OpenVPN configuration:''' =
== '''Check OpenVPN configuration:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   grep "script-security\|up" /etc/openvpn/server/server.conf
   grep "script-security\|up" /etc/openvpn/server/server.conf
</pre>
</pre>
   '' Should show: <code>script-security 2</code> and <code>up /etc/openvpn/iptables-restore.sh</code>
   * Should show: <code>script-security 2</code> and <code>up /etc/openvpn/iptables-restore.sh</code>


= '''Verify iptables-restore script exists:''' =
== '''Verify iptables-restore script exists:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   ls -la /etc/openvpn/iptables-restore.sh
   ls -la /etc/openvpn/iptables-restore.sh
Line 236: Line 276:
'''Solution:'''
'''Solution:'''
<pre class="lang-bash">
<pre class="lang-bash">
= Manually restore rules =
== Manually restore rules ==
iptables-restore < /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4


= Verify rules are saved correctly =
== Verify rules are saved correctly ==
iptables-save > /etc/iptables/rules.v4
iptables-save > /etc/iptables/rules.v4


= Ensure services are enabled =
== Ensure services are enabled ==
systemctl enable netfilter-persistent
systemctl enable netfilter-persistent
systemctl enable openvpn-server@server.service
systemctl enable openvpn-server@server.service
Line 252: Line 292:


'''Symptoms:'''
'''Symptoms:'''
'' Rules exist but forwarding doesn't work
* Rules exist but forwarding doesn't work
'' Interface name mismatch
 
* Interface name mismatch


'''Diagnostic Steps:'''
'''Diagnostic Steps:'''


= '''Identify the correct external interface:''' =
==== '''Identify the correct external interface:''' ====
   <pre class="lang-bash">
   <pre class="lang-bash">
   ip route | grep default
   ip route | grep default
  # Output: default via 87.106.61.1 dev ens6 ...
=== Output: default via 87.106.61.1 dev ens6 ... ===
</pre>
</pre>


= '''Check iptables rule interface:''' =
== '''Check iptables rule interface:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   iptables -t nat -L PREROUTING -n -v | grep 22222
   iptables -t nat -L PREROUTING -n -v | grep 22222
  # Should show: -i ens6 (or your actual interface)
=== Should show: -i ens6 (or your actual interface) ===
</pre>
</pre>


= '''Check saved rules file:''' =
== '''Check saved rules file:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   grep "22222" /etc/iptables/rules.v4
   grep "22222" /etc/iptables/rules.v4
Line 276: Line 317:
'''Solution:'''
'''Solution:'''
<pre class="lang-bash">
<pre class="lang-bash">
= Fix the interface in the rules file =
== Fix the interface in the rules file ==
sed -i 's/-i eth0/-i ens6/g' /etc/iptables/rules.v4
sed -i 's/-i eth0/-i ens6/g' /etc/iptables/rules.v4


= Or manually edit /etc/iptables/rules.v4 =
== Or manually edit /etc/iptables/rules.v4 ==
= Change: -A PREROUTING -i eth0 ... =
== Change: -A PREROUTING -i eth0 ... ==
= To:    -A PREROUTING -i ens6 ... =
== To:    -A PREROUTING -i ens6 ... ==


= Reload rules =
== Reload rules ==
iptables-restore < /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
</pre>
</pre>
Line 292: Line 333:


'''Symptoms:'''
'''Symptoms:'''
'' Port 22222 is being used by SSH
* Port 22222 is being used by SSH
'' Connection connects but to wrong server
 
* Connection connects but to wrong server


'''Diagnostic Steps:'''
'''Diagnostic Steps:'''


= '''Check what's listening on port 22222:''' =
==== '''Check what's listening on port 22222:''' ====
   <pre class="lang-bash">
   <pre class="lang-bash">
   ss -tlnp | grep 22222
   ss -tlnp | grep 22222
</pre>
</pre>


= '''Check SSH configuration:''' =
== '''Check SSH configuration:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   grep "^Port" /etc/ssh/sshd_config
   grep "^Port" /etc/ssh/sshd_config
Line 309: Line 351:
'''Solution:'''
'''Solution:'''
<pre class="lang-bash">
<pre class="lang-bash">
= Remove port 22222 from SSH config =
== Remove port 22222 from SSH config ==
sed -i '/^Port 22222$/d' /etc/ssh/sshd_config
sed -i '/^Port 22222$/d' /etc/ssh/sshd_config


= Restart SSH =
== Restart SSH ==
systemctl restart sshd
systemctl restart sshd


= Verify port 22222 is free =
== Verify port 22222 is free ==
ss -tlnp | grep 22222  # Should return nothing
ss -tlnp | grep 22222  # Should return nothing
</pre>
</pre>
Line 324: Line 366:


'''Symptoms:'''
'''Symptoms:'''
'' OpenVPN service fails to start
* OpenVPN service fails to start
'' Error messages about script-security
 
* Error messages about script-security


'''Diagnostic Steps:'''
'''Diagnostic Steps:'''


= '''Check OpenVPN status:''' =
==== '''Check OpenVPN status:''' ====
   <pre class="lang-bash">
   <pre class="lang-bash">
   systemctl status openvpn-server@server.service
   systemctl status openvpn-server@server.service
Line 335: Line 378:
</pre>
</pre>


= '''Common error:''' =
== '''Common error:''' ==
   <pre>
   <pre>
   WARNING: External program may not be called unless '--script-security 2' or higher is enabled
   WARNING: External program may not be called unless '--script-security 2' or higher is enabled
Line 342: Line 385:
'''Solution:'''
'''Solution:'''
<pre class="lang-bash">
<pre class="lang-bash">
= Add script-security to OpenVPN config =
== Add script-security to OpenVPN config ==
echo "script-security 2" >> /etc/openvpn/server/server.conf
echo "script-security 2" >> /etc/openvpn/server/server.conf


= Restart OpenVPN =
== Restart OpenVPN ==
systemctl restart openvpn-server@server.service
systemctl restart openvpn-server@server.service
</pre>
</pre>
Line 354: Line 397:


'''Symptoms:'''
'''Symptoms:'''
'' Rules exist but forwarding doesn't work
* Rules exist but forwarding doesn't work
'' Can't reach Synology even though VPN is up
 
* Can't reach Synology even though VPN is up


'''Diagnostic Steps:'''
'''Diagnostic Steps:'''


= '''Check if forwarding is enabled:''' =
==== '''Check if forwarding is enabled:''' ====
   <pre class="lang-bash">
   <pre class="lang-bash">
   cat /proc/sys/net/ipv4/ip_forward
   cat /proc/sys/net/ipv4/ip_forward
  # Should output: 1
=== Should output: 1 ===
</pre>
</pre>


= '''Check if it's in sysctl.conf:''' =
== '''Check if it's in sysctl.conf:''' ==
   <pre class="lang-bash">
   <pre class="lang-bash">
   grep "ip_forward" /etc/sysctl.conf
   grep "ip_forward" /etc/sysctl.conf
Line 372: Line 416:
'''Solution:'''
'''Solution:'''
<pre class="lang-bash">
<pre class="lang-bash">
= Enable forwarding =
== Enable forwarding ==
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward


= Make it persistent =
== Make it persistent ==
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
sysctl -p
Line 408: Line 452:


<pre class="lang-bash">
<pre class="lang-bash">
= Watch for incoming connections =
==== Watch for incoming connections ====
= Note: On systems using journald, kern.log may not exist. Use dmesg instead. =
== Note: On systems using journald, kern.log may not exist. Use dmesg instead. ==
tail -f /var/log/kern.log | grep -E "DNAT-22222|FWD-to-Synology" 2>/dev/null || \
tail -f /var/log/kern.log | grep -E "DNAT-22222|FWD-to-Synology" 2>/dev/null || \
dmesg -w | grep -E "DNAT-22222|FWD-to-Synology"
dmesg -w | grep -E "DNAT-22222|FWD-to-Synology"


= Or use tcpdump =
== Or use tcpdump ==
tcpdump -i ens6 -n tcp port 22222
tcpdump -i ens6 -n tcp port 22222


= Monitor iptables counters =
== Monitor iptables counters ==
watch -n 1 'iptables -t nat -L PREROUTING -n -v | grep 22222'
watch -n 1 'iptables -t nat -L PREROUTING -n -v | grep 22222'
</pre>
</pre>
Line 423: Line 467:


<pre class="lang-bash">
<pre class="lang-bash">
= Test direct connection to Synology =
==== Test direct connection to Synology ====
ssh -o ConnectTimeout=5 -p 22 user@10.8.0.2 "echo 'Direct connection works'"
ssh -o ConnectTimeout=5 -p 22 user@10.8.0.2 "echo 'Direct connection works'"


= Test if port forwarding rule is active (from external IP) =
== Test if port forwarding rule is active (from external IP) ==
timeout 5 nc -zv 87.106.61.62 22222
timeout 5 nc -zv 87.106.61.62 22222
</pre>
</pre>
Line 437: Line 481:


<pre class="lang-bash">
<pre class="lang-bash">
= 1. Restore iptables rules =
=== 1. Restore iptables rules ===
iptables-restore < /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4


= 2. Verify rules are loaded =
== 2. Verify rules are loaded ==
iptables -t nat -L PREROUTING -n -v | grep 22222
iptables -t nat -L PREROUTING -n -v | grep 22222


= 3. Restart OpenVPN (will also restore rules via up script) =
== 3. Restart OpenVPN (will also restore rules via up script) ==
systemctl restart openvpn-server@server.service
systemctl restart openvpn-server@server.service


= 4. Verify VPN is up =
== 4. Verify VPN is up ==
ip addr show tun0
ip addr show tun0


= 5. Check Synology connection =
== 5. Check Synology connection ==
ping -c 2 10.8.0.2
ping -c 2 10.8.0.2
</pre>
</pre>
Line 459: Line 503:
=== <code>/etc/iptables/rules.v4</code> ===
=== <code>/etc/iptables/rules.v4</code> ===
Complete iptables rules including:
Complete iptables rules including:
'' DNAT rule for port 22222
* DNAT rule for port 22222
'' FORWARD rule for Synology
 
'' MASQUERADE rule for return traffic
* FORWARD rule for Synology
'' Logging rules for debugging
 
* MASQUERADE rule for return traffic
 
* Logging rules for debugging


=== <code>/etc/openvpn/server/server.conf</code> ===
=== <code>/etc/openvpn/server/server.conf</code> ===
OpenVPN server configuration with:
OpenVPN server configuration with:
'' <code>script-security 2</code> - Allows up/down scripts
* <code>script-security 2</code> - Allows up/down scripts
'' <code>up /etc/openvpn/iptables-restore.sh</code> - Restores rules when VPN starts
 
* <code>up /etc/openvpn/iptables-restore.sh</code> - Restores rules when VPN starts


=== <code>/etc/openvpn/iptables-restore.sh</code> ===
=== <code>/etc/openvpn/iptables-restore.sh</code> ===
Line 483: Line 531:
After making changes to iptables rules:
After making changes to iptables rules:
<pre class="lang-bash">
<pre class="lang-bash">
= Save current rules =
==== Save current rules ====
iptables-save > /etc/iptables/rules.v4
iptables-save > /etc/iptables/rules.v4


= Verify they're correct =
== Verify they're correct ==
cat /etc/iptables/rules.v4 | grep 22222
cat /etc/iptables/rules.v4 | grep 22222
</pre>
</pre>
Line 494: Line 542:
To forward additional ports:
To forward additional ports:
<pre class="lang-bash">
<pre class="lang-bash">
= Add DNAT rule =
==== Add DNAT rule ====
iptables -t nat -A PREROUTING -i ens6 -p tcp --dport <EXTERNAL_PORT> \
iptables -t nat -A PREROUTING -i ens6 -p tcp --dport <EXTERNAL_PORT> \
   -j DNAT --to-destination 10.8.0.2:<INTERNAL_PORT>
   -j DNAT --to-destination 10.8.0.2:<INTERNAL_PORT>


= Add FORWARD rule =
== Add FORWARD rule ==
iptables -t filter -A FORWARD -d 10.8.0.2 -p tcp --dport <INTERNAL_PORT> -j ACCEPT
iptables -t filter -A FORWARD -d 10.8.0.2 -p tcp --dport <INTERNAL_PORT> -j ACCEPT


= Save rules =
== Save rules ==
iptables-save > /etc/iptables/rules.v4
iptables-save > /etc/iptables/rules.v4
</pre>
</pre>
Line 534: Line 582:


If issues persist after following this guide:
If issues persist after following this guide:
= Check all diagnostic commands above =
=== Check all diagnostic commands above ===
= Review kernel logs: <code>dmesg | tail -50</code> =
== Review kernel logs: <code>dmesg | tail -50</code> ==
= Check OpenVPN logs: <code>journalctl -u openvpn-server@server.service -n 100</code> =
== Check OpenVPN logs: <code>journalctl -u openvpn-server@server.service -n 100</code> ==
= '''Verify IONOS firewall settings''' (most common issue): =
== '''Verify IONOS firewall settings''' (most common issue): ==
   '' Log in to IONOS Cloud Panel: https://dcd.ionos.com/
   * Log in to IONOS Cloud Panel: https://dcd.ionos.com/
   '' Navigate to Server & Cloud → Servers → [Your VPS] → Firewall
 
   '' Verify port 22222 is allowed with proper priority
   * Navigate to Server & Cloud → Servers → [Your VPS] → Firewall
= Check IONOS support documentation or contact IONOS support if firewall is correctly configured =
 
   * Verify port 22222 is allowed with proper priority
 
== Check IONOS support documentation or contact IONOS support if firewall is correctly configured ==


[[Category:Documentation]]
[[Category:Documentation]]
[[Category:Documentation/Troubleshooting]]
[[Category:Documentation/Troubleshooting]]

Latest revision as of 13:44, 1 January 2026

Overview

[edit]

This guide covers troubleshooting for SSH port forwarding from the VPS (port 22222) to the Synology NAS (10.8.0.2:22) via OpenVPN.

Port Forwarding Configuration:

  • External Access: ssh -p 22222 user@87.106.61.62
  • Internal Target: 10.8.0.2:22 (Synology NAS via VPN)
  • Network Interface: ens6 (external interface)
  • VPN Interface: tun0 (OpenVPN tunnel)
  • Cloud Provider: IONOS

IONOS Cloud Provider Configuration

[edit]

Important: This VPS is running on IONOS. The IONOS firewall must be configured to allow traffic on port 22222.

IONOS Firewall Configuration

[edit]

IONOS uses a cloud firewall that must be configured through the IONOS Cloud Panel:

Log in to IONOS Cloud Panel:

[edit]
  * Navigate to: https://dcd.ionos.com/
  * Select your Data Center → Server & Cloud → Servers

Configure Firewall Rules:

[edit]
  * Select your VPS server
  * Go to Firewall section
  * Click Add Rule or edit existing rules

Add Firewall Rule for Port 22222:

[edit]
  * Name: SSH Port Forward (or any descriptive name)
  * Protocol: TCP
  * Port: 22222
  * Source: 0.0.0.0/0 (or restrict to specific IPs for security)
  * Action: Allow
  * Priority: Set appropriate priority (lower numbers = higher priority)

Apply Changes:

[edit]
  * Save the firewall rule
  * Changes are applied immediately (no server restart required)

Verify IONOS Firewall:

[edit]
  * Ensure the firewall rule is active and enabled
  * Check that no higher-priority DROP rules are blocking the port
  * Verify the rule applies to the correct network interface

IONOS-Specific Notes

[edit]
  • Firewall Location: IONOS firewall is managed at the cloud infrastructure level, not on the VPS
  • No Security Groups: IONOS uses a direct firewall per server, not security groups
  • Rule Priority: Lower priority numbers are evaluated first
  • Immediate Effect: Firewall changes take effect immediately without server restart
  • Multiple Rules: You can have multiple rules; ensure no conflicting DROP rules have higher priority

Testing IONOS Firewall

[edit]

If you suspect the IONOS firewall is blocking traffic:

Check IONOS Cloud Panel:

[edit]
  * Verify the firewall rule exists and is enabled
  * Check rule priority (lower numbers = higher priority)
  * Ensure no DROP rules are blocking the port

Test from different locations:

[edit]
=== Test from external IP (not from the VPS itself) ===
   ssh -v -p 22222 user@87.106.61.62

Check if packets reach the VPS:

[edit]
=== On the VPS, check if packets are hitting iptables rules ===
   iptables -t nat -L PREROUTING -n -v | grep 22222
=== If packet count doesn't increase, packets are blocked before reaching VPS ===

Quick Verification Checklist

[edit]

Run these commands to verify the setup is working:

=== 1. Check if VPN is running ===
systemctl status openvpn-server@server.service

== 2. Verify VPN tunnel is up ==
ip addr show tun0

== 3. Check if Synology is connected to VPN ==
ping -c 2 10.8.0.2
cat /etc/openvpn/server/ipp.txt | grep "10.8.0.2"

== 4. Verify iptables rules are active ==
iptables -t nat -L PREROUTING -n -v | grep 22222
iptables -t filter -L FORWARD -n -v | grep "10.8.0.2"

== 5. Check IP forwarding is enabled ==
cat /proc/sys/net/ipv4/ip_forward  # Should output: 1

== 6. Verify SSH is NOT listening on port 22222 (should only be on 22) ==
ss -tlnp | grep 22222  # Should return nothing

Components Explained

[edit]

1. iptables NAT Rules (Port Forwarding)

[edit]

DNAT Rule (PREROUTING):

iptables -t nat -A PREROUTING -i ens6 -p tcp --dport 22222 -j DNAT --to-destination 10.8.0.2:22
  • Purpose: Redirects incoming traffic on port 22222 to the Synology NAS
  • Interface: ens6 (external/public interface)
  • Direction: Incoming → Forwarded

MASQUERADE Rule (POSTROUTING):

iptables -t nat -A POSTROUTING -d 10.8.0.2/32 -o tun0 -p tcp --dport 22 -j MASQUERADE
  • Purpose: Handles source NAT for forwarded traffic so return packets route correctly
  • Interface: tun0 (VPN tunnel)
  • Direction: Outgoing forwarded traffic

2. iptables Filter Rules (Firewall)

[edit]

FORWARD Rule:

iptables -t filter -A FORWARD -d 10.8.0.2/32 -p tcp --dport 22 -j ACCEPT
  • Purpose: Allows forwarding packets to the Synology SSH port
  • Direction: Forwarded traffic

3. Persistence Configuration

[edit]

Files:

  • /etc/iptables/rules.v4 - Saved iptables rules
  • /etc/openvpn/server/server.conf - OpenVPN configuration
  • /etc/openvpn/iptables-restore.sh - Script that restores rules when VPN starts
  • /etc/sysctl.conf - Contains net.ipv4.ip_forward=1

Services:

  • netfilter-persistent - Loads iptables rules on boot
  • openvpn-server@server.service - OpenVPN server service

Common Issues and Solutions

[edit]

Issue 1: Connection Timeout from External

[edit]

Symptoms:

  • ssh -p 22222 user@87.106.61.62 times out
  • No response from the server

Diagnostic Steps:

Check if packets are reaching the VPS:

[edit]
=== Watch kernel logs for DNAT rule hits ===
=== Note: On systems using journald, kern.log may not exist. Use dmesg instead. ===
   tail -f /var/log/kern.log | grep "DNAT-22222" 2>/dev/null || \
   dmesg -w | grep "DNAT-22222"
   
=== Or check recent logs ===
   dmesg | tail -30 | grep "DNAT-22222"

Check IONOS cloud firewall:

[edit]
  * IONOS Cloud Panel: Log in to https://dcd.ionos.com/
  * Navigate to: Server & Cloud → Servers → [Your VPS] → Firewall
  * Verify TCP port 22222 has an ALLOW rule configured
  * Check rule priority (lower numbers = higher priority)
  * Ensure no DROP rules with higher priority are blocking the port
  * This is the most common cause of timeouts on IONOS
  * See "IONOS Cloud Provider Configuration" section above for detailed steps

Verify VPN is running:

[edit]
   systemctl status openvpn-server@server.service
   ip link show tun0

Check if Synology is connected:

[edit]
   ping -c 2 10.8.0.2
   cat /etc/openvpn/server/ipp.txt

Solution:

  • If no logs appear: Check IONOS firewall in Cloud Panel (most common issue)
 * Verify port 22222 is allowed in IONOS firewall rules
 * Check rule priority and ensure no blocking rules override it
  • If logs appear but connection fails: Check Synology VPN connection
  • If Synology is not in ipp.txt: Reconnect Synology to VPN

Issue 2: Port Forwarding Not Working After Reboot

[edit]

Symptoms:

  • Port forwarding works initially
  • After reboot, connections time out

Diagnostic Steps:

Check if iptables rules are loaded:

[edit]
   iptables -t nat -L PREROUTING -n -v | grep 22222
  * If rule is missing, rules weren't loaded

Verify persistence services are enabled:

[edit]
   systemctl is-enabled netfilter-persistent
   systemctl is-enabled openvpn-server@server.service

Check OpenVPN configuration:

[edit]
   grep "script-security\|up" /etc/openvpn/server/server.conf
  * Should show: script-security 2 and up /etc/openvpn/iptables-restore.sh

Verify iptables-restore script exists:

[edit]
   ls -la /etc/openvpn/iptables-restore.sh
   cat /etc/openvpn/iptables-restore.sh

Solution:

== Manually restore rules ==
iptables-restore < /etc/iptables/rules.v4

== Verify rules are saved correctly ==
iptables-save > /etc/iptables/rules.v4

== Ensure services are enabled ==
systemctl enable netfilter-persistent
systemctl enable openvpn-server@server.service

Issue 3: Wrong Network Interface

[edit]

Symptoms:

  • Rules exist but forwarding doesn't work
  • Interface name mismatch

Diagnostic Steps:

Identify the correct external interface:

[edit]
   ip route | grep default
=== Output: default via 87.106.61.1 dev ens6 ... ===

Check iptables rule interface:

[edit]
   iptables -t nat -L PREROUTING -n -v | grep 22222
=== Should show: -i ens6 (or your actual interface) ===

Check saved rules file:

[edit]
   grep "22222" /etc/iptables/rules.v4

Solution:

== Fix the interface in the rules file ==
sed -i 's/-i eth0/-i ens6/g' /etc/iptables/rules.v4

== Or manually edit /etc/iptables/rules.v4 ==
== Change: -A PREROUTING -i eth0 ... ==
== To:     -A PREROUTING -i ens6 ... ==

== Reload rules ==
iptables-restore < /etc/iptables/rules.v4

Issue 4: SSH Conflicts with Port Forwarding

[edit]

Symptoms:

  • Port 22222 is being used by SSH
  • Connection connects but to wrong server

Diagnostic Steps:

Check what's listening on port 22222:

[edit]
   ss -tlnp | grep 22222

Check SSH configuration:

[edit]
   grep "^Port" /etc/ssh/sshd_config

Solution:

== Remove port 22222 from SSH config ==
sed -i '/^Port 22222$/d' /etc/ssh/sshd_config

== Restart SSH ==
systemctl restart sshd

== Verify port 22222 is free ==
ss -tlnp | grep 22222  # Should return nothing

Issue 5: VPN Not Starting

[edit]

Symptoms:

  • OpenVPN service fails to start
  • Error messages about script-security

Diagnostic Steps:

Check OpenVPN status:

[edit]
   systemctl status openvpn-server@server.service
   journalctl -u openvpn-server@server.service -n 50

Common error:

[edit]
   WARNING: External program may not be called unless '--script-security 2' or higher is enabled

Solution:

== Add script-security to OpenVPN config ==
echo "script-security 2" >> /etc/openvpn/server/server.conf

== Restart OpenVPN ==
systemctl restart openvpn-server@server.service

Issue 6: IP Forwarding Disabled

[edit]

Symptoms:

  • Rules exist but forwarding doesn't work
  • Can't reach Synology even though VPN is up

Diagnostic Steps:

Check if forwarding is enabled:

[edit]
   cat /proc/sys/net/ipv4/ip_forward
=== Should output: 1 ===

Check if it's in sysctl.conf:

[edit]
   grep "ip_forward" /etc/sysctl.conf

Solution:

== Enable forwarding ==
echo 1 > /proc/sys/net/ipv4/ip_forward

== Make it persistent ==
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

Diagnostic Commands

[edit]

Check Complete Forwarding Chain

[edit]
echo "=== Port Forwarding Status ===" && \
echo "" && \
echo "1. DNAT Rule:" && \
iptables -t nat -L PREROUTING -n -v | grep 22222 && \
echo "" && \
echo "2. FORWARD Rules:" && \
iptables -t filter -L FORWARD -n -v | grep "10.8.0.2" && \
echo "" && \
echo "3. POSTROUTING (MASQUERADE):" && \
iptables -t nat -L POSTROUTING -n -v | grep "10.8.0.2\|MASQUERADE" && \
echo "" && \
echo "4. VPN Status:" && \
ip addr show tun0 2>/dev/null | grep "inet " && \
echo "" && \
echo "5. Synology Reachability:" && \
ping -c 1 -W 2 10.8.0.2 2>&1 | grep -E "bytes from|time=" || echo "Not reachable"

Monitor Connection Attempts

[edit]
==== Watch for incoming connections ====
== Note: On systems using journald, kern.log may not exist. Use dmesg instead. ==
tail -f /var/log/kern.log | grep -E "DNAT-22222|FWD-to-Synology" 2>/dev/null || \
dmesg -w | grep -E "DNAT-22222|FWD-to-Synology"

== Or use tcpdump ==
tcpdump -i ens6 -n tcp port 22222

== Monitor iptables counters ==
watch -n 1 'iptables -t nat -L PREROUTING -n -v | grep 22222'

Test Connection from VPS

[edit]
==== Test direct connection to Synology ====
ssh -o ConnectTimeout=5 -p 22 user@10.8.0.2 "echo 'Direct connection works'"

== Test if port forwarding rule is active (from external IP) ==
timeout 5 nc -zv 87.106.61.62 22222

Restore Configuration After Issues

[edit]

If port forwarding stops working, restore the complete configuration:

=== 1. Restore iptables rules ===
iptables-restore < /etc/iptables/rules.v4

== 2. Verify rules are loaded ==
iptables -t nat -L PREROUTING -n -v | grep 22222

== 3. Restart OpenVPN (will also restore rules via up script) ==
systemctl restart openvpn-server@server.service

== 4. Verify VPN is up ==
ip addr show tun0

== 5. Check Synology connection ==
ping -c 2 10.8.0.2

Configuration Files Reference

[edit]

/etc/iptables/rules.v4

[edit]

Complete iptables rules including:

  • DNAT rule for port 22222
  • FORWARD rule for Synology
  • MASQUERADE rule for return traffic
  • Logging rules for debugging

/etc/openvpn/server/server.conf

[edit]

OpenVPN server configuration with:

  • script-security 2 - Allows up/down scripts
  • up /etc/openvpn/iptables-restore.sh - Restores rules when VPN starts

/etc/openvpn/iptables-restore.sh

[edit]

Script that restores iptables rules when OpenVPN tunnel comes up.

/etc/sysctl.conf

[edit]

Contains net.ipv4.ip_forward=1 to enable IP forwarding.


Maintenance

[edit]

Update Rules

[edit]

After making changes to iptables rules:

==== Save current rules ====
iptables-save > /etc/iptables/rules.v4

== Verify they're correct ==
cat /etc/iptables/rules.v4 | grep 22222

Add More Port Forwards

[edit]

To forward additional ports:

==== Add DNAT rule ====
iptables -t nat -A PREROUTING -i ens6 -p tcp --dport <EXTERNAL_PORT> \
  -j DNAT --to-destination 10.8.0.2:<INTERNAL_PORT>

== Add FORWARD rule ==
iptables -t filter -A FORWARD -d 10.8.0.2 -p tcp --dport <INTERNAL_PORT> -j ACCEPT

== Save rules ==
iptables-save > /etc/iptables/rules.v4

Quick Reference

[edit]
Component Value
External Port 22222
Internal Target 10.8.0.2:22
External Interface ens6
VPN Interface tun0
VPN Subnet 10.8.0.0/24
VPS Public IP 87.106.61.62
Synology VPN IP 10.8.0.2
Cloud Provider IONOS
IONOS Panel https://dcd.ionos.com/

Contact & Support

[edit]

If issues persist after following this guide:

Check all diagnostic commands above

[edit]

Review kernel logs: dmesg | tail -50

[edit]

Check OpenVPN logs: journalctl -u openvpn-server@server.service -n 100

[edit]

Verify IONOS firewall settings (most common issue):

[edit]
  * Log in to IONOS Cloud Panel: https://dcd.ionos.com/
  * Navigate to Server & Cloud → Servers → [Your VPS] → Firewall
  * Verify port 22222 is allowed with proper priority

Check IONOS support documentation or contact IONOS support if firewall is correctly configured

[edit]