V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
evansfix
V2EX  ›  Linux

iptables 的转发问题

  •  
  •   evansfix · 2018-12-21 13:48:13 +08:00 · 3149 次点击
    这是一个创建于 2159 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在有一台国内的服务器,但是因为某些问题,禁止国际网络了(攻击太多),然后现在导致无法连接到 s?eam 的服务器,但是使用 iptables 作为转发是可以连接上去,服务端上显示的 ip 是 iptables 的那个 IP,所以我想求助一下 iptables 如何只进行包转发,而不改变来源 IP ?
    可能话说的比较多,但是简易演示如下:
    A 服务器:1.1.1.1
    B 服务器:2.2.2.2
    C 服务器:国外

    由于 A 服务器 无法连接到 C 服务器,所以想利用 B 服务器进行中转一下,连接到 C 服务器。
    目前是 A 可以通过 B 连接到 C,但是 C 上显示的是 B 的服务器 IP,我想 B 上面以 A 的 IP 进行中转。C 服务器获得的 IP 不是 B 的服务器 IP。请问有方法吗?
    14 条回复    2018-12-22 11:44:03 +08:00
    likuku
        1
    likuku  
       2018-12-21 14:16:34 +08:00 via iPhone
    不作地址转换,那么只开启包转发这也是可以实现,只是也有条件的,以下建议基于一些之前类似的实践,建议你先在试验环境测试:

    条件:
    A 和 B 可顺利双向收发数据,
    B 和 C 可顺利通讯,
    A 可以收到 C 发来的数据(很重要)

    作法:
    B 开启 网络转发功能( ip_forwarding = 1,防火墙可关闭,或者针对 A C 都双向放行)

    A 机上 route 指令 /网卡配置 增加一些路由策略:
    目标是 C 网段 /IP 的 下一跳 gw 是 B 的 ip

    如此,B 会收到 A 发来目标是 C 的包转给 C,
    C 收到后,因为来源是 A,则响应 /反馈 直接发给 A
    dbw9580
        2
    dbw9580  
       2018-12-21 14:20:09 +08:00 via Android
    你这是 ip spoofing,很可能出不了运营商的网络
    evansfix
        3
    evansfix  
    OP
       2018-12-21 14:37:09 +08:00
    @likuku 感谢您的回复,A 无法直接连接至 C,但是通过 B 可以。所以我想中转一下,但是不修改来源 IP,
    目前的情况是 C 点收到的 IP 是 2.2.2.2 (也就是 B 的 IP ) ,但是我没办法让他收到的 IP 是 1.1.1.1 ( A 的 IP )
    (A 和 B 我都有直接管理权限,C 点只作为收),所以想在 B 上做一个转发,让 A 通过 B 连接到 C,C 得到的 IP 是 A 的 IP 即可。


    @dbw9580 您好,我也测试过了,可以访问.但是无法被提交至 s?eam 的服务器,因为获取的 public 的 IP 是 B 的 IP。
    mason961125
        4
    mason961125  
       2018-12-21 14:49:42 +08:00 via iPhone
    不可能实现,首先你这是 NAT,如果在 B 上把源 IP 改为 A 的 IP,那么回程路径就不会经过 B。
    mason961125
        5
    mason961125  
       2018-12-21 14:51:50 +08:00 via iPhone
    建议补一下 路由&交换 知识
    evansfix
        6
    evansfix  
    OP
       2018-12-21 14:56:25 +08:00
    @mason961125 也可以试试,在 iptables 上我没找到修改源的东西,请问有例子吗?
    mason961125
        7
    mason961125  
       2018-12-21 14:57:33 +08:00 via iPhone   ❤️ 1
    @evansfix mangle 链专门用于修改包信息
    likuku
        8
    likuku  
       2018-12-21 15:47:36 +08:00
    @evansfix 如此这般,那不能实现。

    C 机收到了“来自 A ” 的请求,当然是发回给 A 了,
    C 它不会发回给 B 的,除非 B 就是 C 的 默认路由 /默认网关,
    或者 你能控制 C 机,增加一条 目的到 A 的数据包 就发给 B
    likuku
        9
    likuku  
       2018-12-21 15:50:18 +08:00
    web 服务里,proxy 和 后段 web server 的确是可以做到这种需求,
    但是,这得对中转 proxy 和 web server 都有特别设定才行,
    假若是你这个例子,那么就是 B, C 都必须你自己掌控才可。
    lieh222
        10
    lieh222  
       2018-12-21 17:22:21 +08:00
    A 在 nat 表的 output 链做 dnat 到 B,B 再 DNAT 到 C,这时候 C 获得的地址是 A 的地址,所以回应的时候直接回到 A 去了,中间如果没有干扰应该可以通信,有干扰就没辙了,除非你能控制 C 服务器,让它把应该发往 A 的包转发到 B 上去
    julyclyde
        11
    julyclyde  
       2018-12-21 17:54:24 +08:00
    首先,iptables 不负责转发
    你先理解完这一句再重新提问吧
    LGA1150
        12
    LGA1150  
       2018-12-21 19:45:10 +08:00 via Android
    VPN
    sunznx
        13
    sunznx  
       2018-12-21 20:54:41 +08:00
    在 1 楼的基础上,在 B 上加个 SNAT 应该可行
    azh7138m
        14
    azh7138m  
       2018-12-22 11:44:03 +08:00 via Android
    @likuku 楼主这个是 B 做一个路由器,还是在公网上面的,这就有点尴尬了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:15 · PVG 14:15 · LAX 22:15 · JFK 01:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.