MENU

將ovh小雞的附加ip拿到其它獨立服務器(esxi)上使用

之前購買的某家idc特價服務器只有1個ipv4,裝了proxmox ve之後按照hostloc幾年前發布的方法折騰了今天勉強可以使用了,但經常新創建的機器分配ip後沒有網絡,經常在調整時會影響到已存在的vm,使用了幾個月之後決定從idc再購買幾個ip,需要低延遲與穩定的vm分配idc的ip,然後創建一個軟路由並設置dhcp服務器,為不需要低延遲和穩定的機器分配ovh的ip,並將proxmox ve換成esxi.

準備

  • 一個ovh的vps和一堆ip
  • 至少擁有2個ip的esxi服務器
  • netboot.xyz
  • 一個大腦

不止ovh的vps,其它擁有多ip的vps或獨立服務器也可以,需要注意的是ovh的vps目前訂購多個附加ip有可能會得到一堆獨立的ip(通常是連續但不能剛好組成一個cidr),對於這種ip則需要使用arp代理(後面講到)

而esxi之所以使用2個ip是為了讓esxi宿主機單獨佔用一個ip,軟路由一個ip,當然也可以通過網上的宿主機和小雞共用一個ip的方法設置,但中途會調整路由,單ip時會影響宿主機的通信.

ovh的設置

ovh的vps本身不提供alpine linux的系統模板,先安裝ubuntu按照我的上一篇文章中提到的改grub方式引導netboot.xyz進行alpine linux的安裝,具體方法不再敘述,直接來到設置階段.
首先,需要先開啟ipv4轉發和關閉rp_filter,編輯/etc/sysctl.conf添加如下內容保存後運行sysctl -p

net.ipv4.ip_forward=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1

然後設置與esxi軟路由鏈接的隧道,這裡採用ipip隧道,編輯/etc/network/interfaces在主網卡下面加入如下內容進行保存

post-up /sbin/ip tunnel add ipip mode ipip local ovh小雞本機的ip remote esxi上軟路由的ip ttl 255
        post-up /sbin/ip link set ipip up
        post-up /sbin/ip route add ovh小雞的附加ip(cidr格式) dev ipip

        pre-down /sbin/ip tunnel del ipip

當然可以選擇gre或gretap之類的隧道,但不推薦wireguard與tinc,一個是wireguard似乎有額外的ip驗證無法關閉,而tinc之前在pve上使用後將ip分給小雞也無法正常通信(原因不明)

這裡會出現2種情況,那就是ovh的小雞可能會得到一堆附加ip或一個cidr,在cidr的情況下無需再做任何設置,在一堆ip的情況下需要設置arp代理
在上面內容的下面加入如下內容.


        post-up /sbin/arp -i eth0 -s 12.34.56.78 AA:AA:AA:BB:BB:BB pub
        post-up /sbin/arp -i eth0 -s 12.34.56.79 AA:AA:AA:BB:BB:BB pub
        post-up /sbin/arp -i eth0 -s 12.34.56.80 AA:AA:AA:BB:BB:BB pub
        ....

        pre-down /sbin/arp -i eth0 -d 12.34.56.78 AA:AA:AA:BB:BB:BB pub
        pre-down /sbin/arp -i eth0 -d 12.34.56.79 AA:AA:AA:BB:BB:BB pub
        pre-down /sbin/arp -i eth0 -d 12.34.56.80 AA:AA:AA:BB:BB:BB pub
        ....

其中12.34.56.xx是ovh小雞的附加ip,每行只能設置1個ip,不支持cidr格式,有多少ip加多少行,AA:AA:AA:BB:BB:BB是ovh小雞主網卡的mac地址.

