ipv4-forward-ipv6.png
可以用nginx、socat、xinetd和realm。这些软件都支持IPv4和IPv4。

realm

下载对应系统和架构的二进制文件,Linux一般选realm-x86_64-unknown-linux-gnu.tar.gz或者realm-x86_64-unknown-linux-musl.tar.gz.
解压后放到/usr/bin/realm

wget https://github.com/zhboner/realm/releases/download/v2.6.3/realm-x86_64-unknown-linux-gnu.tar.gz
tar -zxf realm-x86_64-unknown-linux-gnu.tar.gz
mv realm /usr/bin/realm
chmod +x /usr/bin/realm

新建服务描述文件/etc/systemd/system/realm.service,填入以下内容。

[Unit]
Description=A simple, high performance relay server written in rust.
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
DynamicUser=true
ExecStart=/usr/bin/realm -c /etc/realm.toml

[Install]
WantedBy=multi-user.target

新建realm配置文件/etc/realm.toml

[log]
level = "warn"
output = "/var/log/realm.log"

[network]
no_tcp = false
use_udp = true

[[endpoints]]
listen = "0.0.0.0:5000"
remote = "1.1.1.1:443"

[[endpoints]]
listen = "0.0.0.0:10000"
remote = "www.google.com:443"
# 载入新建的服务
systemctl daemon-reload

# 启动服务
systemctl start realm

# 启动服务
systemctl status realm

# 停止服务
systemctl stop realm

# 重启服务
systemctl restart realm

# 查看服务状态
sytemctl status realm

# 设置开机自启动
systemctl enable realm

# 查看出错日志
journalctl -u realm.service -b

Nginx

版本大于1.10,编译时带有--with-stream选项。
缺点是,如果转发ssh,一段时间没有操作会自动断开。

stream {
    server {
        listen 12345;
        proxy_connect_timeout 5s;
        proxy_timeout 20s;
        proxy_pass [2a04::1234]:22;
    }
}

Socat

转发SSH不会断,好!

# 前台运行
socat TCP4-LISTEN:12345,fork,su=nobody,reuseaddr TCP6:[2a04::1234]:22

# 后台运行
socat TCP4-LISTEN:443,fork,su=nobody,reuseaddr TCP4:2.3.4.5:443 > /var/log/socat.log 2>&1 &

# 查看后台运行的socat程序
ps -aux | awk 'NR==1 || /socat/'

# 关闭所有socat进程
kill -9 'pidof socat'

Xinetd

各大发行版的仓库都有,直接安装。
然后在/etc/xinetd.d新建一个配置文件,格式参考下面,文件名随意。

# 可以用井号写注释
service myportforward
{
        flags           = IPv6
        disable         = no
        type            = UNLISTED
        socket_type     = stream
        protocol        = tcp
        user            = nobody
        wait            = no
        redirect        = 2a04::1234 22  # 转发目标IP
        port            = 60007  # 本机监听IP
}

开启服务后查看状态。
xinetd.png

不支持IPv4 转 IPv6的

rinetd

作者说这软件是上世界90年代写的,要改的话太难了。

参考链接

  1. 使用Nginx进行TCP/UDP/IPV6端口转发【原创】
  2. SOCAT 简介
  3. 端口转发(篇二) - xinetd
  4. Xinetd服务的安装与配置详解
文章目录