在使用 terraform 0.11 创建 libvirt 网络后注入 iptables 规则
Injecting iptables rule after libvirt network is created with terraform 0.11
我遇到以下情况:我正在使用 terraform(0.11 版)通过 libvirt 创建多个 VM。 VM 附加到 NAT 虚拟网络。作为虚拟机创建的一部分,一些命令通过 ssh 在每个虚拟机上执行。如果虚拟机是在 terraform 运行s.
所在的同一台机器上创建的,这将非常有效
现在,我希望能够 运行 在我的桌面上进行 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命令是在创建网络之后执行ssh到Vms之前执行的(我已经检查过这个terraform 输出)。
我不知道您的脚本为何无法运行的答案,但我可以向您展示实现相同目标的另一种方法。 Libvirt 有一个 "hooks" 的概念,它是管理员定义的脚本,在 libvirt 的某些关键点是 运行:
https://libvirt.org/hooks.html
此处有使用钩子进行端口转发的说明:
https://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections
我遇到以下情况:我正在使用 terraform(0.11 版)通过 libvirt 创建多个 VM。 VM 附加到 NAT 虚拟网络。作为虚拟机创建的一部分,一些命令通过 ssh 在每个虚拟机上执行。如果虚拟机是在 terraform 运行s.
所在的同一台机器上创建的,这将非常有效现在,我希望能够 运行 在我的桌面上进行 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命令是在创建网络之后执行ssh到Vms之前执行的(我已经检查过这个terraform 输出)。
我不知道您的脚本为何无法运行的答案,但我可以向您展示实现相同目标的另一种方法。 Libvirt 有一个 "hooks" 的概念,它是管理员定义的脚本,在 libvirt 的某些关键点是 运行:
https://libvirt.org/hooks.html
此处有使用钩子进行端口转发的说明:
https://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections