通过 Wireguard 构建 NAT-to-NAT网络互联

2023-10-09 14:20

本文主要是介绍通过 Wireguard 构建 NAT-to-NAT网络互联,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1 我的实现
    • 2 nat to nat 场景下 openvpn vs wireguard 架构
    • 3 实验
      • 3.1 gateway 配置
      • 3.2 NAT-A 配置
      • 3.3 NAT-D 配置
      • 3.4 NAT-C 配置
      • 3.5 gateway 添加 peer
      • 3.6 连接测试
      • 3.7 共享 NAT
    • 4 日常使用
    • 5 总结
    • 6 最后

1 我的实现

我在使用wireguard搭建lan-to-lan的vpn网络中(office-to-阿里云),发现阿里云在这方面做了限制,只能使用pc-to-lan(pc-to-阿里云),故想用nat的方式模拟pc-to-lan,故搜到了下面这篇文章。

下面这篇文章它在每一端都是用了nat,这并不是我需要的,我只需要在office端使用nat,所以:

  • 阿里云端:即gateway 配置中删除了PostUpPostDown项(阿里云端保持使用一般模式)

  • office端:即NAT-A|B|C 配置中修改-o eth0 -j MASQUERADE-o %i -j MASQUERADE(%i代表wg网卡,我与下文的nat方向是相反的)
    这样:

    PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o %i -j MASQUERADE
    

这样office端局域网的用户就可以访问阿里云端所有的服务器了(你需要在你的office端局域网及阿里云端vpc上定义相关路由信息),但是这样难以审计到底是哪台pc访问了服务器(阿里云很讨厌,一定是为了卖自己的vpn网关,不允许自己造)

