param( [string]$ListenAddress = "100.103.206.4", [int]$ListenPort = 8011, [string]$ConnectAddress = "127.0.0.1", [int]$ConnectPort = 8011 ) $ErrorActionPreference = "Stop" $listener = [System.Net.Sockets.TcpListener]::new( [System.Net.IPAddress]::Parse($ListenAddress), $ListenPort ) $listener.Start() Write-Output "Forwarding tcp://$ListenAddress`:$ListenPort -> tcp://$ConnectAddress`:$ConnectPort" try { while ($true) { $client = $listener.AcceptTcpClient() $null = [System.Threading.ThreadPool]::QueueUserWorkItem({ param($state) $source = $state.Source $target = [System.Net.Sockets.TcpClient]::new() try { $target.Connect($state.ConnectAddress, $state.ConnectPort) $sourceStream = $source.GetStream() $targetStream = $target.GetStream() $copyToTarget = $sourceStream.CopyToAsync($targetStream) $copyToSource = $targetStream.CopyToAsync($sourceStream) [System.Threading.Tasks.Task]::WaitAny($copyToTarget, $copyToSource) | Out-Null } catch { # Drop failed bridge attempts; the caller will see the connection fail. } finally { $source.Close() $target.Close() } }, @{ Source = $client ConnectAddress = $ConnectAddress ConnectPort = $ConnectPort }) } } finally { $listener.Stop() }