Ubuntu+Libvirt+iptables软路由配置

软路由基本配置

奔腾G3258,技嘉B85-HD3 Rev. 2.1(喂
2*8GB DDR3-2133@1400(喂喂
华硕R9 280X 3G(喂喂喂
XFX XTR550(喂喂喂喂
Ubuntu 16.04.5, kernel 4.4.0-140(终于正常点了
Libvirt自带软路由+网桥,nat模式,开机自动配置iptables
手动通过brctl命令添加物理LAN口

Libvirt软路由/网桥的配置

配置入口:

root@localhost:~# virsh
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # net-edit default

会通过Vim打开default网络的配置文件,大致如下所示:


  default
  ...
  
    
  
  
  
  
    
      ...
    
  

这里可以填natroutebridge等值,详细的取值及含义见这里。

由于WAN端有IP-MAC绑定,虚拟机及软路由LAN端的机器需要通过NAT访问网络,以使用WAN口的IP及MAC。
nat模式会在iptables中配置如下路由规则:

root@localhost:~# iptables -t filter -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -i enp3s0 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -o enp3s0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
root@localhost:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -o enp3s0 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -o enp3s0 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -o enp3s0 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -o enp3s0 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -o enp3s0 -j MASQUERADE

其中转发规则包括:

  • 允许WAN到LAN的指定IP段,指定状态(RELATED,ESTABLISHED)的连接
  • 允许LAN的指定IP段到WAN的连接
  • 允许LAN内部的连接
  • 禁止传入传出LAN网桥的其他(非指定IP段)的连接

另外在NAT模式下,nat表内配置有一些针对传出连接的masquerade规则。

如果您的网络环境没有限制,也可以尝试

  • 路由(routed)/转发(forward):,允许WAN到LAN的传入连接,而无论其状态如何
  • 开放:,有转发,没有防火墙规则
  • 封闭: 这两个标签及之间的内容都删掉,不配置转发

等模式。相应地自动生成的防火墙配置见这里

添加物理LAN口

之后手动添加USB 3.0千兆网卡作为物理LAN口:

root@localhost:~# brctl addif virbr0 enx123456789012

如果是长期安装在软路由上的网卡,也可以将该命令写入/etc/rc.local
例如要添加名为enp5s0的PCI网卡,可以在该文件中写入:

brctl addif virbr0 enp5s0

为什么是这样一个畸形的硬件配置?

要不是为了写另一篇文章,我都不想管这台机器叫软路由。。。叫“存储服务器”或者“文件服务器”更合适一些。
奔腾G3258:当然是为了超频买的啊,平时限制一下频率,降点电压,也耗不了多少电。
2*8GB DDR3-2133:当时眼馋APU平台,所以屯内存的时候就直接要了DDR3-2133,实际对G3258来说是浪费,而Ryzen又都要DDR4。。。
华硕R9 280X 3G:某宝买的,想拿来学OpenCL,做双精度浮点运算,结果连驱动有没有装上都不知道。
机箱是GAMEMAX的老款龙骑士,自带8个3.5硬盘位+1个热插拔3.5/2.5硬盘位+3个5.25光驱位,背板上正对电源的位置有两个理线用的塑料卡子,塞一块SATA SSD做启动盘还不是美滋滋。3个光驱位当然是转成硬盘位啦,我用的是某某科的3转4硬盘架,3转5没敢考虑。
主板自带6个SATA口,配一块8个SAS口的转接卡正好是14口,上面的机箱也正好是14个硬盘位,强迫症患者表示极度舒适。我用的转接卡是IBM M1015刷IT固件。
这些东西堆下来,550W的电源差不多够了,只要别让CPU显卡同时满载,同时所有机械硬盘同时启动即可(这得多苛刻啊)。为了接这么多块硬盘,模组电源+模组线自然是必不可少的,XTR550有4个硬盘供电口,自己做三条1转4 SATA的模组线给12块机械硬盘供电,再用一条自带的模组线给SSD、热插拔硬盘位和风扇供电。

为什么要用Libvirt?直接iptables+dnsmasq不就好了吗?

因为Libvirt已经装在这台机器上了,而且virbr0这个网桥已经配置好NAT和DHCP了,就这么简单。
直接iptables+dnsmasq的话,转发倒是好说,dnsmasq里面还有不少Option,每个都是坑,一时半会搞不定(捂脸)

你可能感兴趣的:(Ubuntu+Libvirt+iptables软路由配置)