0x00 前言

干啥呢

我和朋友的宿舍里都有路由器,都开启了NAT,所以我们的网段是隔离的。

不过路由器都是为了多播而存在的 (x

朋友在他宿舍里放了个台式机,跑的是TrueNAS (富哥)。他的NAS上面有一些虚拟机,我想直接访问它们。

一点别的事情

说来,上学期我测试的时候,宿舍楼的校园网是无法相互访问的,估计是开了VLAN Isolation啥的。不过这个学期突然又可以了,挺好的。

这个方案其实一开始我是使用n2n,通过自建的n2n Supernode进行打洞、通讯的。不过n2n似乎只能跑到100Mbps。我们的校园网接入是100Mbps,我猜测咱的edge节点走校园网的出口进行通讯了,而不是直接在校园网网段内通讯,所以速度很慢。

反正挺神奇的。

0x01 DDNS 以及一些别的

我需要知道对方宿舍路由器的IP地址。 这应该是很简单的事情,直接用DDNS就好了,我用的是ddns-go

后来我尝试在本地解析对方的IP地址,却发现怎么查也查不出来。我还以为是解析没那么快,后来调查了一下才发现有个东西叫重绑定保护,在OpenWrt中是默认启用的,它会丢弃包含 RFC1918 地址的上游响应,也就是会丢弃掉DNS查询返回中的私有地址

RFC1918 你可以看 这里。在互联网的地址架构中,专用网络是指遵守RFC 1918和RFC 4193规范,使用专用IP地址空间的网络。私有IP无法直接连接互联网,需要使用网络地址转换或者代理服务器来实现。与公网IP相比,私有IP是免费的,同时节省了IP地址资源,适合在局域网使用。(来自Wikipedia)

这个东西是为了防止DNS重绑定攻击的。基本上就是,保护你的内网设备不被恶意网页访问到。如果你 感兴趣,你可以读读下面的内容:

DNS重新绑定是计算机攻击的一种形式。 在这种攻击中,恶意网页会导致访问者运行客户端脚本,攻击网络上其他地方的计算机。 从理论上讲,同源策略可防止发生这种情况:客户端脚本只能访问为脚本提供服务的同一主机上的内容。 比较域名是实施此策略的重要部分,因此DNS重新绑定通过滥用域名系统(DNS)来绕过这种保护。 这种攻击可以通过让受害者的网络浏览器访问专用IP地址的机器并将结果返回给攻击者来破坏专用网络。 它也可以用于使用受害者机器发送垃圾邮件,分布式拒绝服务攻击或其他恶意活动。 (来自Wikipedia)

解决方法就是,去 OpenWrt -> 网络 -> DHCP/DNS -> 常规设置 -> 域名白名单, 添加你的域名,之后你就可以解析到你的DDNS地址了。

0x02 WireGuard 与 NAT 与 IP Forward

理论上你可以直接写路由表来解决这个事情,但是我不想在内网里面裸奔,所以我还是用了WireGuard

首先两边内网里的两台及其能够通讯。

这里把我这的机器叫做Cat,对方的机器叫做Neko。 (没有用路由器跑是因为,路由器的MT7621不太能跑满1000Mbps,效果在200Mbps的样子。)

DeviceIP AddressWireGuard Peer Address
Cat192.168.1.23310.66.124.2
Neko192.168.124.23310.66.124.1

我先在两边的内网机器上配置了WireGuard。两边大概是这样:

  • Neko
[Interface]
Address = 10.66.124.2/32
PrivateKey = {PrivateKeyForNeko}

[Peer]
AllowedIPs = 192.168.124.0/24, 10.66.124.0/24
Endpoint = {YourDDNSDomain}:{WireGuardPort}
PersistentKeepalive = 25
PreSharedKey = {PreSharedKey}
PublicKey = {PublicKeyForCat}
  • Cat
[Interface]
Address = 10.66.124.1/32
ListenPort = {WireGuardPort}
PrivateKey = {PrivateKeyForCat}

[Peer]
AllowedIPs = 192.168.1.0/24, 10.66.124.0/24
PublicKey = {PublicKeyForNeko}
PresharedKey = {PresharedKey}

这里还需要在路由器上把NekoWireGuardPort转发出来,以便让Cat连接到。

这样,Neko应该可以和Cat通讯了。

之后是要让NekoCat能够通过对方访问对方的网段

这就涉及到IP转发(ip_forward)了。

操作系统拥有IP转发功能,意味着该系统能接收从接口传送进来的网络数据包,如果识别到该数据包不用于该系统自身,那么系统将会将该网络数据包传送到另外一个网络去,用恰当地方式转发该数据包。 一个典型的场景是需要去搭建一个路由器以连接两个不同网络。 (来自WikiPedia)

由于需要从WireGuard的接口访问,比如说,eth0,就跨接口了。需要调整一个内核 参数来启用IP转发

你需要在/etc/sysctl.conf中添加一行:

net.ipv4.ip_forward=1

然后执行sysctl -p来使其生效。

这样,内核就可以帮我们转发数据包了。

这里就需要配置iptables,来做NAT

  • Cat & Neko
iptables -t nat -A POSTROUTING -s 10.66.124.0/24 ! -d 10.66.124.0/24 -j MASQUERADE

MASQUERADE 是一种 SNAT,它应该叫做地址伪装。它基本上做的事情就是智能的SNAT,它一般用于将局域网与互联网连接起来。具体你可以看这里。如果你对NAT感兴趣,你可以去这里看看。

对了,你还需要将iptables规则持久化。基本上就是,你要执行类似这样的东西:

iptables-save > /etc/iptables/rules.v4

这样,Neko应该可以访问Cat所在内网的内容,反之亦然。

0x03 Static Route

为了让内网设备能够直接访问对方的内网设备,我们需要在路由器上添加静态路由。

由于已经打开了IP转发,所以CatNeko已经可以当作网关来使用了。

OpenWrt -> 网络 -> 静态路由,添加一条静态路由。

  • Cat端的路由器
接口目标网关跃点数
lan: [桥接: “br-lan”]192.168.124.0/24192.168.1.2330main
  • Neko端的路由器
接口目标网关跃点数
lan: [桥接: “br-lan”]192.168.1.0/24192.168.124.2330main

然后,你就可以在内网里面直接访问对方的内网设备了。

0x04 其他的

其实比起用DDNS,我在想是不是能直接用mDNS让两台设备在内网里面互相发现(

两边的路由器稍微配置一下avahi-daemon,估计可以实现。

然后,通过类似的方法你也可以把家里的网段打通。