喵星人聚居地 - alpine
type: channel
link: https://miaostay.com/tag/alpine/
items: 用 Alpine Linux 搭建软路由

用 Alpine Linux 搭建软路由
type: item
date: 2020-03-03T14:31:00+08:00
description: 写在开始使用Hyper-V的时候他会自动分配一个Default Switch这么一个网卡用于NAT， 然而这个网卡的ip似乎每次重启都会自动更换， 所以这个就挺令人烦恼了， 毕竟如果Hyper-V虚拟机里面是一堆linux的话那每次都是自动更换ip的， 连接起来还是很麻烦的。 所以我打算在内网给解决掉这个问题， 把IP地址至少可以接近静态的， 之前那个连IP段都要变确实有点受不了。技术选型其实这个可以直接在虚拟机里跑一个OpenWRT之类的东西的， 但是鉴于我有一个这样子的虚拟机， 而且还被我莫名其妙搞坏了， 这次我就手动搭建一个路由器系统了。 至于选哪个系统， Linux用的比FreeBSD之类的熟悉一点， Windows太占资源。 然后基于节约资源的角度考虑， 我用了 Alpine Linux。 毕竟这个系统的体积小。 而且这个系统我在玩Docker镜像的时候经常用， 所以也不算陌生。其他的东西也就是用vagrant来操作hyper-v了， 这样子会简单点。那开始吧下载 Alpine Linux 的 Box先去找找有没有现成的Vagrant的Box， 然后我发现了这个Box， 这个Alpine Linux的Box支持Hyper-V的版本。 所以就用这个了。那首先随便找个目录， 然后输入vagrant init generic/alpine310 sudo vagrant up --provider=hyperv因为不是用管理员打开的这个终端， 然后如果操作Hyper-V的虚拟机的话需要管理员权限， 所以需要提权。 这里推荐一下这个人的sudo脚本。 感觉还是挺好用的。顺便一提， vagrant是用curl来下载box的。Hyper-V部分的设置在vagrant下载box的这一会去设置一下Hyper-V那边的东西。打开Hyper-V管理器， 在右侧找到虚拟交换机管理器点开之后创建一个内部的交换机名称随意， 注意是要设置成内部网络， 就像这样然后点确定就好。Vagrant Box 下载完成后vagrant up执行过程中会打印出类似以下的输出这个时候选择 Default Switch就好然后接下来会出来一堆输出， 其实也不用在意是啥。然后sudo vagrant halt关闭这个虚拟机， 接下来往里面添加一个给内网用户使用的网卡。首先要在Hyper-V控制台里面找到这个虚拟机， 然后点击它， 右边会出来一排按钮选择设置。 然后选择添加硬件里面有一个网络适配器， 点击之后选择添加。然后选择之前创建的那个内部网络。选择完成之后大概长这个样子然后点击确定， 回到这里点击启动重启开机。接下来就sudo vagrant ssh进入这个虚拟机里操作就好。构建一个简易的软路由器的基本思路首先要有一个DHCP服务器给内网设备分配IP用， 然后要有一个DNS服务器给内网设备提供DNS服务， 最重要的还要有一个NAT和转发来让内网设备可以通过NAT来连接到外部网络， 然后还需要能够回来。 这样子一个路由器就完成了。那么我们一步一步做就好软路由构成的基本选型使用Dnsmasq来给内网设备提供DHCP和DNS， 然后用iptables创建一个NAT和处理请求转发。曾经还考虑过使用AdGuardHome来提供DHCP和DNS服务来着， 奈何它的DHCP看起来不工作的样子， 也很不稳定的样子， 所以我就抛弃了这个选择。那么就进入软路由里进行操作吧毕竟是个国外的Box， 所以自带的软件源自然不会很快， 这里换成中科大的源。首先看一下这个源是啥cat /etc/apk/repositories然后他输出了https://dl-4.alpinelinux.org/alpine/v3.10/main https://dl-4.alpinelinux.org/alpine/v3.10/community中科大官方提供的一键脚本是这样的sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories这样子很明显不能成功替换， 所以要修改成这样子sudo sed -i 's/dl-4.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories替换完成之后执行sudo apk update更新完成之后就可以准备安装软件了。需要安装的软件因为这个Box非常精简， 精简到连iptables都没有， 所以要装这些东西：dnsmasqiptablesip6tables那么就一条命令加上去吧sudo apk add dnsmasq iptables ip6tablesDnsmasq 配置接下来配置一下Dnsmasq。 在这之前先确…