There are 3 machine
- My machine
 - Host A with public IP
 - Target Host B with can be reached from Host A
 
The goal is that I and my friends want to access target host B services in convenience. We can ssh to Host A with public IP.
 Local ForwardingRun this command on my machine
 ssh -L 123:targetB:80 userA@hostA
 
- We can access targetB:80 by myMachine:123 instead
 - The traffic will be forward from myMachine:123 through ssh tunnel to hostA and the forward to targetB finally.
 
Remote Forwarding Run this command on hostA
 ssh -R 123:targetB:80 me@myMachine
 - We can access targetB:80 by myMachine:123 instead
 - It's similar to local forwarding but the ssh tunnel is created by hostA which is the forwarder
 - The traffic will be forward from myMachine:123 through ssh tunnel to hostA and the forward to targetB finally.
  
 Dynamic Forwarding  Run this command on my machine
 ssh -D 123 userA@hostA
 - It's similar to local forwarding but it doesn't specify the target:port because the target address and the port will be determined automatically by application protocol such as SOCKS.
 - We can access targetB:80 by SOCKS proxy in browser or OS network settings.
  - Currently SOCKS4 and SOCKS5 protocols are supported.
 
 Remarks- There might have firewall issues. It might have to change some port unless the packets will be blocked.
 - This method is for TCP traffic. For UDP, you may have to try other methods.