打通和朋友宿舍间的网段
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的样子。)
Device | IP Address | WireGuard Peer Address |
---|---|---|
Cat | 192.168.1.233 | 10.66.124.2 |
Neko | 192.168.124.233 | 10.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}
这里还需要在路由器上把Neko
的WireGuardPort
转发出来,以便让Cat
连接到。
这样,Neko
应该可以和Cat
通讯了。
之后是要让Neko
和Cat
能够通过对方访问对方的网段
这就涉及到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转发
,所以Cat
和Neko
已经可以当作网关来使用了。
去OpenWrt
-> 网络
-> 静态路由
,添加一条静态路由。
Cat
端的路由器
接口 | 目标 | 网关 | 跃点数 | 表 |
---|---|---|---|---|
lan: [桥接: “br-lan”] | 192.168.124.0/24 | 192.168.1.233 | 0 | main |
Neko
端的路由器
接口 | 目标 | 网关 | 跃点数 | 表 |
---|---|---|---|---|
lan: [桥接: “br-lan”] | 192.168.1.0/24 | 192.168.124.233 | 0 | main |
然后,你就可以在内网里面直接访问对方的内网设备了。
0x04 其他的⌗
其实比起用DDNS
,我在想是不是能直接用mDNS
让两台设备在内网里面互相发现(
两边的路由器稍微配置一下avahi-daemon
,估计可以实现。
然后,通过类似的方法你也可以把家里的网段打通。