【问题标题】:Injecting iptables rule after libvirt network is created with terraform 0.11使用 terraform 0.11 创建 libvirt 网络后注入 iptables 规则
【发布时间】:2019-11-08 12:33:44
【问题描述】:

我有以下场景:我正在使用 terraform(0.11 版)创建多个带有 libvirt 的虚拟机。 VM 连接到 NAT 虚拟网络。作为 VM 创建的一部分,一些命令通过 ssh 在每个 VM 上执行。如果在运行 terraform 的同一台机器上创建虚拟机,这将非常有效。

现在,我希望能够在我的桌面上运行 terraform,并在另一台具有更多资源的机器上创建虚拟机。我做了这个改变qemu的uri指向远程服务器。 VM 创建工作正常,但是当 terraform 尝试从我的机​​器 ssh 到 VM 时,它会失败,因为默认情况下 libvirt 不会将 VM 暴露给外部访问。

因此,我创建了一个额外的资源来在远程计算机上运行命令,在创建虚拟网络之后和访问 VM 之前向 iptables 添加规则。请参阅下面的代码作为参考。请注意它已被编辑。

resource "libvirt_network" "network" {
  name   = "${var.stack_name}-network"
  mode   = "${var.network_mode}"  <-- this is NAT
  domain = "${var.dns_domain}"    

  dns = {
    enabled = true
  }

  addresses = ["${var.network_cidr}"]  <- 10.17.0.0/22
}

resource "null_resource" "iptables" {
  depends_on = ["libvirt_network.network"]

  connection {
    host     = <remote server>
    password = "******"
    user     = <ssh user>
    type     = "ssh"
  }

  provisioner "remote-exec" {
    inline = [
      "sudo iptables -I FORWARD 1 -d ${var.network_cidr} -p tcp --dport 22 -j ACCEPT",
    ]
  }
}

resource "libvirt_domain" "vm" {

  depends_on = ["null_resource.iptables"]
  count = "${vars.vms}" 
   ... 
}

resource "null_resource" "config" {
  depends_on = ["libvirt_domain.vm"]

  connection {
    host = "${element(libvirt_domain.vm.*.network_interface.0.addresses.0, count.index)}"
    ...
  }

  provisioner "remote-exec" {   <-- this is the remote exec on vm    

  }
}

这种工作是因为添加了规则,但我需要新规则成为 FORWARD 链上的第一个。但是,我看到的是,该规则是在libvirt添加的规则之后一致添加的,如下所示:

1    ACCEPT     all  --  0.0.0.0/0            10.17.0.0/22         ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  10.17.0.0/22         0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
6    ACCEPT     tcp  --  0.0.0.0/0            10.17.0.0/22         tcp dpt:22

我不明白的是为什么 iptables 规则是在 libvirt 注入的规则之后创建的,如果在创建网络之后执行 iptables 命令并且在执行到 Vms 的 ssh 之前执行(我已经在 terraform 中检查了这一点输出)。

【问题讨论】:

    标签: terraform iptables libvirt


    【解决方案1】:

    我不知道您的脚本为什么不起作用的答案,但我可以向您展示实现相同目标的另一种方法。 Libvirt 有一个“钩子”的概念,它是管理员定义的脚本,将在 libvirt 的某些关键点运行:

    https://libvirt.org/hooks.html

    这里有一个使用钩子进行端口转发的说明:

    https://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections

    【讨论】:

      猜你喜欢
      • 2013-09-05
      • 2023-04-06
      • 2019-05-05
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2021-05-15
      • 2020-08-20
      • 2018-08-25
      相关资源
      最近更新 更多