101

利用iptables目标重写巧妙变更遗留系统配置

 6 years ago
source link: https://zhuanlan.zhihu.com/p/31506567?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

利用iptables目标重写巧妙变更遗留系统配置

一个场景:

假设某组织的日常运营中有这样一种应用场景,在一台机器(1.1.1.1)上,运行着一个很古老的应用程序(APP),这个APP一直运行良好,虽然其配置极复杂但在最初配置成功后就再也不用修改了。经过漫长岁月,组织中已经没人知道该怎么修改该APP的配置了,也没人想修改它,因为不改的话它会一直正常运行,改的话万一出错了恢复不了怎么办。这样的APP称作“遗留系统”。

该APP会与另一台机器(2.2.2.2)通信,并为其提供某些服务。有一天,由于不可抗拒的原因,2.2.2.2的IP地址必须改变为3.3.3.3,那么,从该APP提供的服务立即就失效了。组织中需要有人勇敢的站出来,修改1.1.1.1上该APP的配置,需要将其原来指向2.2.2.2的配置选项改为指向3.3.3.3。

v2-ff5daac092a0533ea4c1ba96f3bd2b8c_720w.jpg

但是,十分悲催的是,检查发现该APP的配置选项中竟然没有任何2.2.2.2的信息,进一步确认得知,原来2.2.2.2是写死在APP的程序源代码中的,不可配置!这可怎么办?

一个巧妙的方法:

幸运的是,该APP运行在一台LINUX系统中,而LINUX的iptables防火墙可以很容易地在该APP外部修改其发出的报文的目的地址。从而,在不改变APP配置、不修改APP程序源代码的情况下,将该APP的流量从2.2.2.2改为指向3.3.3.3。具体的配置命令如下,执行即可生效:

iptables -t nat -A OUTPUT -d 2.2.2.2 -p tcp --dport 8888 -j DNAT --to-destination 3.3.3.3:8888

1.1.1.1上的APP运行在LINUX系统的用户态,它产生的流量通过SOCKET API经过LINUX内核态TCP/IP协议栈发出。iptables基于netfilter表链机制实现,它可以指示系统在nat表的OUTPUT链中将从本机发出的IP报文的目的地址进行重写修改。

iptables -t  nat       // 在nat表进行重写
         -A  OUTPUT    // 在OUTPUT链进行重写
         -d  2.2.2.2   // 2.2.2.2是重写前的旧IP地址 
         -p  tcp 
             --dport 8888
         -j  DNAT 
             --to-destination 3.3.3.3:8888 // 重写后目的地址改为3.3.3.3

就这样,IP地址重写只是iptables的一个小小功能,掌握iptables的各种用法及原理并灵活运用,会让生活充满惊喜~

Reference:

0. 老宋的独家号

1. The netfilter.org project

2. iptables(8) - Linux man page

注:本文为老宋原创文章,欢迎随意转载,有任何疑问前请至【知乎专栏-老宋的独家号】评论区讨论交流。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK