非主流的服务器IP地址配置

非主流一:32位掩码、网关跟网卡地址不同子网

最近新入了一台vps,看到里面的网络配置有点特别,因为按照传统理解,终端的网关必须跟地址“同段”,在同一个广播域内,才能被arp找到对应的网关MAC地址完成报文的转交。

然而这台VPS的配置是这样的,这是Ubuntu系统的网络配置文件/etc/network/interfaces

# Generated by SolusVM

 auto lo
  iface lo inet loopback

 auto eth0
  iface eth0 inet static
   address 162.xxx.xxx.247
   gateway 10.0.0.0
   netmask 255.255.255.255
   dns-nameservers 1.1.1.1 1.0.0.1

 auto eth0:0
  iface eth0:0 inet static
   address 162.xxx.xxx.248
   gateway 10.0.0.0
   netmask 255.255.255.255
   dns-nameservers 1.1.1.1 1.0.0.1
# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
    link/ether 00:16:3c:58:6e:ed brd ff:ff:ff:ff:ff:ff
    inet 162.xxx.xxx.247/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet 162.xxx.xxx.248/32 scope global eth0
       valid_lft forever preferred_lft forever

# ip route show
default via 10.0.0.0 dev eth0 proto static onlink 

# arp -a
? (10.0.0.0) at 00:25:90:xx:xx:xx [ether] on eth0
? (162.xxx.xxx.225) at 00:1f:12:xx:xx:xx [ether] on eth0

# arping -i eth0 10.0.0.0
ARPING 10.0.0.0
42 bytes from 00:25:90:xx:xx:xx (10.0.0.0): index=0 time=158.519 usec
42 bytes from 00:25:90:xx:xx:xx (10.0.0.0): index=1 time=196.044 usec
42 bytes from 00:25:90:xx:xx:xx (10.0.0.0): index=2 time=202.125 usec

这里的配置,居然使用了32位的掩码,然后网关地址跟vps的地址完全不在同网段(32位掩码也没有网段可言嘛),这样工作得也很正常。arp表里确实也有10.0.0.0这个“奇葩”地址的存在。

想了一下起工作原理,其实“广播域”跟IP地址是无关的,广播域是链路层的概念,只要在链路上按广播发arp(目的MAC为FF:FF:FF:FF:FF:FF),网关地址10.0.0.0只是用来让arp广播提问”who has 10.0.0.0″,确实没必要一定跟主机地址同属一个地址子网。于是这个主机就不能“局域”通信了,所有流量都要经路由器转发,也就是/32掩码的eth端口,工作起来跟ppp链路一样。

在简单环境下,路由器划分子网段时候节省了公网IP来做网关,还能避开局域网内ARP攻击带来的影响,确实有点意思。

然后顺手把配置改成用systemd-networkd管理的:

[Match]
Name=eth0

[Network]
Address=162.xxx.xxx.247/32
Address=162.xxx.xxx.248/32
DNS=1.1.1.1
DNS=1.0.0.1

[Route]
Gateway=10.0.0.0
GatewayOnlink=yes

 

非主流二:点对点链路的无下跳网关

这个其实也不算非主流,比如家里的宽带拨号后,路由器的路由表是这样的:

# ip route
default dev ppp0 scope link metric 1 
127.0.0.0/8 dev lo  scope link 
172.16.64.1 dev ppp0  proto kernel  scope link  src 172.16.97.110 
192.168.100.0/24 dev br0  proto kernel  scope link  src 192.168.100.1 

也就是没有“下一跳”的via xxx一项,不需指定,这样的网关只需要直接交给对端。

不过这里想说的是he.net提供的ipv6隧道的配置。从tunnelbroker.net提供的范例配置,其默认网关也是这种无下跳网关:

 

在把he.net的这套配置搬到systemd-netword下的时候犯了难,基本上所有的例子都是明文写了Gateway=的下跳地址。而如果留空Gateway又会报错,不写Gateway就完全不添加默认路由。手册上也没有这种特殊写法的说明

几经折腾后还是找到了方法:

# cat /etc/systemd/network/he-ipv6.netdev 
[Match]

[NetDev]
Description=HE.net Tunnelbroker sit device
Name=he-ipv6
Kind=sit
MTUBytes=1480

[Tunnel]
Local=162.xxx.xxx.248
Remote=xxx.xxx.xxx.xxx
TTL=255

# cat /etc/systemd/network/he-ipv6.network 
[Match]
Name=he-ipv6

[Network]
Address=2001:xxxxxxxxxxx/64
DNS=2606:4700:4700::1111
DNS=2001:xxxxxxxxxxxxxxx

[Route]
Destination=::/0
GatewayOnlink=yes

总结

两个非主流在配置systemd-networkd时候都用到了GatewayOnlink=yes的配置,其文档是这么说的:

GatewayOnlink=
    The "GatewayOnlink" option tells the kernel that it does not have to check if the gateway is reachable directly by the current machine (i.e., the kernel does not need to check if the gateway is attached to the local network), so that we can insert the route in the kernel table without it being complained about. A boolean, defaults to "no".

其实就是ip addr via xxx onlink里面的onlink。

至于我为啥那么执着于systemd-networkd,这正是我最想吐槽的地方。

Linux下管理网络配置的组件很多,以前各个发行版都有自己的一套配置,rh系原生使用/etc/sysconfig/network-scripts/ifcfg*的纯脚本变量配置,但是为了配合桌面环境,引入了NetworkManager;debian系原生使用/etc/network/interfaces ,配合桌面环境,也引入了NetworkManager;本来殊途同归吧,但是NetworkManager这货太复杂了,绝大多数功能都是为了桌面应用(比如适配3G4G无线网卡、蓝牙共享网卡、手机插线上网…),在仅需要简单配置网络的环境常常成为碍事的东西;而systemd逐渐成为各大发行版的标配,用systemd-networkd配置服务器网络看起来是最合适、最通用的。然而,Ubuntu并不这么认为,为了兼容systemd-networkd和NetworkManager,不嫌麻烦更在最近的版本里面更引入了个叫做netplan.io的项目……学不动求不更!

 

所以不管什么发行版,只要不是做桌面的机器,我一律清理那些琐碎配置组件,用systemd-networkd统一接管:

#ubuntu 18.04
apt remove -y resolvconf netplan.io nplan network-manager ufw
apt install -y iptables-persistent
rm /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl disable networking
systemctl enable systemd-networkd
systemctl enable systemd-resolved

##各种配置

#Fedora/CentOS7

yum/dnf erase NetworkManager firewalld
yum/dnf install -y iptables-services iptables-nft iptables-utils

 

 

 

标签: , , , , ,

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.