在管理服务器时,重定向流量非常常见。
假设我们有一台运行着某些服务的服务器,但是出于某种原因,我们更改了其中一个服务(我不知道,例如pop3是端口110)到另一台服务器。 正常且最常见的事情是仅更改DNS记录中的IP,但是如果有人使用IP而不是子域,则会受到影响。
该怎么办? ...简单,将该服务器通过该端口接收的流量重定向到具有相同端口的另一台服务器。
我们如何开始重定向流量?
首先,我们必须启用 转发 在服务器上,为此,我们将放置以下内容:
echo "1" > /proc/sys/net/ipv4/ip_forward
您也可以使用其他命令,以防上一个命令不适合您使用(我在CentOS上就这样发生了):
sysctl net.ipv4.ip_forward=1
然后,我们将重新启动网络:
service networking restart
在CentOS等RPM发行版中,它将是:
service nertwork restart
现在我们继续进行重要的事情,告诉服务器 iptables的 重定向内容:
iptables -t nat -A PREROUTING -p tcp --dport <puerto receptor> -j DNAT --to-destination <ip final>:<puerto de ip final>
换句话说,在我提到的示例之后,假设我们要将服务器通过端口110接收的所有流量重定向到另一台服务器(例如:10.10.0.2),它将仍然通过110(这是相同的服务):
iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 10.10.0.2:110
如果10.10.0.2服务器想要游动请求,则2服务器将看到所有数据包或请求都来自客户端的IP,即第二台服务器看到请求与第一台服务器的IP一起到达(并且我们将其应用重定向),也将放在第二行:
iptables -t nat -A POSTROUTING -j MASQUERADE
一些问题和答案
在示例中,我在两种情况下都使用了相同的端口(110),但是它们可以将流量从一个端口重定向到另一个端口而没有问题。 例如,假设我想将流量从端口80重定向到另一台服务器上的443,因为它将是:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.0.2:443
这是 iptables的,他们可以使用我们知道的所有其他参数,例如,如果我们只想重定向来自特定IP的流量,则会添加-s …例如,我将仅重定向来自10.10.0.51的流量:
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.51 --dport 80 -j DNAT --to-destination 10.10.0.2:443
或整个网络(/ 24):
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.0/24 --dport 80 -j DNAT --to-destination 10.10.0.2:443
我们还可以使用-i指定网络接口:
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 10.10.0.2:443
结束!
就像我已经说过的那样,这是iptables,您可以应用已知的内容,以便服务器完全按照您希望的方式进行操作😉
的问候!
我们还可以通过允许端口转发的防火墙来做到这一点,对吗? (应用相应的规则)。
是的,当然可以,最后,像Pfsense或其他防火墙一样,从后面使用iptables。
确切地说,pfsense不使用iptables,而是使用pf,请记住,它是内部的bsd。
哦,对,我的坏!
非常感谢您的小费🙂
我有几个疑问:
1-变更是否永久? 还是重新启动服务器时丢失?
2-我在同一子网上有多个实例(例如A,B和C)。 在实例A中,我应用了规则将流量路由到外部IP,并使用实例B和C进行的卷曲测试,一切正常。 问题在于实例A不能正常工作。 我尝试同时使用您的ip和回送接口,但均无效:
$ iptables -t nat -A PREROUTING -p tcp –dport 8080 -j DNAT –to-destination xxxx:8080
$ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT –to-destination xxxx:8080
$ curl ip-yyyy:8080 / hello_world
curl:(7)无法连接到ip-yyyy端口8080:连接被拒绝
$ curl本地主机:8080 / hello_world
curl:(7)无法连接到本地主机端口8080:连接被拒绝
知道可能是什么问题吗?
是的,更改在重新启动后丢失,您将必须使用iptables-save和iptables-restore或类似方法来避免这种情况。
我不太了解您要做什么,实例A?
我有一台仅支持来自特定ip(服务器A)的连接的服务器,我不能或不想向白名单中添加更多ip(用于可伸缩性问题),因此我希望到外部服务器的所有流量都通过该服务器(A )。
出于实用性考虑,我具有全局配置,这些配置定义了用于每个服务的IP,因此在这种情况下,类似于“每个想要使用外部服务的人都必须使用IP A”
我使用本文中的方法成功实现了此目的,但是遇到一个问题,即在应用它时,服务器A无法使用其自己的ip访问服务(但其他所有服务器都可以)。
到目前为止,我发现最好的方法是将映射添加到服务器A的/ etc / hosts文件中,指向外部ip,覆盖全局设置。
很好,如果我有另一个邮件服务器,我可以将端口143的流量从server1转发到server2,电子邮件将到达server2,对吗?
问候
从理论上讲,它的工作原理是这样的。 当然,您必须在server2上正确安装邮件服务器
我们喜欢阅读的那种帖子,谢谢!
很棒的文章,我有一个正在工作的项目,我想问你一个问题,有一些具有NAT功能的工业交换机(我想它们使用下面的IPTable),可以在不更改设备的情况下转换IP地址,例如,我有一台与10.10.2.1.X计算机通信的服务器10.10.2,并通过该交换机进行了编程,以便从服务器实际看到地址为192.168.2.4的计算机为10.10.2.5,它转换了IP要显示的地址从其他具有该地址的计算机上,我想在具有Ubuntu或其他发行版的服务器上进行操作,iptables规则是什么?
很好的信息,谢谢你^ _ ^
下午好。
我在尝试重定向时遇到问题。 我解释:
我在Ubuntu中有一个代理服务器,带有2个网卡:
eth0 = 192.168.1.1已连接到本地网络的其余部分。
eth1 = 192.168.2.2已连接到路由器。
我需要通过eth0来通过eth1以及通过代理的所有内容(我使用Squid,其默认端口为3128),并且在IPTABLES配置中找不到密钥。
我不需要任何限制,只需要在访问的网址的日志中保留一条记录即可。
我希望您能为我提供帮助,因为这是一项繁琐的任务,困扰了我几天。
谢谢。
朋友,我是其他服务器的新手,我不知道,但是我了解这个主题,并且学得很快,我的问题是以下这些服务器中我有2台服务器serv_1和serv_2,它们已连接到同一Intranet。建立了owncloud之后,我要执行以下操作:
当放置对自己的云的访问ip(ipowncloud)时,一定范围的ip,例如rangeip_1被定向到serv_1,如果是另一个rangeip_2,则将相同的ipowncloud定向到serv_2,这是为了定位2个服务器在两个不同的城市中,IP范围不同,但是它们都在同一网络上,这将是第一部分,第二部分将是清楚的是同步这两个服务器,以便它们是镜像服务器,或者它们按顺序建议我优化带宽,请如果您要向我解释如何逐步进行操作,请不要使用超级程序员模式=(
您好,对不起,我有一个交换机负责构成我的网络的所有设备的通信,此后是防火墙,最后是Internet出口,发生了什么事,我想在交换机中进行重定向除非请求的服务是Internet,否则不必到达防火墙。
使用此方法可以将HTTPS重定向到HTTP吗?
嗨,也许有点晚了,但是我想问你,当我想连接到同一网络上的Web服务器时,我该如何使乌贼不修改客户端的IP?
不要因为问我而对我不好。 可以在Windows中完成吗?
这些信息对我很有用。 像往常一样,你们可以放心,当我找不到英语的东西时,我通常最终会用西班牙语看,在那种情况下,我几乎总是来这个网站,谢谢。
我有一个 4G 路由器,它是我不管理的网络的客户端(显然,我是客户端)……这个路由器是通过 OpenVPN 连接到该远程网络的网关。 此外,所述路由器还实现了端口转发功能,以访问现场这些子网之一的服务器的80端口。
这是我必须在路由器中作为防火墙自定义规则“-t nat -A POSTROUTING -j MASQUERADE”的声明
谢谢您的帮助!