Linux 上有 iptables
具有端口转发的功能,但配置有点复杂,有另外一种TCP转发工具 rinetd
,它能够将一个服务地址和端口转到到另外一个端口上(可以转发到内网哦).
Linux 安装 rinetd
先到官方网站下载源码 rineted. P.S. 2003.4.13 发布 rinetd 0.62 版本,十多年过去了,没有其他额外的修改,程序真稳定 ...
下载之后,需要编译源码,先确定机器上安装了 gcc
,然后编译安装。
# 下载源码
curl https://boutell.com/rinetd/http/rinetd.tar.gz -o rinetd.tar.gz
# 解压编译
tar xvzf rinetd.tar.gz
cd rinetd
make
sudo make -p /usr/man/man8
# 安装与使用
sudo make install
运行命令(需要管理员权限),查看安装结果.
# sudo rinetd -h
Usage: rinetd [OPTION]
-c, --conf-file FILE read configuration from FILE
-h, --help display this help
-v, --version display version number
Most options are controlled through the
configuration file. See the rinetd(8)
manpage for more information.
把需要转发的地址和端口写入配置文件 /etc/rinetd.conf
(默认配置文件)
# 格式 [source_address] [source_port] [destination_address] [destination_port]
0.0.0.0 80 10.1.2.10 80
然后运行程序
sudo rinetd -c /etc/rinetd.conf
如果需要终止程序,运行如下命令
sudo pkill rinetd
rinetd 更多说明和配置
rinetd
是单进程服务,能够处理大量的端口工作,内存使用非阻塞IO处理,因此能够处理大量的连接,而且对机器性能影响不大。rinetd
不可以转达发哦 FTP 上,因为 FTP 需要多个 socket 连接.
配置
1. 配置文件
默认配置文件是 /etc/rinetd.conf
,当然了,你可以通过参数 -c
指定额外的配置文件。
2. 转发规则
转发规则的格式是:
bindaddress bindport connectaddress connectport
例如,
206.125.69.81 80 10.1.1.2 80
表示的意思是所有到地址为206.125.69.81
,端口为 81 的请求,都会转发到 10.1.1.2
端口 80 上。当然,如果你想监听服务器上所有到 81 的地址,把 206.125.69.81
改成 0.0.0.0
就可以了。
3. 允许和拒绝规则
rinetd
支持通过允许或者拒绝规则过滤请求。请求规则的写法是这样的
allow pattern
其中 pattern
可以是 0-9(10个数字),.(IP 分割符号),?(模式匹配,只匹配一个字符),*(匹配任何数字). 说白了,就是IP的正则表达式.
e.g.
allow 206.125.69.*
这个过滤规则对于位置是有要求的,过滤规则可能写在转发规则前和转发规则后. e.g.
# 过滤规则在前
allow 206.125.69.*
206.125.69.81 80 10.1.1.2 80
或者这样
206.125.69.81 80 10.1.1.2 80
# 过滤规则在后
allow 206.125.69.*
两者是有差别的,过滤规则在转发规则前,过滤规则就是全局性的,也就是说,只要不满足任何一个全局过滤规则,请求都会被拒绝。另外一种情况,过滤规则只对上面的一条转发规则有效。
拒绝规则同样是这样的写法.
deny pattern
4. 日志
rinetd
默认不写日志,可以在配置文件中,添加配置,让rinetd 记录日志. 添加如下内容
logfile log-file-location
e.g.
logfile /var/log/rinetd.log
输出日志格式是这样的,tab 分割的信息:
07/Sep/2019:22:05:01 101.68.5.197 0.0.0.0 81 localhost 9000 1078 1188248 done-remote-closed
07/Sep/2019:22:05:01 101.68.5.197 0.0.0.0 81 localhost 9000 2407 2366 done-remote-closed
对应的字段表示:
Date and time
Client address
Listening host
Listening port
Forwarded-to host
Forwarded-to port
Bytes received from client
Bytes sent to client
Result message
还有一种日志格式,更 common 一些(好像就最后一个字段的信息,不一样,其他都一样, :-<),配置参数是 logcommon
,输出日志是这样的,
07/Sep/2019:22:11:24 101.68.5.197 0.0.0.0 81 localhost 9000 0 0 denied
其他转发方式
e.g. firewall
firewall-cmd --add-masquerade
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.13.1:toport=80 --permanent
firewall-cmd --add-forward-port=port=8080:proto=tcp:toaddr=192.168.13.1:toport=8080 --permanent
网友评论