目录

Wireguard笔记(一) 节点安装配置和参数说明

Wireguard笔记(二) 命令行操作

Wireguard笔记(三) lan-to-lan子网穿透和多网段并存

多 Wireguard 服务并存

可以在/etc/wireguard/下创建多个配置文件, 例如wg0.conf, wg1.conf配置多个服务

  • 分别使用systemctl enable/start wg-quick@wg0, systemctl enable/start wg-quick@wg1 启动
  • 使用wg show能同时看到这些wiguard服务的连接情况
  • 各配置使用不同的隧道网段, 会体现到route上
  • 各配置当中, peer中的allowedIP会影响route规则, 如果相同会产生冲突

对于非服务端, 配置文件的例子为

[root@vm_ci01 ~]# more /etc/wireguard/wg0.conf
[Interface]
PrivateKey = [填入私钥]
Address = 10.253.0.3/32
ListenPort = 50004
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -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; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer]
PublicKey = [填入服务端的公钥]
AllowedIPs = 10.253.0.0/24,192.168.116.0/24
Endpoint = 1.123.45.67:50004(服务端的IP端口)
PersistentKeepalive = 25

用 Wireguard 实现 lan-to-lan

需求: 用阿里云的弹性公网IP创建一个wireguard节点, 让公司内网lan接入, 接入后阿里云VPC中的机器可以与公司lan中的机器互相通信.

阿里云服务器的配置

  1. 首先创建一个安全组, wireguard peer所在机器单独放到这个安全组
  2. 给这个机器升级内核到5.6.x以上, 开启wireguard, 安装对应的工具wg-quick等
  3. 启动服务, 从异地lan的节点建立连接, 让节点间互通

配置示例

[g01 ~]# more /etc/wireguard/wg0.conf
[Interface]
PrivateKey = +123123Hw=
Address = 10.252.0.1/24
ListenPort = 50004
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -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; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # Server1: office - gw
[Peer]
PublicKey = +123123Hw=
AllowedIPs = 10.252.0.2/32,192.168.15.0/24 (两部分, 一个是对方peer的隧道IP, 另一个是对方的内网IP段)

而后, 需要在阿里云中配置

  • VPC的路由表

    • 自定义部分, 增加目标网段(异地lan)的跳转, 下一跳指向刚才创建的wireguard节点.
  • wireguard节点所在的安全组
    • 出方向默认是全放行, 不需要改
    • 入方向分三部分, 一部分是授权所有来源, 仅开放提供服务的端口, 例如80, 443, 50004等, 这里要把wireguard的端口打开
    • 入方向的第二部分是默认的允许所有来源, 所有端口, 协议类型ICMP, 这部分是允许ping
    • 入方向的第三部分是为了lan to lan设置的: 允许来源阿里云内网的IP段, 端口所有, 协议全部. 这一条不加, 就只能ping, 不能连.

公司内网服务器的配置

  1. 创建新虚机
  2. 升级内核至5.6+, 开启wireguard, 安装wg-quick
  3. 创建配置文件, 与阿里云的wireguard节点互通

配置示例

[c01 ~]# more /etc/wireguard/wg1.conf
[Interface]
PrivateKey = +123123Hw=
Address = 10.252.0.2/32
ListenPort = 50003
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -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; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # Aliyun gw
[Peer]
PublicKey = +123123Hw=
AllowedIPs = 10.252.0.0/24,192.168.123.0/20 (两部分, 一个是对方peer的IP, 因为对方是个接入点, 所以配了整个IP段; 另一个是对方的内网IP段)
Endpoint = 123.45.67.89:50004 (公网IP)
PersistentKeepalive = 25 (主动tcpdump -i ens160 icmp
保持连接)

而后, 需要在本地路由器上配置

  • 路由表: 将192.168.123.0/20这个网段的下一跳指向上面配置好的机器

隧道机制

外部节点通信

wg隧道IP段为10.251.0.x, 在隧道外的两个节点互相ping时, 通过tcpdump观察wg0上的流量, 可以看到和隧道IP无关, 内部并不会对消息再打包

root@Timecloud2:~# tcpdump -i wg0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wg0, link-type RAW (Raw IP), capture size 262144 bytes
23:55:55.998466 IP 192.168.112.7 > 192.168.16.209: ICMP echo request, id 11286, seq 59, length 64
23:55:55.999339 IP 192.168.16.209 > 192.168.112.7: ICMP echo reply, id 11286, seq 59, length 64
23:55:56.998165 IP 192.168.112.7 > 192.168.16.209: ICMP echo request, id 11286, seq 60, length 64
23:55:56.999017 IP 192.168.16.209 > 192.168.112.7: ICMP echo reply, id 11286, seq 才60, length 64

内部节点与外部通信

与前面相同的网络, 当隧道内节点ping外部节点时, 在关联外部节点的wg上观察流量, 会在网口间转发

[root@gw01 ~]# tcpdump -i wg0 icmp
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wg0, link-type RAW (Raw IP), capture size 262144 bytes
00:03:09.997724 IP 10.251.0.17 > 192.168.112.3: ICMP echo request, id 14076, seq 0, length 64
00:03:09.998131 IP 192.168.112.3 > 10.251.0.17: ICMP echo reply, id 14076, seq 0, length 64
00:03:10.999400 IP 10.251.0.17 > 192.168.112.3: ICMP echo request, id 14076, seq 1, length 64
00:03:10.999726 IP 192.168.112.3 > 10.251.0.17: ICMP echo reply, id 14076, seq 1, length 64

问题排查

如果连接有问题, 按以下步骤排查

  1. 隧道是否通: 两个节点用隧道IP互相ping是否有响应, 这步必须是通的, 否则后面都不需要试了肯定不行
  2. 隧道节点ping对方子网
  3. 子网ping对方子网

