用 iptable 做这样的转发能实现么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yingtl
V2EX    宽带症候群

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

  •  
  •   yingtl 2018-08-08 09:00:40 +08:00 4766 次点击
    这是一个创建于 2636 天前的主题,其中的信息可能已经有所发展或是发生改变。
    三台机器 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
    这不就是 目的地址转换么?
        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     Solana     937 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 18:34 PVG 02:34 LAX 11:34 JFK 14:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86