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端口