将传入流量转发到本地侦听器

将传入流量转发到本地侦听器

我在本地主机上运行一个服务,它监听本地主机端口:10000

我想要做的是将所有到达 publicip:15000 的流量转发到 localhost:10000,在该位置无法更改服务配置。

服务仅监听本地主机,但流量来自外部。

顺便说一下,服务在 Linux 上运行。

编辑;我尝试添加这样的 NAT 规则,但没有成功。

我配置了 NAT;

iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables --table nat --append POSTROUTING --out-interface lo -j MASQUERADE
iptables -A FORWARD -i eth0 -o lo -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i lo -o eth0 -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
service ufw restart

并执行以下命令开始路由;

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 15000 -j DNAT --to 127.0.0.1:10000

您认为我遗漏了什么?

提前致谢

巴里斯

答案1

看来环回流量的 DNAT 是不可能的。

环回流量跳过 PREROUTING 和 OUTPUT 链。

RFC 5735(第 3 页)说网络127.0.0.0/8无法在主机本身之外路由:

127.0.0.0/8 - 此地址块被指定为 Internet 主机环回地址。由高级协议发送到此地址块内任意地址的数据报都会在主机内环回。这通常仅使用 127.0.0.1/32 进行环回。如 [RFC1122] 第 3.2.1.3 节所述,整个 127.0.0.0/8 地址块内的地址不会合法地出现在任何网络上。


此外,到以下地点的流量loopback interface被视为Martian Packets

这些数据包实际上不可能像声称的那样发出,或者被送达


解决方法:

一个简单的替代方法是使用inted服务器端的服务器及其redirect 功能。

这样,您可以在其中定义一个服务inetd,并设置该服务将监听的端口。然后,设置redirect指令以将此端口绑定到127.0.0.1:port

在下面的示例中,我将使用xinetd(在 Ubuntu 12.04 LTS 上)绑定mysql运行于以下平台的服务器127.0.0.1:10000

步骤1 :安装包:apt-get install xinetd

第2步 :编辑配置文件/etc/xinetd.conf

添加类似下面的服务定义:

service my_redirector
{
 type = UNLISTED
 disable = no
 socket_type = stream
 protocol = tcp
 user = root
 wait = no
 port = 15000
 redirect = 127.0.0.1 10000
 log_type = FILE /tmp/somefile.log
}

步骤3:重新启动xinetd守护进程:service xinetd restart

步骤4 :让我们检查端口上的监听器15000

# netstat -anp | grep 15000
tcp     0      0 0.0.0.0:15000      0.0.0.0:*     LISTEN      4654/xinetd

步骤5:添加您的iptables规则:

iptables -A INPUT -i eth0 -p tcp -d 192.168.0.60 --dport 15000 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -s 192.168.0.60 --sport 15000 -j ACCEPT

让我们测试一下:

为了测试,我已设置mysql监听。我将尝试通过端口上的服务127.0.0.1:10000访问它。xinetd15000

首先,在服务器端,我确保mysql服务器只监听127.0.0.1:10000

# netstat -anp | grep :10000
tcp    0    0 127.0.0.1:10000    0.0.0.0:*      LISTEN      4247/mysqld

然后,在客户端,让我们检查是否可以使用端口连接15000

# telnet 192.168.0.60 15000
Trying 192.168.0.60...
Connected to 192.168.0.60.
Escape character is '^]'.
_
5.5.35-0ubuntu0.12.04.2-logD46S}<P`.6cr4ITIQ<wcmysql_native_password

看来我们可以!:)

让我们尝试连接到mysql服务器:

# mysql -h 192.168.0.60 --port=15000 -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 67
Server version: 5.5.35-0ubuntu0.12.04.2-log (Ubuntu)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

完毕 !

相关内容