zoukankan      html  css  js  c++  java
  • rinetd实现TCP/UDP端口转发【转】

    前言

    iptables 的功能当然强大,但理解与设置却有点抽象,便通过google认识了rinetd。

    简介

    Rinetd是为在一个Unix和Linux操作系统中为重定向传输控制协议(TCP)连接的一个工具。Rinetd是单一过程的服务器,它处理任何数量的连接到在配置文件etc/rinetd中指定的地址/端口对。尽管rinetd使用非闭锁I/O运行作为一个单一过程,它可能重定向很多连接而不对这台机器增加额外的负担。

    Rinetd官网  https://boutell.com/rinetd/

    安装

    cat >> rinetd-installer.sh <<'EOF'
    #!/bin/bash
    wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
    tar zxvf rinetd.tar.gz
    cd rinetd
    mkdir -p /usr/man/man8
    # make编译提示:make cc Command not found 解决办法 -> yum安装gcc
    yum install gcc
    make && make install
    EOF
    chmod +x rinetd-installer.sh
    ./rinetd-installer.sh

    配置

    配置端口转发的配置文件在/etc/rinetd.conf

    配置文件格式

    [Source Address] [Source Port] [Destination Address] [Destination Port]
    源地址 源端口 目的地址 目的端口

    在每一单独的行中指定每个要转发的端口。源地址和目的地址都可以是主机名或IP地址,IP 地址0.0.0.0将rinetd绑定到任何可用的本地IP地址上。例如:0.0.0.0 8080 wuweixiang.cn 80

    rm -f /etc/rinetd.conf
    cat >> /etc/rinetd.conf <<EOF
    # 设置允许访问的ip地址信息
    # allow 192.168.2.*
    
    # 设置拒绝访问的ip地址信息
    # deny 192.168.1.*
    
    # 设置日志文件路径
    logfile /var/log/rinetd.log
    
    # 例子: 将本机 8080 端口重定向至 188.131.152.100 的 8080 端口
    # 0.0.0.0 8090 188.131.152.100 8080
    EOF

    创建启动脚本

    cat >> /etc/init.d/rinetd <<'EOF'
    #!/bin/bash
    
    EXEC=/usr/sbin/rinetd
    CONF=/etc/rinetd.conf
    PID_FILE=/var/run/rinetd.pid
    NAME=Rinetd
    DESC="Rinetd Server"
    
    case "$1" in
        start)
            if [ -x "$PID_FILE" ]; then
                echo "$NAME is running ..."
                exit 0
            fi
    
            $EXEC -c $CONF
    
            echo -e "e[1;32m$NAME is runninge[0m"
        ;;
        stop)
            if [ -f "$PID_FILE" ]; then
                kill `cat $PID_FILE`
    
                while [ -x "$PID_FILE" ]
                do
                    echo "Waiting for $NAME to shutdown..."  
                    sleep 1
                done
    
                rm -f $PID_FILE
            fi
    
            echo -e "e[1;31m$NAME stopped.e[0m"
        ;;
        restart)
            $0 stop
            $0 start
        ;;
        status)
            if [ -f $PID_FILE ]; then
                echo "$NAME is running ..."
            else
                echo "$NAME stopped."
            fi
        ;;
        *)
            echo $"Usage: $0 {start|stop|restart|status}"
            exit 2
        ;;
    esac
    
    exit 0
    EOF

    启动服务

    /etc/init.d/rinetd start

    开机启动

    在/etc/rc.local 文件中,添加/usr/sbin/rinetd 或者 /usr/sbin/rinetd -c /etc/rinetd.conf 启动命令即可。

    需要注意

    rinetd.conf中绑定的本机端口必须没有被其它程序占用

    rinetd 在生产环境要谨慎使用

    Linux7版本安装rinetd

    在Linux系统中大多数情况选择用iptables来实现端口转发,iptables虽然强大,但配置不便,而且新手容易出错。在此分享另一个TCP/UDP端口转发工具rinetd,rinetd体积小巧,配置也很简单。

    安装rinetd

    这篇文章以CentOS 7为例,复制下面的命令输入,一行一个:

    #安装依赖
    yum -y install gcc gcc-c++ make
    #下载rinetd
    wget https://github.com/samhocevar/rinetd/releases/download/v0.70/rinetd-0.70.tar.gz
    #解压
    tar -zxvf rinetd-0.70.tar.gz
    #进入目录
    cd rinetd-0.70
    #编译安装
    ./bootstrap
    ./configure
    make && make install

    安装后,可以输入rinetd -v查看当前版本。

    [root@kryptcn2 rinetd-0.70]# rinetd -v
    rinetd 0.70

    随着时间推移,上面下载地址不一定是最新的,大家可前往Github:https://github.com/samhocevar/rinetd/releases下载最新版本。

    设置TCP端口转发

    #新建rinetd配置文件
    vi /etc/rinetd.conf
    #填写如下内容
    0.0.0.0 2018 103.74.192.160 2019
    #启动rinetd
    rinetd -c /etc/rinetd.conf
    

    rinetd配置文件的格式如下:

    • 0.0.0.0:源IP
    • 2018:源端口
    • 103.74.192.160:目标IP
    • 2019:目标端口

    上面配置的意思是将本地2018端口转发到103.74.192.160的2019端口,启动后可以输入netstat -apn|grep 'rinetd'查看是否运行正常,注意还需要在自己服务器防火墙放行对应的源端口,否则无法正常使用用。

    0.70版本开始rinetd已经支持UDP转发,写法如下:

    127.0.0.1   8000/udp  192.168.1.2     8000/udp

    创建systemd服务

    为了方便管理,我们可以为rinetd编写一个systemd服务,有兴趣的同学可参考《Linux系统编写Systemd Service实践》,xiaoz已经编写好了,直接复制下面的内容即可:

    #创建rinetd服务
    vi /etc/systemd/system/rinetd.service

    复制下面的内容进行保存:

    [Unit]
    Description=rinetd
    After=network.target
    
    [Service]
    Type=forking
    ExecStart=/usr/local/sbin/rinetd -c /etc/rinetd.conf
    
    [Install]
    WantedBy=multi-user.target

    输入命令:systemctl daemon-reload重载daemon使其生效,然后就可以使用下面的命令来管理rinetd了。

    #启动rinetd
    systemctl start rinetd
    #设置开机启动
    systemctl enable rinetd
    #停止rinetd
    systemctl stop rinetd
    #重启
    systemctl restart rinetd

    rinetd的一些问题

    rinetd支持转发到域名,rinetd会提前解析域名,并将解析出的IP缓存到内存中,如果您的域名解析IP发生了变化必须重启rinetd才会生效,所以rinetd并不适合转发到域名IP经常发生变化的情况,而socat则不存在此问题。

    其它转发工具

    总结

    rinetd安装和配置都非常简单,并且从0.70版本开始已经支持UDP转发,但rinetd具体性能如何xiaoz并未进一步测试,不知道高并发的情况下能否扛得住。

    转发

    一分钟上手Rinetd——端口转发工具 - wuweixiang - OSCHINA - 中文开源技术交流社区
    http://cache.baiducontent.com/c?m=ccHUY8EVt2HMKbYBIkWe7OCfl80Sl6Ld3MXXqILtOq4lLtwDVlkSCAxzhZSuWgkXnyHzxrlGn2_RUDMfCqBKRObb_ad4Y5WBaPRiNkzymSEhLWrNH3zrbOIIZQfntPMN&p=9a759a46d6c414fe0be2962b157a92&newp=882a9645d1800be709be9b7c1e5c86231610db2151d4d1126b82c825d7331b001c3bbfb423291704d5c6776d0aa5435beff13177370923a3dda5c91d9fb4c57479cb6d7c21&s=cfcd208495d565ef&user=baidu&fm=sc&query=rinetd&qid=f28395f00029d21b&p1=1

    Linux安装rinetd实现TCP/UDP端口转发 - 小z博客
    https://www.xiaoz.me/archives/10175

  • 相关阅读:
    Python 基础【第三篇】输入和输出
    把linux可执行程序做成一个服务[转]
    linux 下启动程序的时候会显示坏的解释器,或者没有那个文件
    利用GDB进行多线程调试
    两个结构体ifconf和ifreq
    centos系统修改网络配置注意事项
    yum错误:rpmdb: BDB0113 Thread/process 4227/139813012539200 failed: BDB1507 Thread died in Berkeley DB library
    CentOs安装MySql
    周末遐想(计算最长英语单词链)
    单词词频统计(12组)
  • 原文地址:https://www.cnblogs.com/paul8339/p/14688378.html
Copyright © 2011-2022 走看看