本文以 CentOS 8 和 Debian 10 & Ubuntu 20.04 为例,介绍如何在 NAT VPS 上设置流量中转。
开始前,请先根据实际使用的操作系统,参照以下文章对服务器进行各种必要的配置:
- CentOS 服务器的初始配置
- Debian & Ubuntu 服务器的初始化配置
本文以 用户为例,进行中转机的设置,并默认已按初始化配置文章对服务器进行了配置。sammy
本文将介绍四种方法:,,,和 (推荐)来进行流量中转,根据需要选取其中一种方法操作即可。亦可根据需要,将目标机设置为只允许中转机访问。firewalld
UFW
iptables
socat
其中,,, 均可对 TCP 和 UDP 进行转发,而 还可以对包含域名的地址进行转发。firewalld
UFW
iptables
socat
准备
- 购买合适的 NAT VPS,此处提供一些服务商
- 了解 NAT VPS 的基本使用方法,例如搞清楚 NAT VPS 一般需要在服务商处查看端口映射的设置
- 基础 Linux 操作知识,并了解 编辑器的基本使用方法
vim
使用 firewalld 进行中转
此方法在 CentOS 下较为简便(CentOS 8 默认使用 firewalld),因此也推荐使用此方法。
检查 firewalld 运行状态,输出应为 :running
1
|
firewall-cmd --state
|
接下来设置端口转发:
1 2 3 4 5 6 |
sudo firewall-cmd --zone=public --permanent --add-port 本机端口号/tcp sudo firewall-cmd --zone=public --permanent --add-port 本机端口号/udp sudo firewall-cmd --zone=public --permanent --add-forward-port=port=本机端口号:proto=tcp:toport=目标端口号:toaddr=目标地址 sudo firewall-cmd --zone=public --permanent --add-forward-port=port=本机端口号:proto=udp:toport=目标端口号:toaddr=目标地址 sudo firewall-cmd --zone=public --permanent --add-masquerade sudo firewall-cmd --reload |
其中 为目标服务器的 IP 地址。目标地址
至此,利用 设置中转的方法介绍完毕。另可根据使用场景,对目标机的防火墙进行配置,令其只接受来自此 NAT VPS 的流量。firewalld
使用 UFW 进行中转
此方法在 Debian & Ubuntu 下较为简便(Ubuntu 18.04 默认使用 UFW)。
首先要修改 文件:/etc/sysctl.conf
1 2 |
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p |
修改 :/etc/default/ufw
1
|
sudo vim /etc/default/ufw
|
1
|
DEFAULT_FORWARD_POLICY="ACCEPT"
|
修改 :/etc/ufw/before.rules
1
|
sudo vim /etc/ufw/before.rules
|
在 之前添加:*filter
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# nat table rules *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # port forwarding -A PREROUTING -p tcp --dport 本机端口号 -j DNAT --to-destination 目标地址:目标端口号 -A PREROUTING -p udp --dport 本机端口号 -j DNAT --to-destination 目标地址:目标端口号 -A POSTROUTING -p tcp -d 目标地址 --dport 目标端口号 -j SNAT --to-source 本机内网地址 -A POSTROUTING -p udp -d 目标地址 --dport 目标端口号 -j SNAT --to-source 本机内网地址 # commit to apply changes COMMIT |
其中, 为目标服务器的 IP 地址, 为本机在内部局域网的 IP 地址。目标地址
本机内网地址
重启 UFW:
1
|
sudo ufw disable && sudo ufw enable
|
至此,利用 设置中转的方法介绍完毕。另可根据使用场景,对目标机的防火墙进行配置,令其只接受来自此 NAT VPS 的流量。UFW
使用 iptables 进行中转
对于其他系统或不使用 的用户,也可以使用 iptables 进行中转设置。firewalld
首先要修改 文件:/etc/sysctl.conf
1 2 |
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p |
如下显示的是不同端口(本机端口号和目标机端口号不同)的中转方法:
1 2 3 4 |
sudo iptables -t nat -A PREROUTING -p tcp --dport 本机端口号 -j DNAT --to-destination 目标地址:目标端口号 sudo iptables -t nat -A PREROUTING -p udp --dport 本机端口号 -j DNAT --to-destination 目标地址:目标端口号 sudo iptables -t nat -A POSTROUTING -p tcp -d 目标地址 --dport 目标端口号 -j SNAT --to-source 本机内网地址 sudo iptables -t nat -A POSTROUTING -p udp -d 目标地址 --dport 目标端口号 -j SNAT --to-source 本机内网地址 |
其中, 为目标服务器的 IP 地址, 为本机在内部局域网的 IP 地址。目标地址
本机内网地址
CentOS 下保存规则
1
|
sudo service iptables save
|
Debian & Ubuntu 下 保存规则:
1 2 3 |
sudo apt install iptables-persistent -y sudo netfilter-persistent save sudo netfilter-persistent start |
至此,利用 设置中转的方法介绍完毕。另可根据使用场景,对目标机的防火墙进行配置,令其只接受来自此 NAT VPS 的流量。iptables
使用 socat 进行中转
如所需转发的端口数量较少,则个人推荐使用此方法。
首先安装 ,此处以 Debian & Ubuntu 系统为例:socat
1
|
sudo apt install socat
|
配置进行 TCP 转发,编辑服务文件,可根据需要自行调整此文件名,本文以 为文件名作例:socat-tcp
1
|
sudo vim /etc/systemd/system/socat-tcp.service
|
添加以下内容,注意替换其中的 、、,其中, 可以是 IP 地址,也可以是域名地址:本机端口号
目标地址
目标端口号
目标地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Unit] Description=Socat TCP Forwarding Service After=network.target [Service] Type=simple CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE DynamicUser=true ExecStart=/usr/bin/socat TCP4-LISTEN:本机端口号,reuseaddr,fork TCP4:目标地址:目标端口号 Restart=always [Install] WantedBy=multi-user.target |
接着,启动 socat 的 TCP 转发服务:
1 2 |
sudo systemctl enable socat-tcp sudo systemctl start socat-tcp |
如果还需要进行 UDP 转发,则继续编辑一个新文件,可根据需要自行调整此文件名,本文以 为文件名作例:socat-udp
1
|
sudo vim /etc/systemd/system/socat-udp.service
|
添加以下内容,注意替换其中的 、、,其中, 可以是 IP 地址,也可以是域名地址:本机端口号
目标地址
目标端口号
目标地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Unit] Description=Socat UDP Forwarding Service After=network.target [Service] Type=simple CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE DynamicUser=true ExecStart=/usr/bin/socat -T 60 UDP4-LISTEN:本机端口号,reuseaddr,fork UDP4:目标地址:目标端口号 Restart=always [Install] WantedBy=multi-user.target |
接着,启动 socat 的 UDP 转发服务:
1 2 |
sudo systemctl enable socat-udp sudo systemctl start socat-udp |
本机防火墙放行此端口:
1
|
sudo ufw allow 本机端口号
|
至此,利用 设置中转的方法介绍完毕。另可根据使用场景,对目标机的防火墙进行配置,令其只接受来自此 NAT VPS 的流量。socat
附注:使用 nohup 直接启动 socat 转发 TCP 的方法
1 2 |
nohup /usr/bin/socat -d TCP4-LISTEN:本机端口号,reuseaddr,fork,su=nobody TCP4:目标地址:目标端口号 >> /var/log/socat.log 2>&1 & nohup /usr/bin/socat -d -T 60 UDP4-LISTEN:本机端口号,reuseaddr,fork,su=nobody UDP4:目标地址:目标端口号 >> /var/log/socat.log 2>&1 & |
上面两条命令可在 用户下执行。root
目标机的设置
此处示例的目标机为 Debian & Ubuntu 系统,安装并启用了 UFW:
如需同时允许 TCP 和 UDP 入站:
1
|
sudo ufw allow from 中转机地址 to any port 端口号
|
如需只允许 TCP 入站:
1
|
sudo ufw allow proto tcp from 中转机地址 to any port 端口号
|
如需只允许 UDP 入站:
1
|
sudo ufw allow proto udp from 中转机地址 to any port 端口号
|
以上命令中, 为 NAT VPS 的公网 IP 地址。中转机地址
其他系统、其他防火墙控制软件的操作与之类似,放行来自 NAT VPS 的 IP 的指定端口号即可。