我在本地主机上运行一个服务,它监听本地主机端口: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
访问它。xinetd
15000
首先,在服务器端,我确保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>
完毕 !