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

请教 iptables 纯 跳板 的配置方式

  •  1
     
  •   drlittlemouse · 2015-10-20 20:28:51 +08:00 · 4852 次点击
    这是一个创建于 3324 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设客户端 A 为拨号上网 IP 不固定
    B 为固定 IP 跳板 222.222.222.222
    C 为固定 IP 目标主机 111.111.111.111

    场景 1 :
    无跳板连接要求是 A 直连 C 的 80 端口
    有跳板后的要求是 A 连接 B 的 8080 端口, B 转发至 C 的 80 端口
    请问 iptables 规则的写法?

    场景 2 :
    无跳板连接要求是 A 直连 C 的 80 端口
    有跳板后的要求是 A 连接 B 的 8080 端口, B 转发至 C 的 9000 - 10000 随机端口(--random )

    今天看了好久的 SNAT 和 DNAT ,目前智商已经超载坏了...

    第 1 条附言  ·  2015-10-21 15:55:24 +08:00
    感谢楼下提供的文章
    https://xuzhenglun.github.io/2015/02/05/Shadowsocks-relay-based-on-Azure/

    我的应用场景和 SS-Relay 类似,上面文章并未提及负载均衡的用法,但是参考一下并不难,只是替换成多端口就好。
    13 条回复    2015-10-25 07:22:02 +08:00
    smileawei
        1
    smileawei  
       2015-10-20 20:42:16 +08:00
    如果是 tcp 用 haproxy 就可以。
    drlittlemouse
        2
    drlittlemouse  
    OP
       2015-10-20 20:42:42 +08:00
    @smileawei TCP 和 UDP 都需要
    hebwjb
        3
    hebwjb  
       2015-10-20 20:45:36 +08:00
    -A PREROUTING -i eth0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 111.111.111.111:80
    drlittlemouse
        4
    drlittlemouse  
    OP
       2015-10-20 20:46:06 +08:00
    @hebwjb 只这一条不行吧?
    chinawrj
        5
    chinawrj  
       2015-10-20 20:49:30 +08:00 via Android
    DNAT 搞不定这个事情,因为包的返回路由有问题。当然可以配合搞随机选择端口。 iptables+ haproxy 可以。或者 socat
    GPU
        6
    GPU  
       2015-10-20 20:52:49 +08:00
    @drlittlemouse


    @hebwjb 這條可以 .加一條 MASQUERADE 到 POSTROUTING
    Reficul
        7
    Reficul  
       2015-10-20 21:02:58 +08:00   ❤️ 1
    ryd994
        8
    ryd994  
       2015-10-20 22:01:57 +08:00   ❤️ 2
    SNAT DNAT 成对用就好了啊
    PREROUTING 如果 dst 为本机, DNAT 到目标站
    POSTROUTING 如果 dst 为目标站, SNAT 到本机
    总之最后的结果是 src 是本机, dst 是目标站,返回包不用考虑,会自动改回来的。
    看着这张图你就明白了 https://erlerobotics.gitbooks.io/erle-robotics-introduction-to-linux-networking/content/security/img9/iptables.gif
    记得开 ip_forwarding
    drlittlemouse
        9
    drlittlemouse  
    OP
       2015-10-21 15:54:01 +08:00
    @Reficul 您提供的文章中有一个 SS-Relay 和我的应用场景类似,配置后已经可用。

    总结一下,其实之前对 SNAT 和 DNAT 的理解并没有错, iptables 规则只要关心单向组装流程即可,会包实际上会被自动 UN-SNAT 和 UN-DNAT 。
    chinawrj
        10
    chinawrj  
       2015-10-24 21:10:14 +08:00 via Android
    @ryd994 回包不考虑是因为 B 利器默认路由是 A 机器。
    ryd994
        11
    ryd994  
       2015-10-25 01:42:18 +08:00
    @chinawrj 还是要考虑的吧,就算是默认路由,如果 ip 包的目标不是自己的话,就会转发出去了
    chinawrj
        12
    chinawrj  
       2015-10-25 07:16:58 +08:00 via Android
    @ryd994 你说的是不用考虑,原话:"如果 dst 为本机, DNAT 到目标站
    POSTROUTING 如果 dst 为目标站, SNAT 到本机
    总之最后的结果是 src 是本机, dst 是目标站,返回包不用考虑,会自动改回来的。 "

    楼主的这个 case 下,如果 B 也是公网机器的话是不能简单使用 DNAT 的,因为客户端连接 A ,然后 A 转发给 B 。使用 DNAT ,则 B 收到包的源地址是客户端,这个没错。但是 B 回复客户端的时候,因为 B 是公网机器不是我们普通的内网以 A 为默认网关的机器,因此包的源地址却变成了 B 且直接发送给 A ,这就造成客户端收到了来自 B 的包,但是其实客户端之前发送的包的目标地址是 A 而不是 B 。在 TCP 协议的情况下, B 回复的包会被直接丢掉。
    ryd994
        13
    ryd994  
       2015-10-25 07:22:02 +08:00 via Android   ❤️ 1
    @chinawrj 我说了要 SNAT DNAT 配对使用啊……
    SNAT 就可以了啊
    我说自动改回来是 B 回复 A 的时候, A 会把 DST 改回成客户地址
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1213 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:19 · PVG 07:19 · LAX 15:19 · JFK 18:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.