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

Wireguard 路由问题

  •  
  •   Richardyyz · 2022-08-30 11:52:11 +08:00 · 5455 次点击
    这是一个创建于 850 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,目前我有三台电脑 A,B,C 分布在不同地方, A 和 B 电脑各自通过 wireguard 连接到 C,并且 A 和 B 能成功通讯。

    A =====> C <===== B

    我的目标是让 A 的流量全部由 B 转发出去。

    请问如何用 iptables 或者 nginx 等工具实现?

    27 条回复    2022-11-09 21:28:41 +08:00
    Damn
        1
    Damn  
       2022-08-30 12:04:30 +08:00
    跟我差不多,但我 ABC 互联,你要不要考虑一下?
    你可能是只有 C 有公网 ip ?
    如果 B 是锥形 nat 可以借助 C 打洞的。
    Damn
        2
    Damn  
       2022-08-30 12:07:00 +08:00
    如果一定要 A 通过 C 连接到 B 作为出口的话,在 C 的路由表上添加一条记录就行了。
    yorkyoung
        3
    yorkyoung  
       2022-08-30 12:33:24 +08:00
    如果没猜错你的意图的话 直接在 B 搭个 gost 服务端就能实现
    leonunix
        4
    leonunix  
       2022-08-30 12:35:07 +08:00
    C 上要开 2 个 wireguard 进程,就是要 2 个端口 A ,B 。
    A 连接 A allow 0.0.0.0/0
    B 连接 B allow 0.0.0.0/0
    然后 A 上加 0.0.0.0/0 路由表到 B 就可以了
    Richardyyz
        5
    Richardyyz  
    OP
       2022-08-30 13:10:03 +08:00
    @Damn 三台电脑都有公网 IP ,并且 ABC 目前都可以相互通信。能具体说说在 C 的路由表上加什么记录吗?感谢啦
    Richardyyz
        6
    Richardyyz  
    OP
       2022-08-30 13:15:05 +08:00
    @leonunix 需要两个 namespaces 吗?
    Damn
        7
    Damn  
       2022-08-30 14:38:01 +08:00 via iPhone
    @leonunix 你是 wg-go 么,不然 wg 工作在内核里的,只需要写配置文件,怎么会有进程呢。。。
    @Richardyyz 假设
    A 10.0.0.1/24 连接到 C allow 0.0.0.0/0
    B 10.0.0.2/24 连接到 C allow 10.0.0.0/24
    C 10.0.0.3/24 接受 AB allow 10.0.0.0/24
    C 添加路由表 10.0.0.1 mask 0.0.0.0 route 10.0.0.2 (意会即可,根据系统不同修改)
    Damn
        8
    Damn  
       2022-08-30 14:39:23 +08:00 via iPhone
    C 可能要改成 10.0.0.3/32
    allow 10.0.0.1/32 和 10.0.0.2/32
    joshu
        9
    joshu  
       2022-08-30 17:25:31 +08:00
    ip route add default via <link-ip-of-B-on-interface-between-C-and-B> dev <interface-between-C-and-B> table <table_id or table_name>
    ip rule add iif <interface-between-A and C> lookup <table_id or table_name> pref 50
    如果用 table_id ,那就用数字,如果用 table_name ,在 /etc/iproute2/rt_tables 加上一行数字和名称的对应关系
    如果是三层设备连接,可以不加 via XXX ,直接 dev XXX 就行

    也可以用 vrf 来实现,从而避免写 ip rule 规则
    yohole
        10
    yohole  
       2022-08-30 17:27:59 +08:00
    我印象中 wireguard 只解决内网或者穿透问题,但是流量转发需要单独搭建多一个服务才行
    leonunix
        11
    leonunix  
       2022-08-31 09:06:38 +08:00
    @Damn
    没说清楚。是开 2 个 interface wg0 wg1
    单个 interface 无法多个客户端同时 allow 0.0.0.0/0
    manfred4527
        12
    manfred4527  
       2022-08-31 10:20:45 +08:00
    首先 A 和 B 连接公网 C 后,A 和 B 是可以直接通信的,C 不开 NAT 出口。
    然后 A 和 B 直接再套娃点对点建立 VPN 行不?如 GRE-tunnel 之类的。
    Richardyyz
        13
    Richardyyz  
    OP
       2022-09-01 12:01:04 +08:00
    @leonunix A 点不能写路由表,只能在 C 点或者 B 点进行操作。请问有其他方法吗?
    Richardyyz
        14
    Richardyyz  
    OP
       2022-09-01 14:01:16 +08:00
    @joshu 请问这两行命令是写在 C 点上吗?
    Richardyyz
        15
    Richardyyz  
    OP
       2022-09-01 14:16:14 +08:00
    @Damn 刚才试了一下,最后在 C 点上尝试添加路由表,发现不能 mask 0.0.0.0 ,返回的是 Invalid Argument.

    我在 ubuntu 上尝试的命令:sudo route add -net 10.0.0.1 netmask 0.0.0.0 gw 10.0.40.2
    szdosar
        16
    szdosar  
       2022-09-02 13:56:36 +08:00
    跑个题,ABC 都有公网了,你何不直接在 B 安装个 v2r 代理服务端,然后 B 安装个 v2r 客户端实现?
    szdosar
        17
    szdosar  
       2022-09-02 14:51:34 +08:00
    跑个题,ABC 都有公网了,你何不直接在 B 安装个 v2r 代理服务端,然后 A 安装个 v2r 客户端实现?
    joshu
        18
    joshu  
       2022-09-02 18:00:38 +08:00 via Android
    darrh00
        19
    darrh00  
       2022-09-03 22:57:36 +08:00
    装个 tailscale 一切搞定,用节省出来的时间想想如何赚钱不好吗?
    Richardyyz
        20
    Richardyyz  
    OP
       2022-09-03 23:07:02 +08:00
    @darrh00 这里只想纯粹交流一下技术。而且我也不需要去想如何赚钱。
    ghostwwg
        21
    ghostwwg  
       2022-09-04 00:05:50 +08:00
    ABC 都有公网的话,网络模型就是蜂窝式的了,A 节点上 B 节点的路由宣告 0.0.0.0 ,A B 通讯和 C 没有关系了。如果是 C 网关模式的话,可以考虑 B 做个 http 代理,A 配置 http 代理也行。
    HawkinsSherpherd
        22
    HawkinsSherpherd  
       2022-09-04 00:47:59 +08:00
    这个静态路由就搞定了。
    C 上开两个 WG 接口,配两个网段的 IP 地址。
    A 上把默认路由指向 C ,B 上写静态路由把 A-C 互联的网段指向 C 。
    我就干过这种中转的事情。
    Richardyyz
        23
    Richardyyz  
    OP
       2022-09-04 00:51:18 +08:00
    @HawkinsSherpherd 请问能具体说一下吗?感谢啦
    Richardyyz
        24
    Richardyyz  
    OP
       2022-09-04 04:02:12 +08:00
    有偿征集具体方法哈 UmljaGFyZF9ZdXpoZW4=
    Richardyyz
        25
    Richardyyz  
    OP
       2022-09-04 08:29:53 +08:00
    综合楼上各位的建议,已经顺利解决问题了,感谢各位。
    tomychen
        26
    tomychen  
       2022-09-04 20:54:50 +08:00
    A 到 C 取到 10.0.0.2
    B 到 C 取到 10.0.0.254

    由于 B 和 C 已经同处 10.0.0.x 子网,所以在 B 上先打开转发 sysctl.conf

    iptables -t nat -A POSTROUTING -s 10.0.0.2/32 -j MASQUERADE

    A 网关调整为 10.0.0.254 或做静态路由
    zdf
        27
    zdf  
       2022-11-09 21:28:41 +08:00
    @Richardyyz 能请问一下具体最后是怎么解决的吗?谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   936 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:17 · PVG 05:17 · LAX 13:17 · JFK 16:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.