2
2
# creates and deletes users accordingly
3
3
4
4
locals {
5
- metadata = merge (var. metadata , {
6
- sshKeys = " ${ var . remote_user } :${ tls_private_key . ssh-key . public_key_openssh } "
7
- })
8
- ssh_tag = [" allow-ssh" ]
9
- openvpn_tag = [" openvpn-${ var . name } " ]
10
- tags = toset (concat (var. tags , local. ssh_tag , local. openvpn_tag ))
11
-
12
- output_folder = var. output_dir
13
5
private_key_file = " private-key.pem"
14
6
# adding the null_resource to prevent evaluating this until the openvpn_update_users has executed
15
7
refetch_user_ovpn = null_resource. openvpn_update_users_script . id != " " ? ! alltrue ([for x in var . users : fileexists (" ${ var . output_dir } /${ x } .ovpn" )]) : false
16
- name = var. name == " " ? " " : " ${ var . name } -"
17
- access_config = [{
18
- nat_ip = google_compute_address.default.address
19
- network_tier = var.network_tier
20
- }]
21
8
}
22
9
23
- resource "google_compute_firewall" "allow-external-ssh" {
24
- name = " openvpn-${ var . name } -allow-external-ssh"
25
- project = var. project_id
26
- network = var. network
27
-
28
- allow {
29
- protocol = " tcp"
30
- ports = [" 22" ]
31
- }
32
-
33
- source_ranges = [" 0.0.0.0/0" ]
34
- target_tags = local. ssh_tag
35
- }
36
-
37
- resource "google_compute_firewall" "allow-openvpn-udp-port" {
38
- name = " openvpn-${ var . name } -allow"
10
+ resource "google_compute_firewall" "allow-ingress-to-openvpn-server" {
11
+ name = " openvpn-${ var . name } -allow-ingress"
39
12
project = var. project_id
40
13
network = var. network
41
14
description = " Creates firewall rule targeting the openvpn instance"
42
15
43
16
allow {
44
17
protocol = " tcp"
45
- ports = [" 1194" ]
18
+ ports = [" 1194" , " 22 " ]
46
19
}
47
20
48
21
allow {
@@ -51,10 +24,9 @@ resource "google_compute_firewall" "allow-openvpn-udp-port" {
51
24
}
52
25
53
26
source_ranges = [" 0.0.0.0/0" ]
54
- target_tags = local . openvpn_tag
27
+ target_tags = [ " openvpn- ${ var . name } " ]
55
28
}
56
29
57
-
58
30
resource "google_compute_address" "default" {
59
31
name = " openvpn-${ var . name } -global-ip"
60
32
project = var. project_id
@@ -63,53 +35,40 @@ resource "google_compute_address" "default" {
63
35
}
64
36
65
37
resource "tls_private_key" "ssh-key" {
66
- algorithm = " RSA"
38
+ algorithm = " ECDSA"
39
+ ecdsa_curve = " P521"
67
40
}
68
41
69
-
70
42
// SSH Private Key
71
43
resource "local_sensitive_file" "private_key" {
72
44
content = tls_private_key. ssh-key . private_key_pem
73
45
filename = " ${ var . output_dir } /${ local . private_key_file } "
74
46
file_permission = " 0400"
75
47
}
76
48
77
- resource "random_id" "this" {
78
- byte_length = " 8"
79
- }
80
-
81
- resource "random_id" "password" {
82
- byte_length = " 16"
49
+ resource "random_string" "openvpn_server_suffix" {
50
+ length = 8
51
+ special = false
52
+ upper = false
83
53
}
84
54
85
- // Use a persistent disk so that it can be remounted on another instance.
86
- resource "google_compute_disk" "this" {
87
- name = " openvpn-${ var . name } -disk"
88
- image = var. image_family
89
- size = var. disk_size_gb
90
- type = var. disk_type
91
- project = var. project_id
92
- zone = var. zone
93
- }
94
-
95
- # -------------------
96
- # Instance Template
97
- # -------------------
98
- resource "google_compute_instance_template" "tpl" {
99
- name_prefix = " openvpn-${ var . name } -"
55
+ resource "google_compute_instance" "openvpn_server" {
56
+ name = " openvpn-${ var . name } -${ random_string . openvpn_server_suffix . id } "
100
57
project = var. project_id
101
58
machine_type = var. machine_type
102
59
labels = var. labels
103
- metadata = local. metadata
104
- region = var. region
60
+ metadata = merge (
61
+ var. metadata ,
62
+ { sshKeys = " ${ var . remote_user } :${ tls_private_key . ssh-key . public_key_openssh } " }
63
+ )
64
+ zone = var. zone
105
65
106
66
metadata_startup_script = << SCRIPT
107
67
curl -O ${ var . install_script_url }
108
68
chmod +x openvpn-install.sh
109
69
mv openvpn-install.sh /home/${ var . remote_user } /
110
70
chown ${ var . remote_user } :${ var . remote_user } /home/${ var . remote_user } /openvpn-install.sh
111
71
export AUTO_INSTALL=y
112
- export PASS=1
113
72
# Using Custom DNS
114
73
export DNS=13
115
74
export DNS1="${ var . dns_servers [0 ]} "
@@ -119,63 +78,53 @@ resource "google_compute_instance_template" "tpl" {
119
78
/home/${ var . remote_user } /openvpn-install.sh
120
79
SCRIPT
121
80
122
- disk {
123
- auto_delete = var. auto_delete_disk
124
- boot = true
125
- source = google_compute_disk. this . name
81
+ boot_disk {
82
+ auto_delete = true
83
+ initialize_params {
84
+ type = " pd-standard"
85
+ image = " ubuntu-minimal-2004-focal-v20220419a"
86
+ }
126
87
}
127
88
128
89
dynamic "service_account" {
129
- for_each = [var . service_account ]
90
+ for_each = var . service_account == null ? [] : [var . service_account ]
130
91
131
92
content {
132
- email = lookup (service_account . value , " email" , null )
133
- scopes = lookup (service_account . value , " scopes" , null )
93
+ email = try (each . value . email , null )
94
+ scopes = try (each . scopes , [] )
134
95
}
135
96
}
136
97
137
98
network_interface {
138
99
network = var. network
139
100
subnetwork = var. subnetwork
140
101
141
- dynamic "access_config" {
142
- for_each = local. access_config
143
-
144
- content {
145
- nat_ip = access_config. value . nat_ip
146
- network_tier = access_config. value . network_tier
147
- }
102
+ access_config {
103
+ nat_ip = google_compute_address. default . address
104
+ network_tier = var. network_tier
148
105
}
149
106
}
150
107
151
- tags = local. tags
108
+ tags = toset (
109
+ concat (var. tags , tolist (google_compute_firewall. allow-ingress-to-openvpn-server . target_tags ))
110
+ )
111
+
152
112
153
113
lifecycle {
154
114
create_before_destroy = " true"
155
115
}
156
- }
157
116
158
- resource "google_compute_instance_from_template" "this" {
159
- name = " openvpn-${ var . name } "
160
- project = var. project_id
161
- zone = var. zone
162
-
163
- network_interface {
164
- network = var. network
165
- subnetwork = var. subnetwork
166
- access_config {
167
- nat_ip = google_compute_address. default . address
168
- network_tier = var. network_tier
169
- }
117
+ provisioner "local-exec" {
118
+ command = " ssh-keygen -R \" ${ self . network_interface [0 ]. access_config [0 ]. nat_ip } \" || true"
119
+ when = destroy
170
120
}
171
- source_instance_template = google_compute_instance_template. tpl . self_link
172
121
}
173
122
174
123
# Updates/creates the users VPN credentials on the VPN server
175
124
resource "null_resource" "openvpn_update_users_script" {
176
125
triggers = {
177
126
users = join (" ," , var. users )
178
- instance = google_compute_instance_from_template.this .instance_id
127
+ instance = google_compute_instance.openvpn_server .instance_id
179
128
}
180
129
181
130
connection {
@@ -184,6 +133,7 @@ resource "null_resource" "openvpn_update_users_script" {
184
133
host = google_compute_address. default . address
185
134
private_key = tls_private_key. ssh-key . private_key_pem
186
135
agent = false
136
+ timeout = " 60s"
187
137
}
188
138
189
139
provisioner "file" {
@@ -195,9 +145,10 @@ resource "null_resource" "openvpn_update_users_script" {
195
145
# Create New User with MENU_OPTION=1
196
146
provisioner "remote-exec" {
197
147
inline = [
198
- " while [ ! -f /etc/openvpn/server.conf ]; do sleep 10; done" ,
148
+ " while [ ! -f /etc/openvpn/server.conf ]; do sleep 1; done" ,
149
+ " while [ ! -f /etc/openvpn/client-template.txt ]; do sleep 1; done" ,
199
150
" chmod +x ~${ var . remote_user } /update_users.sh" ,
200
- " sudo ROUTE_ONLY_PRIVATE_IPS='${ var . route_only_private_ips } ' ~${ var . remote_user } /update_users.sh ${ join (" " , var. users )} " ,
151
+ " sudo REVOKE_ALL_CLIENT_CERTIFICATES=n ROUTE_ONLY_PRIVATE_IPS='${ var . route_only_private_ips } ' ~${ var . remote_user } /update_users.sh ${ join (" " , var. users )} " ,
201
152
]
202
153
when = create
203
154
}
@@ -208,10 +159,9 @@ resource "null_resource" "openvpn_update_users_script" {
208
159
when = create
209
160
}
210
161
211
- depends_on = [google_compute_instance_from_template . this , local_sensitive_file . private_key ]
162
+ depends_on = [google_compute_instance . openvpn_server , local_sensitive_file . private_key , tls_private_key . ssh-key ]
212
163
}
213
164
214
-
215
165
# Download user configurations to output_dir
216
166
resource "null_resource" "openvpn_download_configurations" {
217
167
triggers = {
0 commit comments