如果有问题, 用traceroute, tracepath, tracert这些命令看看包到哪里停住的, 如果最后一个包已经到了远端的隧道节点, 说明本端配置是对的, 需要检查隧道中间的节点或者对方节点.

lan-to-lan 的配置要点

配置部分需要注意: 两个peer在配置上都需要给对方的allowedIPs加上对方的子网IP段, 这个很重要

  • wireguard节点往本子网IP段的访问, 使用的都是子网IP段, 不需要额外路由
  • wireguard节点收到返回的包后, 需要将包发回原请求方时, 看的是allowedIPs, 如果原请求方是隧道节点, 则此隧道IP必须指向正确的返回路径下一跳节点, 如果原请求方是隧道外的机器, 那么不仅它的入口隧道IP路径需要正确, 原请求方的子网IP也必须指向正确的下一跳节点.

不同配置下的访问情况

  • 前提条件

    • A和B都已经在sysctl中开启了ip forward, 在wireguard配置PostUp中开启了转发
  • A,B都不给对方的allowedIPs加子网IP段
    • 只有A和B之间能通过隧道IP通信, A不能访问B后面的子网, 反之亦然, 因为A和B只会转发隧道IP段的包, 往子网IP段的包不会发入隧道
    • A子网的机器不能访问B子网的机器, 反之亦然.
  • A给B的allowedIPs配了子网IP段, 但是B没给A配
    • A能访问B后面的子网
    • 任何连入隧道的节点, 如果将B的子网IP段配置到A上, 也能通过A访问B的子网
    • A的子网其他机器, 通过A不能访问B后面的子网, 用tracert可以看到, 有过去的包但是没有返回的包
    • B不能访问A后面的子网
  • A和B都给对方的AllowedIPs配置了对方的子网IP段
    • A和B都能访问对方后面的子网
    • A的子网其他机器, 通过A可以访问B的子网机器, 反之亦然

综上:

  • 开启了转发的wireguard节点, 假设为A, 相当于对隧道中的所有节点开放了自己的子网
  • 隧道中的节点B仅需要给A节点allowedIPs配置上A的子网IP段, 就能访问A的子网
  • 如果节点B也开启了转发, 那么给A节点allowedIPs配置上A的子网IP段后, A的子网机器也能访问B节点的子网

Wireguard笔记(三) lan-to-lan子网穿透和多网段并存的更多相关文章

  1. 计网学习笔记三 MAC与LAN

    在上一讲中,我们学习了链路层可以提供的服务:framing,link access,reliable delivery,error detection&correction.这一讲我们从lin ...

  2. 基于TCP的NAT子网穿透实验

    不得不说,在国内IP紧缺的现状下,NAT发挥了无比巨大的作用:它以把IP和端口重新分配的方式,满足了广大人民群众上网的强烈需求.但是对于个人服务器以及在内网中基于网络的嵌入式设备,却是个比较尴尬的事情 ...

  3. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  4. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  5. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  6. Mastering Web Application Development with AngularJS 读书笔记(三)

    第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...

  7. Python 学习笔记三

    笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...

  8. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现

    本系列文章由七十一雾央编写,转载请注明出处. 313239 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5 ...

  9. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  10. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

随机推荐

  1. java: 程序包xxx.xxx.xxx不存在

    1.问题 在拷贝进来一个文件夹/文件进入项目后,发生报错:java: 程序包com.itheima.mp.domain.query不存在 2.解决 这里主要是由于我们的文件直接拷贝进来,导致编译的时候 ...

  2. 【BUS】LIN Bus

    概述 随着汽车内电子设备的增多,市场上对于成本低于 CAN 的总线的需求日益强烈,不同的车厂相继开发各自的串行通信(UART/SCI)协议,以在低速和对性能要求不高的场合取代CAN.由于不同车厂定义的 ...

  3. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.03)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  4. [转帖]SecurityProtocolType 枚举

    https://learn.microsoft.com/zh-cn/dotnet/api/system.net.securityprotocoltype?view=net-8.0 命名空间: Syst ...

  5. [转帖]global cache cr request等待事件分析及优化

    在RAC环境中,和全局调整缓存相关的最常见的等待事件无非就是:global cache cr request,global cache busy和equeue 在XX电信做了一次数据库巡检中发现,sp ...

  6. tikv-ctl的简单学习

    tikv-ctl的简单学习 摘要 最近在学习使用 tidb. 有一个场景,单独使用了tikv作为键值对的数据库. 但是比较不幸.总是出现宕机的情况 因为这个环境是单独使用tikv 二进制进行安装的 没 ...

  7. [转帖]KingbaseES 服务器运行参数分类

    https://www.cnblogs.com/kingbase/p/16969149.html Kingbase 服务器运行参数分类 说明: KingbaseES 数据库中,服务器运行参数分为多种类 ...

  8. [转帖]configure 各种配置

    https://api.dandelioncloud.cn/article/details/1487329970564485121 -build=编译该软件所使用的平台 -host=该软件将运行的平台 ...

  9. Inspur CS5280H BMC重装系统的过程

    Inspur CS5280H BMC重装系统的过程 背景 公司里面一台信创海光的设备 默认安装了银河麒麟v10的操作系统 但是在进行瀚高数据库压测时 总会出现无缘无故的宕机的情况. 昨天还特别学习了下 ...

  10. [转帖]OpenAI 道歉:Redis bug 致 ChatGPT 故障、数据泄露

    https://www.163.com/dy/article/I0N6HEIT0511D6RL.html OpenAI表示,Redis的开源库bug导致了发生在周一的ChatGPT故障和数据泄露事件, ...