blob: 36c6cc62cfbf90f716a86846fa92317f6b6bc140 [file] [log] [blame] [edit]
# An example of how to connect two GCE networks with a VPN
provider "google" {
credentials = file("~/gce/account.json")
project = var.project
region = var.region1
}
# Create the two networks we want to join. They must have separate, internal
# ranges.
resource "google_compute_network" "network1" {
name = "network1"
ipv4_range = "10.120.0.0/16"
}
resource "google_compute_network" "network2" {
name = "network2"
ipv4_range = "10.121.0.0/16"
}
# Attach a VPN gateway to each network.
resource "google_compute_vpn_gateway" "target_gateway1" {
name = "vpn1"
network = google_compute_network.network1.self_link
region = var.region1
}
resource "google_compute_vpn_gateway" "target_gateway2" {
name = "vpn2"
network = google_compute_network.network2.self_link
region = var.region2
}
# Create an outward facing static IP for each VPN that will be used by the
# other VPN to connect.
resource "google_compute_address" "vpn_static_ip1" {
name = "vpn-static-ip1"
region = var.region1
}
resource "google_compute_address" "vpn_static_ip2" {
name = "vpn-static-ip2"
region = var.region2
}
# Forward IPSec traffic coming into our static IP to our VPN gateway.
resource "google_compute_forwarding_rule" "fr1_esp" {
name = "fr1-esp"
region = var.region1
ip_protocol = "ESP"
ip_address = google_compute_address.vpn_static_ip1.address
target = google_compute_vpn_gateway.target_gateway1.self_link
}
resource "google_compute_forwarding_rule" "fr2_esp" {
name = "fr2-esp"
region = var.region2
ip_protocol = "ESP"
ip_address = google_compute_address.vpn_static_ip2.address
target = google_compute_vpn_gateway.target_gateway2.self_link
}
# The following two sets of forwarding rules are used as a part of the IPSec
# protocol
resource "google_compute_forwarding_rule" "fr1_udp500" {
name = "fr1-udp500"
region = var.region1
ip_protocol = "UDP"
port_range = "500"
ip_address = google_compute_address.vpn_static_ip1.address
target = google_compute_vpn_gateway.target_gateway1.self_link
}
resource "google_compute_forwarding_rule" "fr2_udp500" {
name = "fr2-udp500"
region = var.region2
ip_protocol = "UDP"
port_range = "500"
ip_address = google_compute_address.vpn_static_ip2.address
target = google_compute_vpn_gateway.target_gateway2.self_link
}
resource "google_compute_forwarding_rule" "fr1_udp4500" {
name = "fr1-udp4500"
region = var.region1
ip_protocol = "UDP"
port_range = "4500"
ip_address = google_compute_address.vpn_static_ip1.address
target = google_compute_vpn_gateway.target_gateway1.self_link
}
resource "google_compute_forwarding_rule" "fr2_udp4500" {
name = "fr2-udp4500"
region = var.region2
ip_protocol = "UDP"
port_range = "4500"
ip_address = google_compute_address.vpn_static_ip2.address
target = google_compute_vpn_gateway.target_gateway2.self_link
}
# Each tunnel is responsible for encrypting and decrypting traffic exiting
# and leaving its associated gateway
resource "google_compute_vpn_tunnel" "tunnel1" {
name = "tunnel1"
region = var.region1
peer_ip = google_compute_address.vpn_static_ip2.address
shared_secret = "a secret message"
target_vpn_gateway = google_compute_vpn_gateway.target_gateway1.self_link
depends_on = [
google_compute_forwarding_rule.fr1_udp500,
google_compute_forwarding_rule.fr1_udp4500,
google_compute_forwarding_rule.fr1_esp,
]
}
resource "google_compute_vpn_tunnel" "tunnel2" {
name = "tunnel2"
region = var.region2
peer_ip = google_compute_address.vpn_static_ip1.address
shared_secret = "a secret message"
target_vpn_gateway = google_compute_vpn_gateway.target_gateway2.self_link
depends_on = [
google_compute_forwarding_rule.fr2_udp500,
google_compute_forwarding_rule.fr2_udp4500,
google_compute_forwarding_rule.fr2_esp,
]
}
# Each route tells the associated network to send all traffic in the dest_range
# through the VPN tunnel
resource "google_compute_route" "route1" {
name = "route1"
network = google_compute_network.network1.name
next_hop_vpn_tunnel = google_compute_vpn_tunnel.tunnel1.self_link
dest_range = google_compute_network.network2.ipv4_range
priority = 1000
}
resource "google_compute_route" "route2" {
name = "route2"
network = google_compute_network.network2.name
next_hop_vpn_tunnel = google_compute_vpn_tunnel.tunnel2.self_link
dest_range = google_compute_network.network1.ipv4_range
priority = 1000
}
# We want to allow the two networks to communicate, so we need to unblock
# them in the firewall
resource "google_compute_firewall" "network1-allow-network1" {
name = "network1-allow-network1"
network = google_compute_network.network1.name
source_ranges = [google_compute_network.network1.ipv4_range]
allow {
protocol = "tcp"
}
allow {
protocol = "udp"
}
allow {
protocol = "icmp"
}
}
resource "google_compute_firewall" "network1-allow-network2" {
name = "network1-allow-network2"
network = google_compute_network.network1.name
source_ranges = [google_compute_network.network2.ipv4_range]
allow {
protocol = "tcp"
}
allow {
protocol = "udp"
}
allow {
protocol = "icmp"
}
}