📖 本教程更新于 2020 年 07 月 07 日
本教程为设置流量转发


iptables 转发

iptabels是Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含iptables的功能。利用linux的一个内核模块进行ip包的转发,工作在linux的内核态,不涉及内核态和用户态的状态转换,因此可以说是所有端口转发方案中最稳定的。
配置繁琐、不支持域名转发、重启转发规则失效是显而易见的缺点。

一键脚本 iptablesUtils

该一键脚本解决了 iptables 的痛点问题,配置简单、支持域名、域名转发重启任然生效

用法

1
wget -qO natcfg.sh http://arloor.com/sh/iptablesUtils/natcfg.sh && bash natcfg.sh

1
wget -qO natcfg.sh https://raw.githubusercontent.com/arloor/iptablesUtils/master/natcfg.sh && bash natcfg.sh

按照脚本的提示来就可以完成配置

iptables 手动配置

Centos7 注意事项

Centos 7 默认的防火墙是 firewall,安装iptables之前需关闭Firewall,禁止firewall开机启动。
使用 systemctl status firewalld 查看服务状态

如果服务是运行状态,先关闭 firewall 服务,命令如下:
systemctl stop firewalld

停止以后然后执行下面命令禁用:
systemctl disable firewalld

安装 iptables

1
yum install -y iptables-services

启动 iptables

1
systemctl start iptables

开启内核转发功能

在使用 iptables 转发流量之前请执行如下命令(开启IP转发功能)

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

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

1
2
3
iptables -F
iptables -t nat -F
service iptables save

iptables 配置命令

相同端口转发命令

1
2
3
4
iptables -t nat -A PREROUTING -p tcp --dport [端口号] -j DNAT --to-destination [落地🐔]
iptables -t nat -A PREROUTING -p udp --dport [端口号] -j DNAT --to-destination [落地🐔]
iptables -t nat -A POSTROUTING -p tcp -d [落地🐔] --dport [端口号] -j SNAT --to-source [中转🐔内网IP]
iptables -t nat -A POSTROUTING -p udp -d [落地🐔] --dport [端口号] -j SNAT --to-source [中转🐔内网IP]

注意:执行完毕后,必须进行保存 请使用 service iptables save 进行保存。

不同端口转发命令

1
2
3
4
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 进行保存。

查看NAT规则

1
2
iptables -t nat -vnL POSTROUTING
iptables -t nat -vnL PREROUTING
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@coal ~]# iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 7 packets, 523 bytes)
pkts bytes target prot opt in out source destination
9184 800K SNAT tcp -- * * 0.0.0.0/0 202.182.114.69 tcp dpt:21755 to:192.168.1.122
0 0 SNAT udp -- * * 0.0.0.0/0 202.182.114.69 udp dpt:21755 to:192.168.1.122
0 0 SNAT tcp -- * * 0.0.0.0/0 209.141.41.34 tcp dpt:19593 to:192.168.1.122
0 0 SNAT udp -- * * 0.0.0.0/0 209.141.41.34 udp dpt:19593 to:192.168.1.122

[root@coal ~]# iptables -t nat -vnL PREROUTING
Chain PREROUTING (policy ACCEPT 215 packets, 37296 bytes)
pkts bytes target prot opt in out source destination
9185 800K DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22043 to:202.182.114.69:21755
0 0 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:22043 to:202.182.114.69:21755
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22044 to:209.141.41.34:19593
0 0 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:22044 to:209.141.41.34:19593

删除NAT规则

通过上面的查看规则命令,查看规则后,确定你要删除的规则的顺序,下面的命令是删除第一个规则。

1
2
iptables -t nat -D POSTROUTING 1
iptables -t nat -D PREROUTING 1

gost 转发

GOST 是一个用 Go 语言实现的安全隧道工具,功能较为丰富,支持组建代理链路。在这里我们基本只用到了端口转发这一个功能。

安装 gost

1
wget -N --no-check-certificate https://github.com/ginuerzh/gost/releases/download/v2.11.0/gost-linux-amd64-2.11.0.gz && gzip -d gost-linux-amd64-2.11.0.gz && mv gost-linux-amd64-2.11.0 gost && chmod +x gost

后台运行

直接使用命令会让 gost 前台运行,若关闭当前 ssh 连接,gost 进程也会终止,所以需要将 gost 运行在后台中,具体方式有 nohup、screen、docker 等启动方式,本文将介绍 srceen 运行 gost,也会提供的 docker-compose 配置。

screen 基本使用

1
2
3
4
5
screen -R gost                    # 进入名字为 soga1 的 screen 窗口,若不存在,则自动创建
screen -ls # 查看已创建的 screen 窗口
ctrl + a,然后全松开,再按 d # 离开当前 screen 窗口
ctrl + a,然后全松开,再按 Esc # 此时可以用滚轮上下查看日志
exit # 退出并关闭当前 screen 窗口

screen 运行 gost

  1. 创建名为 gost 的窗口 screen -R gost
  2. 输入转发命令,参考下文
  3. 关闭窗口 ctrl + a,然后全松开,再按 d

直接转发

直接转发只需要在中转鸡上安装 gost,设置如下配置即可
例如:通过中转鸡的 12345 端口转发流量到ip为 1.2.3.4 落地鸡的 45678 上,以下配置将均以此为例

1
gost -L=tcp://:12345/1.2.3.4:45678 -L=udp://:12345/1.2.3.4:45678

docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3"

services:
redirect:
image: ginuerzh/gost
restart: always
network_mode: "host"
command:
- "-L=tcp://:12345/1.2.3.4:45678"
- "-L=udp://:12345/1.2.3.4:45678"
logging:
options:
max-size: "10m"
max-file: "3"

加密转发

加密转发需要在中转鸡和落地鸡上都安装 gost,并分别设置如下配置

中转鸡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "3"

services:
tls:
image: ginuerzh/gost
restart: always
network_mode: "host"
command:
- "-L=tcp://:12345"
- "-L=udp://:12345"
- "-F=forward+mtls://1.2.3.4:55555?mbind=true"
logging:
options:
max-size: "10m"
max-file: "3"

55555 为中转鸡和落地鸡的 gost 通信端口,不必与 v2 服务端口号一致

落地鸡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "3"

services:
tls:
image: ginuerzh/gost
restart: always
network_mode: "bridge"
ports:
- "55555:55555/tcp"
- "55555:55555/udp"
command:
- "-L=mtls://:1.2.3.4/127.0.0.1:45678"
logging:
options:
max-size: "10m"
max-file: "3"

nginx 转发