需要注意的是有可能ovh分配的ip不能剛好組成一個cidr,這個時候需要找到包含他們的最小塊(例如小雞的16個ip是11.1.1.45到11.1.1.60,那麼它在1.1.1.32/27範圍內,得到cidr之後先記一下,後面會用到

然後重啟小雞,(通過運行service networking restart無法完成網卡重啟,因為這個時候沒有隧道,但post-down中有刪除隧道的命令)

esxi和軟路由vm設置

首先創建一個vm,系統選擇linux,其它4.x或更高,配置最小512m內存和2g硬盤1cpu,可根據實際情況增加配置,使用netboot.xyz的iso引導,其餘保持默認即可,創建之後啟動並安裝alpine linux.

安裝alpine linux之後在esxi中添加一個虛擬交換機,添加後為其添加並綁定一個端口組,然後為vm添加一個網卡,綁定到新增加的端口組.

進入系統後通過apk update && apk install iptables安裝iptables,然後開啟ipv4轉發和關閉rp_filter,方法和上面ovh的一樣,不再敘述.

然後開始設置網卡,編輯/etc/network/interfaces在主網卡下面加入如下內容進行保存,其中eth1為橋接新增加的端口組的網卡,網卡名稱不一定為eth1,可通過網卡和esxi設置頁面內的mac進行確定.

auto eth1
iface eth1 inet static
        address 1.1.1.45
        netmask 255.255.255.224

        #創建隧道
        post-up /sbin/ip tunnel add ipip mode ipip local esxi上軟路由的ip remote ovh小雞本機的ip ttl 255
        post-up /sbin/ip link set ipip up

        #加路由
        post-up /sbin/ip rule add from 1.1.1.32/27 table 666
        post-up /sbin/ip route add default dev ipip table 666
        post-up /sbin/ip route add 1.1.1.32/27 dev eth1 table 666

        # 删隧道
        pre-down /sbin/ip tunnel del ipip

保存並重啟機器後應該可以通過ifconfig看到eth1和ipip隧道,此時應該可以從ovh小雞中ping到1.1.1.45,如果ovh為其分配的ip為一整個cidr時1.1.1.45換為cidr中的gateway,否則設置為一堆ip中的任意一個,之後此ip將作為網關使用.

當ovh小雞的附加ip為一堆ip時需要進行以下額外的設置,在上面配置文件中繼續添加如下內容

        pre-up /sbin/arp -i gretap -s 1.1.1.32 CC:CC:CC:AA:AB:BA pub
        pre-up /sbin/arp -i gretap -s 1.1.1.33 CC:CC:CC:AA:AB:BA pub
        ......

        pre-down /sbin/arp -i gretap -d 1.1.1.32 CC:CC:CC:AA:AB:BA pub
        pre-down /sbin/arp -i gretap -d 1.1.1.33 CC:CC:CC:AA:AB:BA pub
        ......

這裡需要知道的是在1.1.1.32/27這個範圍內只有11.1.1.45到11.1.1.60屬於你,其餘的ip將被ovh分配給別的機器使用,而上面配置中的ip則為這些在這個cidr中而不屬於你的ip,每個ip都要添加一行,其中CC:CC:CC:AA:AB:BA是你的ipip隧道的地址,如果不設置這一步,那麼你之後開的其他vm和你現在這個軟路由的vm將無法與這些ip鏈接.

設置好後,還需要注意mtu,你的數據將通過ovh小雞與你的軟路由之間建立的vm進行通信,隧道mtu低於1500這時如果不做任何處理,之後開的小雞鏈接將會出現問題.有2種方法解決,一個是之後每個小雞內網卡都手動設置mtu,另外一個是在軟路由機器中通過iptables拆包.這裡採用拆包的方式,在上面配置後面接著增加如下內容

        #加mss
        post-up /sbin/iptables -A FORWARD -s 1.1.1.45/27 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1436
        post-up /sbin/iptables -A OUTPUT -s 1.1.1.45/27 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1436

        #删mss
        pre-down /sbin/iptables -D FORWARD -s 1.1.1.45/27 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1436
        pre-down /sbin/iptables -D OUTPUT -s 1.1.1.45/27 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1436

然後保存並重啟你的vm,接下來設置dhcp(當然也可以不設置,之後創建vm手動設置ip)

執行apk update && apk add dhcp安裝dhcp和dhcpd,然後編輯/etc/dhcp/dhcpd.conf刪掉裡面內容並增加如下內容

subnet 1.1.1.32 netmask 255.255.255.224 {
  option routers 1.1.1.45;
  option subnet-mask 255.255.255.224;
  option broadcast-address 1.1.1.63;
  option domain-name-servers 8.8.8.8;
  range 1.1.1.46 1.1.1.60;
}

netmask為cidr對應的地址,下面的range為剩餘的15個ip,然後保存之後運行service dhcpd restart然後去esxi創建另外一個vm,網卡橋接到上面創建的新端口組進行測試,如果能分配到ip則代表dhcp服務運行正常,然後ping 8.8.8.8檢查網絡是否正常,如果正常大功告成,如果不正常檢查上面網卡/隧道/arp代理以及路由的設置.

然後將dhcpd添加到開啟啟動rc-upload add dhcpd boot然後去esxi中將軟路由vm的啟動優先級設置為最高,然後就沒有然後了

參考資料

為了感謝olvps老闆的指導,特別推薦https://olvps.com/
olvps主營俄羅斯遠東vps以及部分nat小雞最近聽說新出了德國小雞,並且支持bgp session.

996.icu 996.icu