我有一个在 localhost 3280 上运行的 Web 服务,它在/some/long/url
.我想从本地主机的端口 3000 访问 Elasticsearch。
我可以通过端口转发、镜像、代理来做到这一点吗?最好的办法是什么?
编辑:我的意思是该服务正在 3280 上运行,并且希望从已关闭的 3000 上访问它。
答案1
与 slm 的答案相比,必须维护两个不同的位置(iptables 和 apache),并且还会产生无法访问 localhost:3280 上的 / 的副作用,我将仅使用 Apache 来实现结果。这将通过 3000 上的 / 为 ElasticSearch 提供服务(而不是将用户“重定向”到 localhost:3280/some/long/url - 更改浏览器上显示的 url)。该解决方案一次性处理步骤 #4 和步骤 #7(#7 处的应用程序可以将流量重定向到级别 #4 的不同 IP)。
如果您已经mod_proxy
加载了 Apache,您可以更改端口 3000 <VirtualHost>
(我假设它正在使用*
而不是虚拟主机声明中的 127.0.0.1):
<VirtualHost *:3000>
.
.
.
RewriteEngine On
ProxyPass / http://127.0.0.1:3280/some/long/url
ProxyPassReverse / http://127.0.0.1:3280/some/long/url
</VirtualHost>
编辑:更正规则应该在 3000 上,proxypass 到 3280,澄清与 slm 建议的差异,并删除有关在 ProxyPass 中更改 127.0.0.1 的点(因为它是虚拟主机片段正是原始问题中所要求的)。
参考:
答案2
重定向端口
您可以使用以下 2 条规则来执行您想要的操作:
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 3000 -j REDIRECT \
--to-port 3280
$ sudo iptables -t nat -A OUTPUT -p tcp -d 127.0.0.0/8 --dport 3000 -j REDIRECT \
--to-port 3280
如果您想在本地主机之外访问此规则,则需要使用主机的 IP 地址(假设 192.168.1.10)添加此规则:
$ sudo iptables -t nat -A OUTPUT -p tcp -d 192.168.1.10 --dport 3000 \
-j REDIRECT --to-port 3280
重定向/ -> /some/long/url
这可以使用 Apache 中的重写规则来完成。这可以添加到 Apache 的httpd.conf
文件中,例如:
RewriteEngine on
RewriteRule ^$ /some/long/url [R=301,L]
为什么有 2 个工具?
那么为什么需要iptables
Apache?这与开放系统互连模型。 OSI 模型包含 7 层。
#7.应用程序(网络进程到应用程序)
#6。表示(数据表示、加密和解密、将机器相关数据转换为机器无关数据)
#5。会话(主机间通信,管理应用程序之间的会话)
#4。传输 -(端到端连接、可靠性和流量控制)
#3.网络 -(路径确定和逻辑寻址)
#2.数据链路 - (物理寻址)
#1.物理 -(媒体、信号和二进制传输)
iptables
Apache 处理#4 层的数据,而 Apache 则处理#7 层的数据。将数据视为类似于信封。信封外面包含要投递的地址(这是端口号)。这将是 OSI 模型中的第 4 层。
信封的内容(HTTP + URL)需要由 Apache 在第 7 层进行操作。