一、rinetd进行端口转发

  1. #下载
  2. wget http://www.rinetd.com/download/rinetd.tar.gz
  3. #解压安装
  4. tar zxvf rinetd.tar.gz
  5. make
  6. make install
  7. #编辑配置
  8. #将所有发往本机50000端口的请求转发到172.16.10.4的50000端口
  9. vi /etc/rinetd.conf
  10. 0.0.0.0 50000 172.16.10.4 50000
  11. #启动
  12. /usr/sbin/rinetd
  13. #关闭
  14. pkill rinetd
  15. #查看状态
  16. netstat -tnlp

二、使用nginx进行四层端口转发

三、使用ssh端口转发

四、使用iptables进行端口转发

#! /bin/sh

# create forward rule by source interface
# http://serverfault.com/questions/532569/how-to-do-port-forwarding-redirecting-on-debian
PortForward1() {
    local IN_IF=$1
    local IN_PORT=$2
    local OUT_IP=$3
    local OUT_PORT=$4
    local IPTBL="/sbin/iptables"
    echo "1" > /proc/sys/net/ipv4/ip_forward
    $IPTBL -A PREROUTING -t nat -i $IN_IF -p tcp --dport $IN_PORT -j DNAT --to-destination ${OUT_IP}:${OUT_PORT}
    $IPTBL -A FORWARD -p tcp -d $OUT_IP --dport $OUT_PORT -j ACCEPT
    $IPTBL -A POSTROUTING -t nat -j MASQUERADE
}

# create forward rule by source ip
# http://blog.csdn.net/zzhongcy/article/details/42738285
ForwardPort2() {
    local IN_IP=$1
    local IN_PORT=$2
    local OUT_IP=$3
    local OUT_PORT=$4
    local IPTBL="/sbin/iptables"
    echo "1" > /proc/sys/net/ipv4/ip_forward
    $IPTBL -t nat -A PREROUTING --dst $IN_IP -p tcp --dport $IN_PORT -j DNAT --to-destination ${OUT_IP}:${OUT_PORT}
    $IPTBL -t nat -A POSTROUTING --dst $OUT_IP -p tcp --dport $OUT_PORT -j SNAT --to-source $IN_IP
}

第一个函数是按照网卡名称设置转发:
PortForward1 eth1 8765 202.115.8.2 8765
这时,本地 eth1 网卡的 8765 端口就会被转发给 202.115.8.2 的 8765 端口。
第二个函数是按照本机的 ip 地址,比如本机是 192.168.1.2:
PortForward2 192.168.1.2 8765 202.115.8.2 8765
那么任何访问本机 192.168.1.2 这个地址 8765 端口,都会被转发到 202.115.8.2:8765
这个 iptable 的 port forwarding 是内核层运行的,性能极好,只不过每次重启都需要重新设置下。
参考文档:https://zhuanlan.zhihu.com/p/57630633