当然,你也可以在所有节点的wireguard配置文件中全部删除PostUpPostDown项,使用centos 7中的firewalld.service开启nat,方法如下:

  • office端运行以下命令:

    # 参考
    # CentOS 7 as NAT Gateway for Private Network
    # https://blog.redbranch.net/2015/07/30/centos-7-as-nat-gateway-for-private-network/## 清除所有规则
    rm -f /etc/firewalld/zones/*
    systemctl restart firewalld.service## 开启转发
    sysctl -a | grep ip_forward## 开启nat模式
    firewall-cmd --zone=external --add-interface=wg4  --permanent
    firewall-cmd --zone=internal --add-interface=eth0  --permanent
    firewall-cmd --zone=external --add-masquerade  --permanent
    firewall-cmd --complete-reload
    

原文链接:https://anyisalin.github.io/2018/11/21/fast-flexible-nat-to-nat-vpn-wireguard/

原文内容如下:

Posted on 2018-11-21 |

Symbols count in article: 4.4k | Reading time ≈ 0:04

WireGuard ®是一种非常简单而现代,快捷的VPN,利用最先进的加密技术。它比IPSec 更快,更简单,更精简,更有用。它比OpenVPN更高效。WireGuard设计为通用VPN,适用于多种不同情况。它是跨平台的,可大规模部署。它已经被认为是业内最安全,最易于使用,最简单的VPN解决方案。

2 nat to nat 场景下 openvpn vs wireguard 架构

传统 vpn 在很难做到类似多个 nat 之间资源共享

客户端如果想要同时访问多个 nat 只能像图中的 NAT C 客户端一样连接两个 vpn

openvpn

得益于 wireguard 中没有 client/server 的概念,所有 nat 中的某台机器与 gateway 主机建立连接,即可实现共享所有节点的网络资源

wireguard

3 实验

实验环境如下,Peer 指的是每个 wireguard 节点的出口网卡,类似 openvpn 连接生成的 tunnel 网卡

image-20181121164048431

安装 wireguard 参考 https://www.wireguard.com/install/

确保需要共享 nat 的 wireguard 节点 ip 转发已开启

sysctl -w net.ipv4.ip_forward=1

3.1 gateway 配置

$ cd /etc/wireguard$ wg genkey | tee privatekey | wg pubkey > publickey$ cat > wg0.conf <<EOF
[Interface]
ListenPort = 12000
Address = 5.5.5.1/24
PrivateKey = ${GATEWAY_SERVER_PRIVATE_KEY}
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF$ wg-quick up wg0

3.2 NAT-A 配置

$ cd /etc/wireguard$ wg genkey | tee privatekey | wg pubkey > publickey$ cat > wg0.conf <<EOF
[Interface]
Address = 5.5.5.4/24
PrivateKey = ${NAT_A_PRIVATE_KEY}
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE[Peer]
PublicKey = ${GATEWAY_SERVER_PUBLIC_KEY}
AllowedIPs =  5.5.5.0/24
Endpoint = ${GATEWAY_SERVER:12000}
PersistentKeepalive = 10
EOF$ wg-quick up wg0

3.3 NAT-D 配置

$ cd /etc/wireguard$ wg genkey | tee privatekey | wg pubkey > publickey$ cat > wg0.conf <<EOF
[Interface]
Address = 5.5.5.2/24
PrivateKey = ${NAT_D_PRIVATE_KEY}
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE[Peer]
PublicKey = ${GATEWAY_SERVER_PUBLIC_KEY}
AllowedIPs =  5.5.5.0/24
Endpoint = ${GATEWAY_SERVER:12000}
PersistentKeepalive = 10
EOF$ wg-quick up wg0

3.4 NAT-C 配置

$ cd /etc/wireguard$ wg genkey | tee privatekey | wg pubkey > publickey$ cat > wg0.conf <<EOF
[Interface]
Address = 5.5.5.3/24
PrivateKey = ${NAT_C_PRIVATE_KEY}
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE[Peer]
PublicKey = ${GATEWAY_SERVER_PUBLIC_KEY}
AllowedIPs =  5.5.5.0/24
Endpoint = ${GATEWAY_SERVER:12000}
PersistentKeepalive = 10
EOF$ wg-quick up wg0

3.5 gateway 添加 peer

在所有的 wireguard 节点配置好之后,要在 gateway 节点添加 peer 的信息

$ cd /etc/wireguard$ cat >> wg0.conf <<EOF
[Peer]
PublicKey = ${NAT_A_PUBLIC_KEY}
AllowedIPs = 5.5.5.4/32[Peer]
PublicKey = ${NAT_C_PUBLIC_KEY}
AllowedIPs = 5.5.5.3/32[Peer]
PublicKey = ${NAT_D_PUBLIC_KEY}
AllowedIPs = 5.5.5.2/32$ wg-quick down wg0 && wg-quick up wg0

3.6 连接测试

现在所有节点的 5.5.5.0/24 网段已经建立了连接,在任意 wireguard 节点都应该能够 ping 通以下 IP

  • 5.5.5.1
  • 5.5.5.2
  • 5.5.5.3
  • 5.5.5.4

3.7 共享 NAT

连接测试成功之后就可以共享 wireguard 节点的所在的网络了

wireguard 配置文件中 Peer.AllowedIPs 实际上就是在当前节点上加多条静态路由

ip route add 5.5.5.2/32 dev wg0

目前 gateway 节点只能够访问 5.5.5.0/24 网段的机器,但我们只需要将需要访问的 nat 网段添加到 对应的 Peer 下的 AllowedIPs 中就能够正常访问了

例如,我们需要在 gateway 节点上访问 NAT-A(10.10.23.0/24) 网段,那么我们只需要修改 gateway 节点上 wireguard 配置文件中 NAT-A Peer 的配置即可

[Peer]
PublicKey = ${NAT_A_PUBLIC_KEY}
AllowedIPs = 5.5.5.4/32,10.10.23.0/24

配置完成之后 wg-quick down wg0 && wg-quick up wg0 尝试 ping NAT-A 网段的地址即可

只要 gateway 能够访问 NAT-A 网段的之后,同理在其他的 wireguard 客户端配置 gateway PeerAllowedIPs 之后,通过 gateway 进行一次转发也能够访问 NAT-A 网段了

4 日常使用

由于工作原因,平时有很多不同的网络环境需要访问,常常需要 ssh 代理、openvpn 来切换各种网络环境,用了 wireguard 之后解决了我的痛点,目前我使用 wireguard 连接了五个 NAT 网络

image-20181121175616327

5 总结

通过 wireguard 可以迅速构建支持多平台的大规模复杂的 vpn 网络,并且 wireguard 的性能高于 openvpnipsec 等常用 vpn 方案

更多关于 wireguard 的资料

https://www.wireguard.com/

https://staaldraad.github.io/2017/04/17/nat-to-nat-with-wireguard/

https://github.com/adrianmihalko/raspberrypiwireguard

6 最后

img

爱你!

这篇关于通过 Wireguard 构建 NAT-to-NAT网络互联的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/173414

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络 服务器端配置 在服务器端,你需要确保安装了必要的驱动程序和软件包,并且正确配置了网络接口。 安装 OFED 首先,安装 Open Fabrics Enterprise Distribution (OFED),它包含了 InfiniBand 所需的驱动程序和库。 sudo