深秋's Blog 当时明月在,曾照彩云归

使用iptables与realm进行流量转发

By 深秋 On Renew

流量走向:

vps中转:客户端 --> GFW --> A服务器 --> B服务器(落地) --> YouTube --> 返回客户端
专线:客户端 --> 隧道专线 --> 专线出口 --> A服务器(落地) --> YouTube --> 返回客户端

1、iptables

A服务器IP:2.2.2.2 端口:20000
B服务器IP:6.6.6.6 端口:60000

以下都在A服务器上操作

首先在服务器上开启 tcp 转发:

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

使其生效:
sysctl -p

好像Debian11以上就弃用了iptables,来安装一下:

apt install iptables -y

把A服务器 20000 端口流量转发到B服务器的 60000 端口上

在PREROUTING上修改目的地址:

iptables -t nat -A PREROUTING -p tcp --dport 20000 -j DNAT --to-destination 6.6.6.6:60000

在POSTROUTING上修改源地址:

# 2.2.2.2 是A服务器IP,也就是转发服务器IP
iptables -t nat -A POSTROUTING -d 6.6.6.6 -p tcp --dport 60000 -j SNAT --to 2.2.2.2

# 或者直接用MASQUERADE自动获取源IP,两条命令二选一
iptables -t nat -A POSTROUTING -d 6.6.6.6 -p tcp --dport 60000 -j MASQUERADE

为了防止在FORWARD上面被丢弃,添加两条规则允许通过:

iptables -I FORWARD -d 6.6.6.6 -p tcp --dport 60000 -j ACCEPT

iptables -I FORWARD -s 6.6.6.6 -p tcp --sport 60000 -j ACCEPT

最后,为了使规则永久生效,不至于重启服务器后丢失,安装个iptables-persistent

apt install iptables-persistent

安装完成后写入规则

iptables-save > /etc/iptables/rules.v4

补充

如果你的落地机使用的是nat机,可能由于部分原因需要更换ip或端口,请看如下演示

# 删除现有规则
iptables -t nat -D PREROUTING -p tcp --dport 20000 -j DNAT --to-destination 6.6.6.6:60000
iptables -t nat -D POSTROUTING -d 6.6.6.6 -p tcp --dport 60000 -j SNAT --to 2.2.2.2
iptables -D FORWARD -d 6.6.6.6 -p tcp --dport 60000 -j ACCEPT
iptables -D FORWARD -s 6.6.6.6 -p tcp --sport 60000 -j ACCEPT

# 添加新的规则
iptables -t nat -A PREROUTING -p tcp --dport 20000 -j DNAT --to-destination 7.7.7.7:60000
iptables -t nat -A POSTROUTING -d 7.7.7.7 -p tcp --dport 60000 -j SNAT --to 2.2.2.2
iptables -I FORWARD -d 7.7.7.7 -p tcp --dport 60000 -j ACCEPT
iptables -I FORWARD -s 7.7.7.7 -p tcp --sport 60000 -j ACCEPT

2、realm

首先下载最新的realm

weget https://github.com/zhboner/realm/releases/download/v2.6.0/realm-x86_64-unknown-linux-gnu.tar.gz

tar -zxvf realm-x86_64-unknown-linux-gnu.tar.gz

chmod +x realm

测试运行


realm -l 0.0.0.0:6666 -r 6.6.6.6:7777

配置文件(通常在realm同级目录下新增一个config.toml文件)

[log]
# 日志级别: off,debug,info,error,warn 测试时可用debug, 验证ok可用改成warn
level = "warn"
output = "/var/log/realm.log"

[network]
no_tcp = false
use_udp = true

# 负载均衡模式(通常不用)
#[[endpoints]]
#listen = "0.0.0.0:6666"
#remote = "6.6.6.6:7777"
# extra_remotes = ["7.7.7.7:7777","8.8.8.8:7777"]
# balance = "roundrobin: 4,2,1"

[[endpoints]]
listen = "0.0.0.0:6666"
remote = "6.6.6.6:7777"
 

补充:如果转发地址是ipv6,请使用[]将ipv6地址包起来

设置开机自启

nano /etc/systemd/system/realm.service

#将下方复制粘贴进去
[Unit]
Description=realm
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
 
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
#如果你用的是2.6以下版本,请取消注释这行
#DynamicUser=true
WorkingDirectory=/etc/realm
ExecStart=/root/realm -c /root/config.toml

[Install]
WantedBy=multi-user.target

开机并启动

systemctl daemon-reload
systemctl enable realm
systemctl restart realm
systemctl status realm