NAT VPS即基于NAT的虚拟服务器,是在虚拟服务器(VPS)的基础上,通过共享IP的方式,为这个IP下的服务器提供外网访问能力。通常仅提供有限数量的端口,因此相较独立ip的VPS价格更为低廉。在使用NAT VPS过程中,有许多人都有流量中转的需求,本文将介绍常见的几种中转方式。

一、直接使用iptables进行端口转发
对于静态ip的NAT VPS,最直接的方式即使用iptables进行转发。

由于Centos7+默认开启了firewall,因此我们需要先关闭firewall并安装iptables。

systemctl stop firewalld systemctl disable firewalld systemctl status firewalld

当显示Active: inactive (dead)时,即表示成功关闭了firewall。

接着安装iptables

yum install -y iptables-services iptables-devel.x86_64 iptables.x86_64 systemctl enable iptables systemctl start iptables systemctl status iptables

当显示Active:active (exited)时,表示iptables成功开启。

使用iptables转发流量

在使用iptables转发流量之前请执行如下命令:

sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf sysctl -p

然后我们清除下所有默认的iptables表:

iptables -F iptables -t nat -F service iptables save

iptables相同端口转发命令:

iptables -t nat -A PREROUTING -p tcp --dport [端口号] -j DNAT --to-destination [目标IP] iptables -t nat -A PREROUTING -p udp --dport [端口号] -j DNAT --to-destination [目标IP] iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [端口号] -j SNAT --to-source [中转服务器IP] iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [端口号] -j SNAT --to-source [中转服务器IP]

不同端口:

iptables -t nat -A PREROUTING -p tcp --dport [源端口号] -j DNAT --to-destination [目标IP:目标端口号] iptables -t nat -A PREROUTING -p udp --dport [源端口号] -j DNAT --to-destination [目标IP:目标端口号] iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [中转服务器IP] iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [中转服务器IP]

执行完毕后,必须进行保存:

service iptables save

以下是一个实例(这里我们的应用端口为50020~50029,我们使用520022测试转发另外一个IP的6053端口,我们的主IP为:192.168.5.2,转发服务器IP为:1.1.1.1):

iptables -t nat -A PREROUTING -p tcp --dport 50022 -j DNAT --to-destination 1.1.1.1:6053 iptables -t nat -A PREROUTING -p udp --dport 50022 -j DNAT --to-destination 1.1.1.1:6053 iptables -t nat -A POSTROUTING -p tcp -d 1.1.1.1 --dport 6053 -j SNAT --to-source 192.168.5.2 iptables -t nat -A POSTROUTING -p udp -d 1.1.1.1 --dport 6053 -j SNAT --to-source 192.168.5.2 service iptables save

二、通过iptables一键脚本进行端口转发

同样的,我们需要先关闭firewall

systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

安装一键脚本:

wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/iptables-pf.sh && chmod +x iptables-pf.sh && bash iptables-pf.sh

该脚本会自动下载iptables,请选择1.安装iptables,后面会自动完成配置

接着使用脚本:

./iptables-pf.sh

选择4.添加 iptables 端口转发 后,会提示你依次输入 欲转发IP、欲转发端口、本地监听端口、本地IP、转发类型确认之后即可完成中转设置。

三、通过Socat一键脚本进行端口转发

下载并运行一键脚本:

wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/socat.sh && chmod +x socat.sh && bash socat.sh

运行脚本:

./socat.sh

选择3. 新增 SoCat后,会提示你依次输入 本地监听端口、欲转发IP、欲转发端口、转发类型确认之后即可完成中转设置。

四、通过Haproxy一键脚本进行端口转发

安装HaProxy:

Debian/Ubuntu系统:

apt-get -y install haproxy

Centos系统:

yum -y install haproxy

打开 /etc/haproxy/haproxy.cfg

vi /etc/haproxy/haproxy.cfg

按Insert按键将里面的内容替换为:

global defaults log global mode tcp option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend ss-in bind *:[端口eg 6666]/[端口段eg 10000-30000] default_backend ss-out backend ss-out server server1 [被中转的远程VPS的IP]  maxconn 20480

之后按ESC键,并输入:wq 并回车

五、通过Brook完成中继

下载并安装一键脚本:

wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/brook-pf.sh && chmod +x brook-pf.sh && bash brook-pf.sh
bash brook-pf.sh

输入7. 设置 Brook 端口转发并回车,再输入 1. 添加 端口转发,根据提示输入Brook 本地监听端口(即中转NAT端口,不能重复),被转发的 IP(远程服务器ip),被转发的端口(远程服务器端口)。确认之后即完成中转。

六、rinetd工具将数据包转发至指定IP或域名端口

安装rinetd:

wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -xvf rinetd.tar.gz
cd rinetd
sed -i 's/65536/65535/g' rinetd.c
mkdir /usr/man/
make && make install
vi /etc/rinetd.conf

格式命令为:

绑定的地址 绑定的端口 连接的地址 连接的端口 (eg:将所有发往本机9191端口的请求,转发到192.168.0.1的9191端口 就设置为0.0.0.0 9191 192.168.0.1 9191)

或 源地址 源端口 目的地址 目的端口 (eg:将所有发往本机2525端口的请求,转发到www.supervpschoice.xyz的25端口 就设置为 0.0.0.0 2525 www.supervpschoice.xyz 25)

之后按ESC键,并输入:wq 并回车

启动规则:

rinetd -c /etc/rinetd.conf

查看状态:

netstat -antup

停止转发:

pkill rinetd

设置开机自动启动转发规则:

vi /etc/rc.local
rinetd -c /etc/rinetd.conf

iptables -A INPUT -p tcp -m tcp --dport [中转端口] -j ACCEPT   #无法无法联通可能是端口未打开,打开iptables端口