redirectCmd.sh 1.4 KB

12345678910111213141516171819202122232425262728293031323334
  1. #!/bin/bash
  2. RemoteAddress="${1:-}"
  3. LocalPort="${2:-443}"
  4. LocalIf="${3:-}"
  5. function getInterface(){
  6. interface=""
  7. Interfaces=`cat /proc/net/dev |grep ':' |cut -d':' -f1 |sed 's/\s//g' |grep -iv '^lo\|^sit\|^stf\|^gif\|^dummy\|^vmnet\|^vir\|^gre\|^ipip\|^ppp\|^bond\|^tun\|^tap\|^ip6gre\|^ip6tnl\|^teql\|^ocserv\|^vpn'`
  8. defaultRoute=`ip route show default |grep "^default"`
  9. for item in `echo "$Interfaces"`
  10. do
  11. [ -n "$item" ] || continue
  12. echo "$defaultRoute" |grep -q "$item"
  13. [ $? -eq 0 ] && interface="$item" && break
  14. done
  15. echo "$interface"
  16. }
  17. echo "${RemoteAddress}" |grep -q "[0-9a-zA-Z\.]\+:[0-9]\{1,5\}"
  18. [ "$?" -ne 0 ] && echo "Invalid RemoteAddress(Host:Port)" && exit 1
  19. RemoteHost="$(host $(echo ${RemoteAddress} |cut -d: -f1) |grep -o '[0-9\.]\{1,3\}\.[0-9\.]\{1,3\}\.[0-9\.]\{1,3\}\.[0-9\.]\{1,3\}')"
  20. RemotePort="$(echo ${RemoteAddress} |cut -d: -f2 |grep -o '[0-9]\{1,5\}')"
  21. [ ! -n "${RemoteHost}" ] && echo "Invalid RemoteHost" && exit 1
  22. [ -n "$LocalIf" ] || LocalIf="$(getInterface)"
  23. [ "$(cat /proc/sys/net/ipv4/ip_forward)" != "1" ] && echo "1" >/proc/sys/net/ipv4/ip_forward
  24. iptables -I INPUT -p tcp --dport ${LocalPort} -j ACCEPT
  25. iptables -t nat -A PREROUTING -p tcp -i ${LocalIf} --dport ${LocalPort} -j DNAT --to-destination ${RemoteHost}:${RemotePort}
  26. iptables -t nat -I POSTROUTING -d ${RemoteHost} -p tcp --dport ${RemotePort} -j MASQUERADE