V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yingtl
V2EX  ›  宽带症候群

用 iptable 做这样的转发能实现么

  •  
  •   yingtl · 2018-08-08 09:00:40 +08:00 · 4180 次点击
    这是一个创建于 2081 天前的主题,其中的信息可能已经有所发展或是发生改变。
    三台机器 Client_1 VPS_1 VPS_2
    VPS_1 设置到达它的 PORT_A 数据 转发到 VPS_2:PORT_B, 但是不修改 src
    VPS_2:PORT_B 收到数据后 看到的数据包的 src 是 Client_1

    这种做法在公网上能实现么

    谢谢
    26 条回复    2019-02-08 11:15:09 +08:00
    trepwq
        1
    trepwq  
       2018-08-08 09:07:25 +08:00 via iPhone
    client-1 会丢弃 vps2 的 tcp 数据包的吧
    yingtl
        2
    yingtl  
    OP
       2018-08-08 09:09:54 +08:00
    @trepwq 用 UDP, 端口统统打开
    mt7620
        3
    mt7620  
       2018-08-08 09:10:32 +08:00 via Android
    prerouting 做 DNAT 试试
    mt7620
        4
    mt7620  
       2018-08-08 09:15:35 +08:00 via Android
    VPS1 上开来一个
    iptables -t nat -A PREROUTING -p tcp --dport 12306 -j DNAT --to-destination 222.222.222.222:12315
    oott123
        5
    oott123  
       2018-08-08 09:17:23 +08:00 via Android
    听说很多机房防火墙会丢掉 src 不对的包。
    dorothyREN
        6
    dorothyREN  
       2018-08-08 09:17:49 +08:00
    这。。。随便写个转发就行了吧
    ThirdFlame
        7
    ThirdFlame  
       2018-08-08 09:25:23 +08:00
    这不就是 目的地址转换么?
    yingtl
        8
    yingtl  
    OP
       2018-08-08 09:51:24 +08:00
    @mt7620 我这里试验的是还要加一条 SNAT 不然数据到达不了, 如同 @oott123 所讲, 某个环节过滤掉了
    ivyliner
        9
    ivyliner  
       2018-08-08 10:21:40 +08:00
    如果 VPS_2 可以直接访问 Client 的话, 可以直接添加路由表就好了.
    ShadowStar
        10
    ShadowStar  
       2018-08-08 10:41:11 +08:00
    和 TCP/UDP 无关,和什么机房的防火墙也无关。
    对于 Client 来说,发送的五元组信息是 Client_1:Rand_Port -> VPS_1:Port_A,接收到的五元组信息是 VPS_2:Port_B -> Client_1:Rand_Port,socket 根本对不上。
    LGA1150
        11
    LGA1150  
       2018-08-08 11:14:51 +08:00 via Android
    @oott123 正解
    @ShadowStar 其实 Client 端也可以 DNAT
    yingtl
        12
    yingtl  
    OP
       2018-08-08 12:13:57 +08:00
    @ShadowStar UDP 监听的话就不用在乎这个了
    Austing
        13
    Austing  
       2018-08-09 03:15:28 +08:00   ❤️ 1
    @ShadowStar
    @yingtl
    和发送回复对不对的上以及 UDP 无关.
    了解一下 BCP 38/RFC 2827.
    如果 VPS_A 直接 DNAT 到 VPS_B 不不改变 SRC, 那么理论上就是伪造发送源进行 IP 欺骗, 99% 的 VPS 都不可能没开启 uRPF 和 ACL 来防止伪造的.
    并且很多不是自有 transit 的服务商在其上游就已经被开启了 uRPF, 你可以直接在 VPS_A 尝试用 client 或其他任意 IP 直接向 B/其他服务器发包看一下, 然后接受 server tcpdump 抓包一下, 我相信对面是根本收不到的.
    Austing
        14
    Austing  
       2018-08-09 03:18:17 +08:00   ❤️ 1
    如果你想做到不改变发送源, 那你可以在 VPS_A 和 VPS_B 之间另外建立一条隧道来实现.
    纯公网基本不太可能, 如果你不缺钱, 那你可以找没有开 uRPF 的机房或者自己买条 transit 做 bgp 吧 :)
    ShadowStar
        15
    ShadowStar  
       2018-08-09 04:26:56 +08:00
    @yingtl 胡扯,你以为 UDP 就不需要 IP 了?
    ShadowStar
        16
    ShadowStar  
       2018-08-09 04:28:20 +08:00
    @Austing 你说的这些都是外围的安全防护措施,当然可以有各种的方式。
    我说的是最基础的 TCP/IP 通信基础,在什么防护措施都没有的情况下,本身就无法双向通信。
    Austing
        17
    Austing  
       2018-08-09 06:22:33 +08:00
    @ShadowStar 双向无法通信的前提是, 只是在客户端不进行任何操作的前提下, 当然无法通信, 你大可客户端 hook 再进行一次包修改.
    没有任何问题, 而且使用情况也很多, 各大云的 LB 几乎全是如此.
    yingtl
        18
    yingtl  
    OP
       2018-08-09 08:04:33 +08:00
    @Austing #13 早先的时候是用用户态程序做的转发, 包前面再加了个地址. 现在换成了 IPIP 隧道
    yingtl
        19
    yingtl  
    OP
       2018-08-09 08:10:09 +08:00
    @Austing #12 题外话, 伪造源的话, 如果伪造的是相同机房的可以发出去么, 这些 VPS 商家的构架有防止这种情况么
    Austing
        20
    Austing  
       2018-08-09 08:58:57 +08:00   ❤️ 2
    @yingtl 一般来讲是不行的, 因为一般 VPS 服务商是在宿主机就过滤, 现在 VPS 商家常用的 solusvm openstack 之类的默认防止欺骗什么的都是最基本的- -
    如果它是租用的其他服务商的服务器, 那么他的上游服务商很可能也会有过滤.
    所以很多时候可能会有很多层的...
    不过你可以自己试试啊, 随便用 hping 什么的发包然后抓包看看, 能收到就是能发呗.
    但是你要是同机房同网络的话, IPIP 隧道正常应该也没多少性能衰减吧.
    yingtl
        21
    yingtl  
    OP
       2018-08-09 12:27:00 +08:00
    @Austing #17 谢谢。我想到的用法是用来骗墙的,现在不都是封回程数据包么,如果伪装 src 数据不就能回去了么。
    ShadowStar
        22
    ShadowStar  
       2018-08-09 15:08:49 +08:00
    @Austing 再 Hook 修改一次?
    按照题主的描述,Client_1 是如何得知自己访问 VPS_1:PORT_A 的链接实际访问的是 VPS_2:PORT_B 的呢?
    Client_1 只是看到了一个 VPS_2:PORT_B 访问自己的报文,凭什么修改啊?

    VPS_2 也无法得知 Client_1 的报文是从 VPS_1:PORT_A 修改过的啊。
    VPS_2 也只是看到了 Client_1 访问自己的报文。

    你所说的 Hook 修改,要不就是访问是完全固定的,只存在 3 台主机,并且关系固定;要不就需要另外的实时消息通知机制。
    Austing
        23
    Austing  
       2018-08-10 08:00:12 +08:00
    @ShadowStar
    您真的了解 TCP/IP 和 netfilter?

    没有任何操作的下 Client_1 和 VPS_2 当然不知道, 但是这和我说的有什么关系吗?

    题主所说的不就是三台主机的固定关系? 即便不固定, Client 的处理也不会说只能针对一个地址.
    即便不针对地址, 同样可以 connmark 一个特定状态或者数据包标识来标记用来匹配.


    @yingtl 如果可以伪装 src 确实可以达到此目的, 但是你要想要比较满意的达到这个目的, 成本不会亚于你多买几台机器的.
    yingtl
        24
    yingtl  
    OP
       2018-08-10 09:03:03 +08:00
    @Austing #19 代码改起来是非常简单的, 就是把发送的部分改成用 raw socket 发送, 自己加上伪造的 ip 头.
    问题是按照你说的常见的 vps 构架都过滤这种情况了
    ShadowStar
        25
    ShadowStar  
       2018-08-10 10:32:12 +08:00
    @Austing 10 年前我就是做某国产防火墙的内核开发的,用的就是 Linux 的 netfilter 基础,写的就是 netfilter 模块,当时用的内核版本还是 2.6.24 呢。
    目前,我是做 Cavium 平台数据通信安全产品的底层开发。天天写代码玩的就是网络数据。

    connmark 的前提是要双向命中相同的 conntrack,按照正向 Client_1:Rand_Port -> VPS_1:Port_A ;反向 VPS_2:Port_B -> Client_1:Rand_Port 这个会话,在 Client_1 上根本命中不了同一个 conntrack !
    Themyth
        26
    Themyth  
       2019-02-08 11:15:09 +08:00
    无意中看到这个,我大概知道楼主想干什么
    楼主是不是想在强 内发送数据包出去,用一台 VPS 勾住然后伪造 src port 发到强 外?

    Client_1:Rand_Port -> VPS_1:Port_A ;返程 VPS_2:Port_B -> Client_1:Rand_Port 是肯定不行的。
    但是 Client_1:Rand_Port -> VPS_1:Port_A ;返程 VPS_2:Port_A -> Client_1:Rand_Port 是可行的。

    可行的前提是,你的那台返回数据的 VPS,必须加白名单,这个难度相当大,从最开始的服务商,到机房,到上游运营商都允许才行,成本很高,我以前的解决方案是购买自己的 ASN 和 IP space,然后和机房做 bgp session。

    如果有兴趣,我们可以交流
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1242 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:49 · PVG 01:49 · LAX 10:49 · JFK 13:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.