如何主动修改所有的出站 ACK 包的源 ip?

2017-01-27 10:09:27 +08:00
 eastpiger

需求目标:服务器已经配置了一个内网 ip ,假设是 1.1.1.1 ,同时还分配了一个公网 ip2.2.2.2,我想实现的效果是:无论什么样的请求到服务器,其 ACK 包的源 ip 全部修改为公网 ip2.2.2.2 。

尝试过在 iptables 的 POSTROUTING 中 SNAT 出站包并修改 ip ,但是实测这样只能修改本机主动发出的包,而对收到的请求的回复( ACK)包没有效果。

不知道有没有哪位有可行方向的建议?

3606 次点击
所在节点    问与答
22 条回复
lhbc
2017-01-27 10:19:20 +08:00
删掉内网 IP
eastpiger
2017-01-27 10:26:21 +08:00
@lhbc #1 ACK 包的请求来源来自于内网 ip ,就这么删了肯定是要出问题的。。。
lcdtyph
2017-01-27 10:43:30 +08:00
你的意思是修改 tcp 的第二个包的源 ip 么?
可是这么做没有任何意义啊,如果第二个包回应用的是内网 ip ,说明第一个 SYN 包的目的地址就是内网 ip ,你强行改成公网 ip 回应让客户端怎么应答啊= =
treo
2017-01-27 10:49:18 +08:00
@lcdtyph 对方不会应答,直接 drop
lcdtyph
2017-01-27 10:52:05 +08:00
@treo 所以我觉得 lz 的目的没啥意义嘛,如果他不想让别人用内网 ip 连接服务器就直接把目的地址是内网 ip 的包 reject 掉好了= =||
eastpiger
2017-01-27 11:04:46 +08:00
@lcdtyph #5 是这样的,我们的上级路由指向我的公网 ip 映射的时候没有做回源,于是产生了这样的情况:

内网 1.1.1.2 访问公网 2.2.2.2 ,发到路由器,路由器执行 DNAT 改为 1.1.1.2 发往 1.1.1.1 ,

服务器收到消息,发送第二次握手,从 1.1.1.1 发往 1.1.1.2 ,客户端 DROP

而我这样修改了源 ip 之后就变成了:

服务器收到消息,发送第二次握手,从 1.1.1.1 发往 1.1.1.2 ,被我强制修改为 2.2.2.2 发往 1.1.1.2 ,客户端发回 ACK ,建立连接。
msg7086
2017-01-27 11:08:54 +08:00
为啥不是被路由器 DROP ?
eastpiger
2017-01-27 11:09:05 +08:00
@lcdtyph #3 严格来说,我不仅想修改 SYN/ACK 包,我还想修改掉所有的 ACK 包,也就是这个服务器以后对外的联络全部都用公网 ip 的身份实现(以解决路由那边不做 SNAT 只做 DNAT 的问题),但是收到消息却都是从内网 ip 收到的(这一部分我改不了,上游路由也改不了)

这样服务器的网站以后再内网用内网 ip 就访问不了了,原因正如您所说的那样。但是好处在于我们的公网 ip 无论在公网还是在内网都能访问了。这样我 DNS 好歹能正常 work 。算是至少能用的一种方案吧
jasontse
2017-01-27 11:10:15 +08:00
1.1.1.1: mdzz 2.2.2.2 我没找你啊

连接建立失败
eastpiger
2017-01-27 11:12:54 +08:00
@jasontse #9 1.1.1.1 就是 2.2.2.2 、你确定没理解错么?

是 1.1.1.2 连接 2.2.2.2 ,被路由修改为 1.1.1.2 连接 1.1.1.2 ,然后服务器收到回复 1.1.1.1 到 1.1.1.2 ,被我改成 2.2.2.2 回复 1.1.1.2 ,建立连接成功。
lcdtyph
2017-01-27 11:16:14 +08:00
@eastpiger 抱歉没有网络拓扑图我好像没太看懂您的描述……
eastpiger
2017-01-27 11:19:24 +08:00
@lcdtyph #11
eastpiger
2017-01-27 11:21:26 +08:00
@lcdtyph #11 我希望强行修改后实现这样的效果:(红框这里)

gulucn
2017-01-27 11:29:28 +08:00
感觉你想的东西跟 http://m.chinabyte.com/soft/25/13169025_m.shtml 里面的第三种负载均衡方法相似
lcdtyph
2017-01-27 11:42:26 +08:00
@eastpiger 抱歉……才疏学浅,没想到什么办法
realityone
2017-01-27 13:28:13 +08:00
在 PREROUTING 里再加一条 DNAT 到 2.2.2.2 呢?
eastpiger
2017-01-27 13:50:14 +08:00
@realityone 这个倒是没试过。。可是这个有什么关系么?出站的时候是 MAS 改成网卡 ip 了吧
zhjits
2017-01-28 00:46:38 +08:00
你这样改了以后包首先会被你的出口路由器干掉
yankebupt
2017-01-28 01:43:25 +08:00
在服务器本机上拦截所有入站到 1.1.1.1 包并真的把他们发到 2.2.2.2 不知道可行不(相当于 cancel 掉了路由对于之前目标地址的修改)(前提你的服务程序能绑定 2.2.2.2 )因为看别人好像这么干过……如果做不到,估计你需要更新一下拓扑图说明一下或者说明一下为什么不能绑定 2.2.2.2 的原因了…(或者说明一下我的做法的错误之处…毕竟不是专业的)
yankebupt
2017-01-28 01:46:01 +08:00
@realityone 忘了看,上面好像有人说过了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/337112

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX