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

wireguard+iptables 怎么实现把一个端口流量保持来源 IP 全部转发到另一个服务器上?

  •  
  •   edis0n0 · 2023-01-19 21:41:53 +08:00 · 2797 次点击
    这是一个创建于 684 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一台服务器经常被 DDoS 攻击,前置加了一台高防服务器(原服务器只能换 IP ,没办法直接上高防,程序已经十几年没人维护了不敢迁移),用 Nginx 反代,但这样 IP 全变成反代服务器 IP 了,试了改请求头 XFF 之类的方法全部无效,说明程序没有适配,不要再提这样的建议了。现在在尝试用 wireguard+iptables 来转发流量,但我非科班没学过一点网络(属于自家路由器都不会配,宽带师傅装完路由器后台都不敢进,怕我碰一下网就炸了的那种),看了一下午文档还没解决,求个 iptables 规则。
    14 条回复    2023-01-20 16:08:00 +08:00
    iseki
        1
    iseki  
       2023-01-19 22:07:26 +08:00
    为什么要用 wireguard 呢,仅供参考,自己测试好再上,默认不做 masquerade 就不会动源 IP:
    iptables -L PREROUTING -t nat -p tcp --dport -j DNAT --to-destination 10.0.0.1:1234
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iseki
        2
    iseki  
       2023-01-19 22:07:48 +08:00
    -L -> -I (手滑了
    edis0n0
        3
    edis0n0  
    OP
       2023-01-19 22:07:48 +08:00
    试过在反代服务器配 iptables -t nat -A PREROUTING -p tcp -d 10.0.0.20 --dport 80 -j DNAT --to-destination 10.0.0.1:80
    然后反代服务器直接失联了,重启才恢复
    iseki
        4
    iseki  
       2023-01-19 22:09:16 +08:00
    @edis0n0 🤣我端口转发一直这么干,没出啥问题,不知道你那边咋了
    iseki
        5
    iseki  
       2023-01-19 22:10:23 +08:00
    不对啊,你这样改完,你不动源 IP ,数据回不去了嘛
    edis0n0
        6
    edis0n0  
    OP
       2023-01-19 22:10:27 +08:00
    @iseki #1 如果公网直接这样转发也不会动来源 IP 会不会导致来源 IP 可以随意伪造?
    iseki
        7
    iseki  
       2023-01-19 22:11:23 +08:00
    @edis0n0 来源 IP 本来就可以随便伪造,而且你不动源 IP 应该是不行的,数据回不去了啊
    SAGAN
        8
    SAGAN  
       2023-01-19 22:12:51 +08:00   ❤️ 2
    理论上应该可以做到吧。需要用到 wireguard 隧道,否则回程的流量源服务器会直接发送给客户端,然后被客户端丢弃。

    假设反代(eth0: 1.2.3.4, wg0: 10.0.0.1/24) <--> 源(eth0: 2.3.4.5, wg0: 10.0.0.2/24)。服务运行在 tcp/80 端口。

    首先两台服务器都需要打开 ipv4 forward (net.ipv4.ip_forward=1)

    反代:
    iptables -t mangle -A PREROUTING -p tcp --dport 80 -m mark --set-mark 0x1/0x1 -j ACCEPT
    iptables -t nat -A PREROUTING -m mark --mark 0x1/0x1 -j DNAT --to 2.3.4.5
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    ip rule add fwmark 0x1/0x1 table 10
    ip route add default via 10.0.0.1 table 10

    源:
    iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
    iptables -t mangle -A PREROUTING -p tcp --dport 80 -m mark --set-mark 0x1/0x1 -j ACCEPT
    iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
    ip rule add fwmark 0x1/0x1 table 10
    ip route add default via 10.0.0.2 table 10
    edis0n0
        9
    edis0n0  
    OP
       2023-01-19 22:13:24 +08:00
    @iseki #5 可能是别的规则导致的失联,下午瞎折腾加了十几条 iptables 规则,又试了下#1 这个规则,tcpdump 没抓到任何的包,不知道为什么没转发过去
    iseki
        10
    iseki  
       2023-01-19 22:13:58 +08:00
    唔,原来是为了这个才上 wireguard 啊
    terrytw
        11
    terrytw  
       2023-01-19 22:14:53 +08:00
    DNAT 和 SNAT 要配套使用吧
    瞄了一眼 openwrt LUCI 里加的规则,SNAT+DNAT
    defunct9
        13
    defunct9  
       2023-01-20 14:27:42 +08:00
    开 ssh ,让我上去看看
    pagxir
        14
    pagxir  
       2023-01-20 16:08:00 +08:00 via Android
    建议使用 ipsec 传输模式,这样 app 层就可以正常看到 IP 头,并且不影响路由
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1193 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:13 · PVG 07:13 · LAX 15:13 · JFK 18:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.