wireguard进阶组网教程

背景介绍:

  老家有几台老旧的电脑装了一些web服务,但是我在出租屋中如何访问到这些web服务呢?这个涉及到2个局域网通信问题,本文使用wireguard单向打通2个局域网,实现出租屋中任意主机均可以访问老家web服务。

0x00 使用wireguard虚拟组网

  WireGuard 是一个易于配置、快速且安全的开源 VPN,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用 VPN,它可以轻松地在树莓派这类低端设备到高端服务器上部署。Linux创造者Linus Torvalds非常喜欢WireGuard,以至于将其合并到 Linux Kernel 5.6 中。
  阿里云上申请一个公网ip服务器(Server),家中局域网有一个虚拟机A,在老家192.168.0.0/24网段申请一台虚拟机做跳板机,使用wireguard组虚拟局域网。部署成功后可以实现虚拟机A、公网服务器、老家虚拟机B三台主机互相通信。其网络拓扑图如下所示:

拓扑图1

0x01 wireguard访问同局域网其他机器

  经过第一步后,其实并没有达到我们最终目的。此时在出租屋里使用虚拟机已经可以访问老家虚拟机B了,但是无法访问虚拟机B同网段的web服务器。参考 https://iliasa.eu/wireguard-how-to-access-a-peers-local-network/
  根据数据流向,依次做如下几个配置更改:

  • 虚拟机A作为请求发起方,修改Peer中AllowedIPs允许192.168.0.0/24流量包流入公网服务器。
  • wireguard公网服务器收到192.168.0.0/24流量包后,应该转发给虚拟机B节点,将192.168.0.0/24加入Peer为虚拟机B的AllowedIPs
  • 虚拟机B的wg0网口接受到了来自公网服务器的192.168.0.0/24流量包后,应该将该流量经过源ip修正后由ens192网口发出。主要规则是iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE,该规则用于当流量包从ens192网口发出时将源ip地址从10.0.2.0/24统一修正为192.168.0.82

  至此网络拓扑图依然没有改变,相比于上一步新增制定了192.168.0.0/24流量包在整个wg虚拟网络中的处理规则。虚拟机A在wireguard的帮助下,可以直接访问老家web服务器了。

0x02 配置wireguard节点为网关服务器

  经过第二步已经实现了出租屋虚拟机A访问老家web服务器。仔细思考下,发现一个用户体验的问题:我出租屋里还有手机/平板,别的电脑和虚拟机。每增加一个设备都要部署一套wireguard服务,那这个维护成本就太高了。理想情况是将虚拟机A配置为网关服务器,出租屋中其他机器流量都从虚拟机A转发一下实现访问老家的web服务。于是我在出租屋找到了另外一台电脑C,尝试将电脑C的网关设置为A服务器ip地址(192.168.93.128)。相比第一步,网络拓扑图增加了一台电脑C,如下图所示:

拓扑图2

但是此时虚拟机C并不能成功ping通web服务器。下面通过抓包排查问题。
保持在虚拟机C中执行ping 192.168.0.81,同时在虚拟机A中执行 tcpdump -nn -i any icmp进行抓包:

spring@spring-virtual-machine:~$ sudo tcpdump -nn -i any icmp
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
20:38:40.192152 ens33 In  IP 192.168.93.129 > 192.168.0.81: ICMP echo request, id 3, seq 11, length 64
20:38:40.192201 wg0   Out IP 192.168.93.129 > 192.168.0.81: ICMP echo request, id 3, seq 11, length 64
20:38:41.215779 ens33 In  IP 192.168.93.129 > 192.168.0.81: ICMP echo request, id 3, seq 12, length 64
20:38:41.215816 wg0   Out IP 192.168.93.129 > 192.168.0.81: ICMP echo request, id 3, seq 12, length 64
20:38:42.240394 ens33 In  IP 192.168.93.129 > 192.168.0.81: ICMP echo request, id 3, seq 13, length 64
20:38:42.240432 wg0   Out IP 192.168.93.129 > 192.168.0.81: ICMP echo request, id 3, seq 13, length 64
20:38:43.263821 ens33 In  IP 192.168.93.129 > 192.168.0.81: ICMP echo request, id 3, seq 14, length 64
20:38:43.263860 wg0   Out IP 192.168.93.129 > 192.168.0.81: ICMP echo request, id 3, seq 14, length 64

  在公网网关服务器也执行tcpdump -nn -i any icmp相同的命令抓包,发现没有任何显示。
根据以上信息可以推断出icmp包从虚拟机A的wg0网卡出去,但是公网服务器没收到。
那么到底是包没发出去还是服务器没收到呢?看虚拟机A的wg0.conf:

[Interface]
PrivateKey = xxxxxxxxxxx
Address = 10.0.2.3/32

[Peer]
PublicKey = xxxxxxxxxxx
AllowedIPs = 10.0.2.0/24,192.168.0.0/24
Endpoint = xx.xx.xx.xx:xx
PersistentKeepalive = 25

  根据wg0.conf显示,wireguard不认识192.168.93.129这个ip,所以不会把这个包真的发出去。
  那么如何在流量包由wg0网卡发出去前将源地址换掉呢?SNAT(Source Network Address Translation源网络地址转换)功能闪亮登场,其作用是将ip数据包的源地址转换成另外一个地址。关于NAT/SNAT/DNAT的关系及日常运用场景网上有非常多的文章讲,这里就不深入讲原理了。
通过下述2条命令实现当流量包目标地址为10.0.2.0/24或者192.168.0.0/24时将源ip地址修正为10.0.2.3:

iptables -t nat -I POSTROUTING -s 192.168.93.0/24 -d 10.0.2.0/24 -j SNAT --to-source 10.0.2.3
iptables -t nat -I POSTROUTING -s 192.168.93.0/24 -d 192.168.0.0/24 -j SNAT --to-source 10.0.2.3

  每次wg服务启动时都敲这么一串也不是个办法,可以加入到wg0.conf文件的PostUp和PostDown配置中。
  看下目前最新的虚拟机A的wg0.conf配置文件:

[Interface]
PrivateKey = xxxxxxx
Address = 10.0.2.3/32
DNS = 223.5.5.5,114.114.114.114
PostUp = iptables -t nat -I POSTROUTING -s 192.168.93.0/24 -d 10.0.2.0/24 -j SNAT --to-source 10.0.2.3; iptables -t nat -I POSTROUTING -s 192.168.93.0/24 -d 192.168.0.0/24 -j SNAT --to-source 10.0.2.3
PostDown = iptables -t nat -D POSTROUTING -s 192.168.93.0/24 -d 10.0.2.0/24 -j SNAT --to-source 10.0.2.3; iptables -t nat -D POSTROUTING -s 192.168.93.0/24 -d 192.168.0.0/24 -j SNAT --to-source 10.0.2.3

[Peer]
PublicKey = xxxxx
AllowedIPs = 10.0.2.0/24,192.168.0.0/24
Endpoint = xx.xx.xx.xx:xx
PersistentKeepalive = 25

至此,出租屋里面的主机只要将网关设置为虚拟机A的ip地址(192.168.93.128)均可以访问老家的web服务器。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容