<% server.interfaces do |interface| -%>
allow ^<%= Regexp.quote(interface[:address]) %>$
<% end -%>
-<% if server[:openvpn] -%>
-allow ^<%= Regexp.quote(server[:openvpn][:address]) %>$
-<% end -%>
<% end -%>
<% node[:munin][:allow].each do |address| -%>
allow ^<%= Regexp.quote(address) %>$
"scope" => "link"
)
end
-
- if interface[:role] == "internal" && interface[:gateway] != interface[:address]
- search(:node, "networking_interfaces*address:#{interface[:gateway]}") do |gateway|
- next unless gateway[:openvpn]
-
- gateway[:openvpn][:tunnels].each_value do |tunnel|
- if tunnel[:peer][:address]
- deviceplan["routes"].push(
- "to" => "#{tunnel[:peer][:address]}/32",
- "via" => interface[:gateway]
- )
-
- route tunnel[:peer][:address] do
- netmask "255.255.255.255"
- gateway interface[:gateway]
- device interface[:interface]
- end
- end
-
- next unless tunnel[:peer][:networks]
-
- tunnel[:peer][:networks].each do |network|
- prefix = IPAddr.new("#{network[:address]}/#{network[:netmask]}").prefix
-
- deviceplan["routes"].push(
- "to" => "#{network[:address]}/#{prefix}",
- "via" => interface[:gateway]
- )
-
- route network[:address] do
- netmask network[:netmask]
- gateway interface[:gateway]
- device interface[:interface]
- end
- end
- end
- end
- end
end
if interface[:routes]
interface[:routes].each do |to, parameters|
+ next if parameters[:via] == interface[:address]
+
route = {
"to" => to
}
content keys["wireguard"]
end
+ if node[:roles].include?("gateway")
+ search(:node, "roles:gateway") do |gateway|
+ next if gateway.name == node.name
+ next unless gateway[:networking][:wireguard] && gateway[:networking][:wireguard][:enabled]
+
+ allowed_ips = gateway.interfaces(:role => :internal).map do |interface|
+ "#{interface[:network]}/#{interface[:metric]}"
+ end
+
+ node.default[:networking][:wireguard][:peers] << {
+ :public_key => gateway[:networking][:wireguard][:public_key],
+ :allowed_ips => allowed_ips,
+ :endpoint => "#{gateway.name}:51820"
+ }
+ end
+ end
+
template "/etc/systemd/network/wireguard.netdev" do
source "wireguard.netdev.erb"
owner "root"
rate_limit "s:1/sec:5"
end
-%w[ucl ams bm].each do |zone|
- firewall_rule "accept-openvpn-#{zone}" do
- action :accept
- source zone
- dest "fw"
- proto "udp"
- dest_ports "1194:1197"
- source_ports "1194:1197"
- end
-end
-
if node[:networking][:wireguard][:enabled]
firewall_rule "accept-wireguard" do
action :accept
+++ /dev/null
-# OpenVPN
-
-This cookbook installs and configures OpenVPN used for secure network
-connections between our datacentres.
+++ /dev/null
-default[:openvpn][:tunnels] = {}
-default[:openvpn][:keys] = {}
+++ /dev/null
-name "openvpn"
-maintainer "OpenStreetMap Administrators"
-maintainer_email "admins@openstreetmap.org"
-license "Apache-2.0"
-description "Installs and configures OpenVPN"
-
-version "1.0.0"
-supports "ubuntu"
+++ /dev/null
-#
-# Cookbook:: openvpn
-# Recipe:: default
-#
-# Copyright:: 2012, OpenStreetMap Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-package "openvpn"
-
-service "openvpn" do
- action [:enable, :start]
- supports :status => true, :restart => true, :reload => true
- ignore_failure true
-end
-
-node[:openvpn][:tunnels].each do |name, details|
- peer = search(:node, "fqdn:#{details[:peer][:host]}").first
-
- if peer
- if peer[:openvpn] && !details[:peer][:address]
- node.default[:openvpn][:tunnels][name][:peer][:address] = peer[:openvpn][:address]
- end
-
- node.default[:openvpn][:tunnels][name][:peer][:networks] = peer.interfaces(:role => :internal).collect do |interface|
- { :address => interface[:network], :netmask => interface[:netmask] }
- end
- else
- node.default[:openvpn][:tunnels][name][:peer][:networks] = []
- end
-
- if details[:mode] == "client"
- execute "openvpn-genkey-#{name}" do
- command "openvpn --genkey --secret /etc/openvpn/#{name}.key"
- user "root"
- group "root"
- creates "/etc/openvpn/#{name}.key"
- end
-
- if File.exist?("/etc/openvpn/#{name}.key")
- node.default[:openvpn][:keys][name] = IO.read("/etc/openvpn/#{name}.key")
- end
- elsif peer && peer[:openvpn]
- file "/etc/openvpn/#{name}.key" do
- owner "root"
- group "root"
- mode "600"
- content peer[:openvpn][:keys][name]
- end
- end
-
- if node[:openvpn][:tunnels][name][:peer][:address]
- template "/etc/openvpn/#{name}.conf" do
- source "tunnel.conf.erb"
- owner "root"
- group "root"
- mode "644"
- variables :name => name,
- :address => node[:openvpn][:address],
- :port => node[:openvpn][:tunnels][name][:port],
- :mode => node[:openvpn][:tunnels][name][:mode],
- :peer => node[:openvpn][:tunnels][name][:peer]
- notifies :restart, "service[openvpn]"
- end
- else
- file "/etc/openvpn/#{name}.conf" do
- action :delete
- end
- end
-end
+++ /dev/null
-# DO NOT EDIT - This file is being maintained by Chef
-
-# Set the local port to use
-port <%= @port %>
-
-# Use UDP
-proto udp
-
-# Use routed IP tunnels
-dev tun
-
-# Use shared secret authentication
-secret <%= @name %>.key
-
-# Run in peer-to-peer mode
-mode p2p
-<% if @mode == "client" -%>
-
-# Connect to the remote machine
-remote <%= @peer[:host] %> <%= @peer[:port] %>
-<% end -%>
-
-# Configure interface and routing
-ifconfig <%= @address %> <%= @peer[:address] %>
-<% @peer[:networks].each do |network| -%>
-route <%= network[:address] %> <%= network[:netmask] %>
-<% end -%>
-
-# Keepalive - check every 10 seconds and reset after 2 minutes
-keepalive 10 120
-
-# Use AES-128 as the cipher
-cipher AES-128-CBC
-
-# Run unprivileged
-user nobody
-group nogroup
-
-# Reuse resources on restart to avoid privilege problems
-persist-key
-persist-tun
-
-# Set log verbosity
-verb 3
:internal => {
:inet => {
:prefix => "20",
- :gateway => "10.0.32.20"
+ :gateway => "10.0.32.20",
+ :routes => {
+ "10.0.0.0/8" => { :via => "10.0.32.20" }
+ }
}
},
:external => {
:internal => {
:inet => {
:prefix => "20",
- :gateway => "10.0.48.10"
+ :gateway => "10.0.48.10",
+ :routes => {
+ "10.0.0.0/8" => { :via => "10.0.48.10" }
+ }
}
},
:external => {
description "Role applied to all network gateways"
default_attributes(
+ :networking => {
+ :wireguard => { :enabled => true }
+ },
:sysctl => {
:network_forwarding => {
:comment => "Enable forwarding",
}
}
},
- :openvpn => {
- :address => "10.0.16.5",
- :tunnels => {
- :ic2bm => {
- :port => "1194",
- :mode => "server",
- :peer => {
- :host => "ironbelly.openstreetmap.org"
- }
- },
- :aws2bm => {
- :port => "1195",
- :mode => "server",
- :peer => {
- :host => "fafnir.openstreetmap.org"
- }
- },
- :ucl2bm => {
- :port => "1196",
- :mode => "server",
- :peer => {
- :host => "ridley.openstreetmap.org"
- }
- }
- }
- },
:planet => {
:replication => "disabled"
}
"role[web-storage]",
"role[backup]",
"role[planet]",
- # "role[planetdump]",
- "recipe[openvpn]"
+ # "role[planetdump]"
)
}
}
},
- :openvpn => {
- :address => "10.0.16.2",
- :tunnels => {
- :ic2ucl => {
- :port => "1194",
- :mode => "server",
- :peer => {
- :host => "ridley.openstreetmap.org"
- }
- },
- :aws2ic => {
- :port => "1195",
- :mode => "server",
- :peer => {
- :host => "fafnir.openstreetmap.org"
- }
- },
- :ic2bm => {
- :port => "1196",
- :mode => "client",
- :peer => {
- :host => "grisu.openstreetmap.org",
- :port => "1194"
- }
- }
- }
- },
:planet => {
:replication => "enabled"
},
"role[planetdump]",
"recipe[rsyncd]",
"recipe[dhcpd]",
- "recipe[openvpn]",
"recipe[tilelog]"
)
:address => "10.0.0.3"
}
}
- },
- :openvpn => {
- :address => "10.0.16.1",
- :tunnels => {
- :ic2ucl => {
- :port => "1194",
- :mode => "client",
- :peer => {
- :host => "ironbelly.openstreetmap.org",
- :port => "1194"
- }
- },
- :shenron2ucl => {
- :port => "1195",
- :mode => "client",
- :peer => {
- :host => "shenron.openstreetmap.org",
- :port => "1194"
- }
- },
- :ucl2bm => {
- :port => "1196",
- :mode => "client",
- :peer => {
- :host => "grisu.openstreetmap.org",
- :port => "1196"
- }
- },
- :firefishy => {
- :port => "1197",
- :mode => "client",
- :peer => {
- :host => "home.firefishy.com",
- :port => "1194",
- :address => "10.0.16.201"
- }
- }
- }
}
)
"role[donate]",
"recipe[hot]",
"recipe[dmca]",
- "recipe[dhcpd]",
- "recipe[openvpn]"
+ "recipe[dhcpd]"
)
:modules => [
"it87"
]
- },
- :openvpn => {
- :address => "10.0.16.3",
- :tunnels => {
- :shenron2ucl => {
- :port => "1194",
- :mode => "server",
- :peer => {
- :host => "ridley.openstreetmap.org"
- }
- }
- }
}
)
"role[trac]",
"role[osqa]",
"role[irc]",
- "recipe[blogs]",
- "recipe[openvpn]"
+ "recipe[blogs]"
)
:internal => {
:inet => {
:prefix => "20",
- :gateway => "10.0.0.3"
+ :gateway => "10.0.0.3",
+ :routes => {
+ "10.0.0.0/8" => { :via => "10.0.0.3" }
+ }
}
},
:external => {
:gateway => "193.60.236.254"
}
}
+ },
+ :wireguard => {
+ :keepalive => 180
}
}
)