Linux 端口转发方案合集

本文针对以下 2 点需求分别阐述 cow,frp 和 rinetd 三种方案的使用方法并介绍这三种方案的不同之处和各自适合的场景。

  1. 家中 PC-X 和单位 PC-Y 通过代理服务器实现网络穿透互联(frp)
  2. 现有 3 台机器,A 为具有公网 IP 的服务器,B 与 A 属于同一内网但没有外网 IP 的服务器,现在想要借助 A 做代理,使家中 PC-X 电脑可以访问 B 服务器(frp,rinetd)
  3. 科学上网代理转发(frp,cow,rinetd)

这里假定机器的 IP:

  • A:11.22.33.44
  • B:55.66.77.88

cow

cow 是一个非常 NB 的二级代理工具

安装 cow

1
curl -L git.io/cow | bash

编辑配置文件 ~/.cow/rc

cow 本地 PC-X 配置

1
2
3
listen = http://127.0.0.1:7777
#下面的 proxy 是部署在 A 上的 cow
proxy = cow://aes-256-cfb:YYY@11.22.33.44:11228

cow 在主机 A 上的配置

1
2
3
listen = cow://aes-256-cfb:YYY@0.0.0.0:11228
#下面的 proxy 是部署在 C 上的 $$ 服务
proxy = ss://aes-256-cfb:ZZZ@x.x.x.x:11229

说明

  • ‘YYY’ 是 cow 密码
  • ‘ZZZ’ 是 C 上的 $$ 服务的密码

  • ‘x.x.x.x’ 是有 $$ 代理服务的主机 C 的 IP

frp

高性能反向代理应用,支持 TCP, UDP 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。具体功能和配置方法参考官方文档

这里只是介绍如何使用端口映射实现内网穿透功能。

通过 ssh 访问内网机器

  1. frpsfrps.ini 放到具有公网 IP 的 A 机器上。

  2. frpcfrpc.ini 放到处于内网环境的 B 机器上。

  3. A 服务器上修改 frps.ini 文件,这里使用了最简化的配置:

1
2
3
# frps.ini
[common]
bind_port = 7000
  1. A 服务器上启动 frps:
1
./frps -c ./frps.ini
  1. B 服务器上修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 11.22.33.44;
1
2
3
4
5
6
7
8
9
10
# frpc.ini
[common]
server_addr = 11.22.33.44
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
  1. B 服务器上启动 frpc:
1
./frpc -c ./frpc.ini
  1. 本地 PC-X 机器通过 ssh 访问内网机器,假设用户名为 root:
1
ssh -p 6000 root@11.22.33.44

Rinetd

安装 Rinetd

CentOS

官方源不具有 Rinetd,所以需要安装第三方源。

配置第三方源
1
2
3
4
5
6
7
8
vim /etc/yum.repos.d/nux-misc.repo

[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
安装
1
yum --enablerepo=nux-misc install rinetd

Ubuntu

1
apt-get install rinetd

编译安装

1
2
3
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
mkdir  -p /usr/man/man8   #默认会把man文件放么/usr/man/man8下面,如果没有这个目录会报目前不存在,但不影响使用. 
make && make install

配置 Rinetd

配置文件路径是 /etc/rinetd.conf

配置格式

1
[Source Address] [Source Port] [Destination Address] [Destination Port]
  • Source Address:源地址,绑定的本地地址
  • Source Port:源端口,绑定的本地端口
  • Destination Address: 目的地址,连接的地址
  • Destination Port:目的端口,连接的端口

在每一单独的行中指定每个要转发的端口。源地址和目的地址都可以是主机名或IP地址,IP 地址0.0.0.0将rinetd绑定到任何可用的本地IP地址上。例如:0.0.0.0 8080 www.baidu.com 80

配置规则

1
2
3
4
5
6
7
vim /etc/rinetd.conf

0.0.0.0 8080 47.88.99.33 8080
0.0.0.0 2222 192.168.1.13 11228
1.2.3.4 80 192.168.0.11 80
allow *.*.*.*
logfile /var/log/rinetd.log

说明

0.0.0.0 表示本机绑定所有可用地址 将所有发往本机 8080 端口的请求转发到 47.88.99.33 的 8080 端口 将所有发往本机 2222 端口的请求转发到 192.168.1.13 的 3389 端口 将所有发往 1.2.3.4 的 80 端口请求转发到 192.168.0.11 的 80 端口 allow 设置允许访问的 IP 地址信息, *.*.*.* 表示所有 IP 地址 logfile 设置打印的 log 的位置

运行 Rinetd

启动

脚本启动
1
/etc/init.d/rinetd start
手动启动
1
/usr/sbin/rinetd -c /etc/rinetd.conf

关闭

脚本关闭
1
/etc/init.d/rinetd stop
手动关闭
1
pkill rinetd

Rinetd 使用注意事项

  1. rinetd.conf 中绑定的本机端口必须没有被其它程序占用
  2. 运行 rinetd 的系统防火墙应该打开绑定的本机端口
  3. 不支持 FTP 的跳转
  4. 编译安装不自带脚本

参考文档

Linux 下使用 Rinetd 实现端口转发