寫在開始

利用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都没有, 所以要装这些器材:

  1. dnsmasq
  2. iptables
  3. ip6tables

那麽就一條号令加上去吧

sudo apk add dnsmasq iptables ip6tables

Dnsmasq 建设

接下来建设一下Dnsmasq。 在这之前先确认一下本身的网卡

ip addr

然後输出了三个网卡, 一个是lo, 一个是eth0, 一个是eth1。

eth0是走了Default Swtich的, 算是路由器的WAN口, eth1是走了内部收集的, 算是路由器的LAN口, 肯定了这个以后开端建设Dnsmasq。

sudo vim /etc/dnsmasq.conf

接下来我就贴一下我改了的建设, 然後一条一条说好了。

resolv-file=/etc/resolv.conf
interface=eth1
dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,12h
dhcp-option=option:router,192.168.1.1
cache-size=500
conf-dir=/etc/dnsmasq.d/,*.conf

這些是整個dnsmasq.conf裏面利用的參數。

resolv-file 是声了然上游DNS办事器的处所, 这个我直接用了系统主动建设的DNS, 归正能上彀, 所以题目不大年夜。

interface 是声明DHCP办事器启动的接口, 這裏要设置LAN口的, 所所以eth1

dhcp-range 这个就挺好懂了, 就是设置DHCP主动分派的一些设置, 第一个是肇端IP, 第二个是结束IP, 第三个是子网掩码, 第四个是DHCP过不时候。

dhcp-option这个是供给了一些别的参数, 这个是为了给下流设备供给网关的一个设置, 最后面是设置网关IP的, 我设置为192.168.1.1, 过会我会把路由器的 LAN IP 设置为这个的。

cache-size 这个仿佛是DHCP缓存, 会让你缓存之前DHCP分派的汗青记录, 下一次这个设备从头获得IP的时辰会先走缓存找到前次的IP。 这个后面的数字随缘设置就好, 算是个可以优化的点吧。 我就随便设置了个500, 不改也能够。

conf-dir 这个默许就带着的, 会读取这个目次下面的conf文件, 来自定义建设Dnsmasq, 我也没改, 就放上去了。

建设完以后保存就好, 接下来设置LAN口的静态IP。

建设 LAN 口的静态 IP

那就直接進interface文件裏加上這個接口的靜態IP就好了

sudo vim /etc/network/interfaces

打開之後你會看到這樣的東西

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
    hostname alpine310.localdomain

然後在后面添加上

auto eth1
iface eth1 inet static
    address 192.168.1.1
    network 192.168.1.0
    netmask 255.255.255.0
    broadcast 192.168.1.255

這算是一個很經典的建设编制了吧。

address 設置這個接口的靜態IP

network 这玩意实在我也不知道是啥, 可是该当是设置为这个收集的肇端IP的前一个, 也就是常见的监听全部收集的阿谁IP。

netmask 這個是子網掩碼

broadcast 這個是廣播地址

這些建设完之後重啓一下network服務

sudo service network restart

然後你便可以启动Dnsmasq了

sudo service dnsmasq start

接下来建设 iptables

由于只建设IPv4, 所以我就没有管IPv6的转发,

直接執行下面四條号令便可以了

sudo iptables -A FORWARD -i eth1 -s 192.168.1.0/255.255.255.0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -d 192.168.1.0/255.255.255.0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo /etc/init.d/iptables save

第一條是允許從eth1進來的來源于那個子網的連接

第二條是允許從eth0的數據到那個子網裏

就是一條允許出一條允許進

第三條就是把這個挂到POSTROUTING鏈上

第四條是保存這個iptables記錄。

这个器材多少还是有点晕。 实在我本身也说不太清楚。

所以援引一句這位老哥的話

第三條暗示把數據最終的POSTROUTING定向到eth0也就是WAN口上,利用MASQUERADE轉譯是爲了保證NAT出去的地址是固定的。

(实在很多多少细节也是从這裏看到的, 还有這裏

然後启动开内核的IP转发, 这个版本的 Alpine Linux 有一个/etc/sysctl.d文件夹, 里面有一个00-alpine.conf的文件, 所以你可以仿照着这类文件格式添加一个01-router.conf之类的文件添加上这些器材, 或也能够直接添加到00-alpine.conf里面, 看你的小我欢愉爱好了。

然後在阿谁建设文件里添加上这么一条

net.ipv4.ip_forward=1

仿佛這時候sysctl -p实在不生效, 所以还是要重启一下比较好。

給這兩個東西加一個開機自啓

Alpine Linux 的办事办理器是OpenRC, 一个比较轻量并且经典的过程办理器。

rc-update add dnsmasq
rc-update add iptables

給本身的宿主機設置一個靜態IP

这个就随缘设置一个就好, 右键托盘里的收集

打开"收集和 Internet"设置

找到裏面的更改適配器選項。

然後找到内部网路右键属性

双击 Internet 和谈版本 4

简单建设一下就好了, 这个时辰不建议设置网关和DNS, 设置了DNS的话可能会导致系统DNS走了这个, 导致呈现循环。 网关也是。

实在到這裏就结束了, 可是我还需要另外一个器材

接下来装一下vlmcsd, 知道都懂, 不知道的就不消管了。

直接抄一下人家的Dockerfile实在就好, 直接在终端输入

sudo su
apk update \
    && apk upgrade \
    && apk add --no-cache build-base gcc abuild binutils cmake git \
    && cd / \
    && git clone https://github.com/Wind4/vlmcsd.git vlmgit \
    && cd vlmgit \
    && make \
    && chmod +x bin/vlmcsd \
    && mv bin/vlmcsd / \
    && cd / \
    && apk del build-base gcc abuild binutils cmake git \
    && rm -rf /vlmgit  \
    && rm -rf /var/cache/apk/*

等着结束以后会在根目次下呈现一个vlmcsd, 然後mv /vlmcsd /usr/local/bin/放到一个比较正常的目次下。 建设一下service。

因而就進入/etc/init.d里面成立一个文件, 内容大年夜概这样子容貌就好。

#!/sbin/openrc-run

description="vlmcsd Server"

pidfile="/run/$RC_SVCNAME.pid"
command="/usr/local/bin/vlmcsd"
command_args=" -D -d -t 3 -e -v"
command_background=true

extra_commands="checkconfig"

depend() {
    need net
    after firewall
}

stop() {
    if [ "${RC_CMD}" = "restart" ] ; then
        checkconfig || return 1
    fi

    ebegin "Stopping $RC_SVCNAME"
    start-stop-daemon --stop --exec "$command" \
        --pidfile "$pidfile" --quiet
    eend $?
}

創建完成之後給他加個可執行權限

chmod +x vlmcsd

然後启动

service vlmcsd start

添加開機自啓

rc-update add vlmcsd

就落成了。

寫在最後

之前一向觉得人工做一个軟路由很麻烦来着, 成果这么操纵了一下发现还是很简单的, 最少此刻思路明白了, 整体来讲就简单很多多少了。

Last modification:March 7, 2020
若是覺得我的文┞仿對你有效,請隨意贊賞