Port Redirect
Posted by HellRaz0r
Thursday, January 11, 2007
Description: This script enables you to redirect incoming traffic to a remote ip/port.


alias redirect {
  if (!$3) { echo -a Invalid syntax, use like this: /redirect <localport> <remoteip> <remoteport> | halt }

  hadd -m $+(Redir_,$1) localport $1
  hadd -m $+(Redir_,$1) remoteip $2
  hadd -m $+(Redir_,$1) remoteport $3

  var %sockname $+(Redir_listen_,$1)
  .sockclose %sockname | .socklisten %sockname $1

}

on *:socklisten:Redir_listen_*:{
  var %localport $sock($sockname).bindport, %htable = $+(Redir_,%localport)
  var %remoteip $hget(%htable,remoteip), %remoteport = $hget(%htable,remoteport)
  var %sockin Redir_in_ $+ %remoteip $+ : $+ %remoteport
  var %sockout Redir_out_ $+ %remoteip $+ : $+ %remoteport
  var %logfile Redir_ $+ %localport $+ .log, %blog = Redir_ $+ %localport $+ _Binary.log

  .remove sockdata.dat | .remove %logfile | .remove %blog
  sockaccept %sockin

  sockmark %sockin %sockout

  pause s 1

  if (!$exists(sockdata.dat)) { sockopen %sockout %remoteip %remoteport | sockmark %sockout %localport }

}


on *:sockread:Redir_in_*:{
  sockread &datain
  var %sockout $sock($sockname).mark
  var %localport $sock($sockname).bindport, %htable = $+(Redir_,%localport)
  var %remoteip $hget(%htable,remoteip), %remoteport = $hget(%htable,remoteport)

  if (!$sock(%sockout)) {
    bwrite sockdata.dat 1 -1 &datain
    sockopen %sockout %remoteip %remoteport
    sockmark %sockout %localport
  }
  else {
    if ($sock(%sockout).status == Connecting) pause s 1
    sockwrite %sockout &datain
  }

  var %logfile Redir_ $+ %localport $+ .log, %blog = Redir_ $+ %localport $+ _Binary.log

  bwrite %logfile -1 -1 ->
  bwrite %logfile -1 -1 &datain

  if ($bvar(&datain,0) < 800) write %blog -> $bvar(&datain,1-)


}


on *:sockopen:Redir_out_*:{
  if ($exists(sockdata.dat)) {
    bread sockdata.dat 1 $file(sockdata.dat).size &data
    sockwrite $sockname &data
    .remove sockdata.dat
  }
}
on *:sockread:Redir_out_*:{
  sockread &dataout
  var %localport $sock($sockname).mark, %htable = $+(Redir_,%localport)
  var %remoteip $hget(%htable,remoteip), %remoteport = $hget(%htable,remoteport)
  var %sockin Redir_in_ $+ %remoteip $+ : $+ %remoteport
  var %sockout Redir_out_ $+ %remoteip $+ : $+ %remoteport

  if (!$sock(%sockin)) .sockclose %sockout
  else sockwrite %sockin &dataout

  var %logfile Redir_ $+ %localport $+ .log, %blog = Redir_ $+ %localport $+ _Binary.log

  bwrite %logfile -1 -1 <-
  bwrite %logfile -1 -1 &dataout

  if ($bvar(&dataout,0) < 700) write %blog <- $bvar(&dataout,1-)

}

Submit a comment
Oops! You need to login or register before you can post a comment!

ebaum's world