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 running\e[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM