Project

General

Profile

Setting Up a VPN into Amazon's Public Cloud VPC » History » Version 24

Michael Rasmussen, 08.10.2013 21:23
Replaced instruction on enabling port forwarding to not directly modify the kernel process tree. Instead call system utility sysctl to load the changes.

1 1 Yaron Sheffer
h1. Setting Up a VPN into Amazon's Public Cloud VPC
2 1 Yaron Sheffer
3 10 Tobias Brunner
"Amazon Web Services' VPC":http://aws.amazon.com/vpc/ (Virtual Private Cloud) is somewhat inconvenient for developers. The standard way to access it is through an IPsec "hardware VPN". In practice this means having to deal not just with IPsec, but also with BGP. This document simplifies things by using strongSwan to access the VPC instances. Neither hardware nor BGP are required.
4 1 Yaron Sheffer
5 1 Yaron Sheffer
h2. Scenario
6 1 Yaron Sheffer
7 6 Yaron Sheffer
We assume a single VPC subnet with Internet access (i.e., located behind an Internet Gateway). We have a small number of clients accessing the VPC remotely, all running on Linux machines. I believe the solution can be tweaked to allow for larger deployments. For example, you will want to replace preshared key authentication by certificate-based authentication to support a large number of clients.
8 1 Yaron Sheffer
9 1 Yaron Sheffer
h2. Solution Overview
10 1 Yaron Sheffer
11 10 Tobias Brunner
We create a new, dedicated instance serving as a VPN gateway for the whole VPC. The solution uses tunnel-mode IPsec with IKEv2 and a virtual IP pool. For simplicity, we use preshared keys rather than certificates. strongSwan is deployed on both client and gateway.
12 1 Yaron Sheffer
13 6 Yaron Sheffer
h2. General Warnings
14 6 Yaron Sheffer
15 6 Yaron Sheffer
* Debugging IPsec is hard. Debugging networking on public cloud virtual machines is hard. Please *follow these instructions carefully*.
16 12 Adam Feuer
* Amazon's cloud is constantly changing, mostly for the better. This document has been validated with the current feature set, as of today (May 2012). It may not be valid tomorrow.
17 6 Yaron Sheffer
18 1 Yaron Sheffer
h2. Solution Steps
19 1 Yaron Sheffer
20 18 Adam Feuer
# Create a new VPC instance (the minimal instance type in VPC is @m1.small@). This will become your VPN Gateway. We have used standard Ubuntu images, (Oneirc @ami-a562a9cc@ and Precise @ami-a29943cb@). Instead of launching a new, dedicated instance, you can reuse an existing instance but that would be much less secure. Note that the VPN Gateway instance can be stopped when not in use, and later restarted.
21 6 Yaron Sheffer
# Disable source/destination check on the VPN Gateway instance.
22 4 Yaron Sheffer
# Assign an Elastic IP for the instance. This will be the gateway's address, but first we will use it to access the gateway and install it.
23 10 Tobias Brunner
# Install strongSwan on the gateway (and on your client, too). We have used the version available in the repository, 4.5.2. Modify the configuration files per the next section.
24 8 Yaron Sheffer
# Enable IP forwarding on the gateway (you need to do _both_ of the following):
25 24 Michael Rasmussen
## Edit @/etc/sysctl.conf@ and uncomment the line @net.ipv4.ip_forward=1@. The next time the system reboots, it will load these settings.
26 24 Michael Rasmussen
## For the current session, run @sysctl -p@ to apply the changes to the running system.
27 1 Yaron Sheffer
# Define the gateway's security group(s) to allow incoming TCP/22, UDP/500 and UDP/4500.
28 6 Yaron Sheffer
#* Once the gateway is fully set up, you will be able to disable TCP/22 in the security group and tunnel SSH through IPsec instead of directly.
29 3 Yaron Sheffer
# Define a subnet for the virtual IP pool. It doesn't need to be inside the VPC. In our example the VPC encompasses 10.10.0.0/16, and the virtual IP pool will be drawn from 10.100.0.0/16.
30 10 Tobias Brunner
# The strongSwan Gateway will assign addresses for IPsec clients from the virtual address pool. But it needs a bit of routing help: First, note the instance ID of the VPN gateway. Then locate the routing table associated with the subnet of protected instances (this may or may not be the main routing table), and add a routing rule that routes all traffic destined to the pool's subnet (10.100.0.0/16) through the gateway.
31 1 Yaron Sheffer
# Allow any incoming traffic from the pool's subnet into all VPC instances. For example, by adding an "all traffic" rule to the @default@ security group of your VPC.
32 22 Yaron Sheffer
# For each instance that is in the VPC, disable the instance's Source/Dest. check (from the EC2 Instances page). *Edit:* this is only required for step #4 in the Bonus section below. Do not make this change unless you implement the guest instance routing-table changes.
33 1 Yaron Sheffer
# Finally, @sudo ipsec restart@ on the gateway and the client, and you are good to go!
34 1 Yaron Sheffer
35 9 Yaron Sheffer
h2. Bonus
36 9 Yaron Sheffer
37 9 Yaron Sheffer
The only job of Amazon's NAT instance is to run a single iptables rule. You can deploy that rule on your VPN gateway and save the price of a dedicated NAT instance.
38 9 Yaron Sheffer
39 9 Yaron Sheffer
# Add the "masquerade" NAT rule for the entire VPC: @sudo iptables --table nat --append POSTROUTING --source 10.10.0.0/16 -j MASQUERADE@
40 23 Michael Rasmussen
# Save the iptables configuration so that it will survive a reboot.
41 23 Michael Rasmussen
#* RHEL/CentOS machines
42 23 Michael Rasmussen
#** @/sbin/service iptables save@
43 23 Michael Rasmussen
#** This will write the rules to /etc/sysconfig/iptables.
44 23 Michael Rasmussen
#* Debian/Ubuntu machines
45 23 Michael Rasmussen
#** Install iptables-persistent, if not already installed: @apt-get install iptables-persistent@
46 23 Michael Rasmussen
#** This during install it will prompt to save current rules. Say yes, to have it create /etc/iptables/rules.v4 and /etc/iptables/rules.v6 for you.
47 23 Michael Rasmussen
#** In the future, after making changes, run @iptables-save > /etc/iptables/rules.v4@ to save.
48 21 Yaron Sheffer
# Change the EC2 routing table so that the VPN gateway (rather than the NAT instance) becomes the default route of your private subnet.
49 21 Yaron Sheffer
# As an alternative to the previous step, update the /etc/network/interfaces file on your non-accessible VPC instances to use the VPN gateway as their default route:
50 13 Adam Feuer
<pre>
51 13 Adam Feuer
# static routes
52 16 Adam Feuer
up route del -net 0.0.0.0/0 gw 10.0.10.1 dev eth0
53 14 Adam Feuer
up route add -net 0.0.0.0/0 gw 10.0.10.10 dev eth0 
54 1 Yaron Sheffer
</pre>
55 21 Yaron Sheffer
*Edit:* changing the routing table on a guest is "discouraged by Amazon":https://forums.aws.amazon.com/thread.jspa?threadID=89866. Therefore the preceding method (modification of the EC2 routing table) is preferred.
56 9 Yaron Sheffer
57 15 Adam Feuer
h2. Debugging
58 15 Adam Feuer
59 15 Adam Feuer
These instructions didn't work for me out of the box, because I set my network up a little differently. To debug, I found it useful to do the following:
60 15 Adam Feuer
61 17 Adam Feuer
* Ping the IP address of the next closest interface.
62 19 Yaron Sheffer
* If you don't get replies, you need to find out what's wrong - if there is a wrong route, IP Tables rule, or something else. Use tshark to capture and display ICMP packets (replace 192.168.254.10 with the IP address of the host you are interested in):
63 15 Adam Feuer
** To capture:
64 15 Adam Feuer
<pre>
65 15 Adam Feuer
sudo tshark -f "host 192.168.254.10" -i eth0 -w /tmp/capture.cap
66 15 Adam Feuer
</pre>
67 15 Adam Feuer
** To display:
68 15 Adam Feuer
<pre>
69 15 Adam Feuer
sudo tshark -R "icmp and host 192.168.254.10" -r /tmp/capture.cap
70 1 Yaron Sheffer
</pre>
71 17 Adam Feuer
* You may need to install tshark on the client, VPN gateway, and VPC box to get a good view of what is happening.
72 15 Adam Feuer
73 1 Yaron Sheffer
h2. Configuration Files
74 5 Yaron Sheffer
75 5 Yaron Sheffer
h3. /etc/ipsec.conf on the Client
76 4 Yaron Sheffer
77 4 Yaron Sheffer
<pre>
78 4 Yaron Sheffer
# ipsec.conf - strongSwan IPsec configuration file
79 4 Yaron Sheffer
80 4 Yaron Sheffer
# basic configuration
81 4 Yaron Sheffer
82 4 Yaron Sheffer
config setup
83 4 Yaron Sheffer
	# nat_traversal=yes
84 4 Yaron Sheffer
	charonstart=yes
85 4 Yaron Sheffer
	plutostart=no
86 4 Yaron Sheffer
	# charondebug="ike 2, knl 2, cfg 2, mgr 2, chd 2, net 2"
87 4 Yaron Sheffer
88 4 Yaron Sheffer
# Connections into AWS VPC
89 4 Yaron Sheffer
conn %default
90 4 Yaron Sheffer
	ikelifetime=60m
91 4 Yaron Sheffer
	keylife=20m
92 4 Yaron Sheffer
	rekeymargin=3m
93 1 Yaron Sheffer
	keyingtries=1
94 4 Yaron Sheffer
	keyexchange=ikev2
95 1 Yaron Sheffer
	authby=secret
96 4 Yaron Sheffer
97 4 Yaron Sheffer
conn us-east-1-vpc
98 4 Yaron Sheffer
	left=%any
99 4 Yaron Sheffer
	leftsourceip=%config
100 4 Yaron Sheffer
	leftid=<my-email-address>
101 4 Yaron Sheffer
	leftfirewall=yes
102 4 Yaron Sheffer
	right=<gateway's elastic IP>
103 1 Yaron Sheffer
	rightsubnet=10.10.0.0/16
104 6 Yaron Sheffer
	rightid=@us-east-gw.example.com
105 4 Yaron Sheffer
	auto=start
106 4 Yaron Sheffer
107 4 Yaron Sheffer
# Add connections here.
108 4 Yaron Sheffer
109 4 Yaron Sheffer
# include /var/lib/strongswan/ipsec.conf.inc
110 4 Yaron Sheffer
</pre>
111 4 Yaron Sheffer
112 4 Yaron Sheffer
h3. /etc/ipsec.secrets on the Client
113 4 Yaron Sheffer
114 4 Yaron Sheffer
<pre>
115 6 Yaron Sheffer
us-east-gw.example.com : PSK "aa82c7a776e2175114213acc02dda9951a6bc25deb433e6d5d6ef7058626c589"
116 4 Yaron Sheffer
</pre>
117 4 Yaron Sheffer
118 4 Yaron Sheffer
h3. /etc/ipsec.conf on the Gateway
119 4 Yaron Sheffer
120 4 Yaron Sheffer
<pre>
121 4 Yaron Sheffer
# ipsec.conf - strongSwan IPsec configuration file
122 4 Yaron Sheffer
123 4 Yaron Sheffer
# basic configuration
124 4 Yaron Sheffer
125 4 Yaron Sheffer
config setup
126 4 Yaron Sheffer
	# nat_traversal=yes
127 4 Yaron Sheffer
	charonstart=yes
128 4 Yaron Sheffer
	plutostart=no
129 7 Yaron Sheffer
	# charondebug="ike 2, knl 2, cfg 2, mgr 3, chd 2, net 2"
130 1 Yaron Sheffer
131 4 Yaron Sheffer
# /etc/ipsec.conf - strongSwan IPsec configuration file
132 4 Yaron Sheffer
133 4 Yaron Sheffer
conn %default
134 4 Yaron Sheffer
	ikelifetime=60m
135 4 Yaron Sheffer
	keylife=20m
136 4 Yaron Sheffer
	rekeymargin=3m
137 4 Yaron Sheffer
	keyingtries=1
138 4 Yaron Sheffer
	keyexchange=ikev2
139 4 Yaron Sheffer
	authby=secret
140 4 Yaron Sheffer
141 4 Yaron Sheffer
conn client
142 7 Yaron Sheffer
	# The leftid parameter is not a real DNS name
143 4 Yaron Sheffer
	leftid=us-east-gw.example.com
144 7 Yaron Sheffer
	# The "left" parameter is the gateway's private IP 
145 4 Yaron Sheffer
	left=10.10.0.10
146 4 Yaron Sheffer
	# We are protecting the entire VPC, not just this subnet
147 1 Yaron Sheffer
	leftsubnet=10.10.0.0/16
148 4 Yaron Sheffer
	leftfirewall=yes
149 4 Yaron Sheffer
	right=%any
150 4 Yaron Sheffer
	# The virtual IP pool is outside the VPC!
151 4 Yaron Sheffer
	rightsourceip=10.100.255.0/28
152 4 Yaron Sheffer
	auto=add
153 4 Yaron Sheffer
154 4 Yaron Sheffer
# Add connections here.
155 4 Yaron Sheffer
156 1 Yaron Sheffer
# include /var/lib/strongswan/ipsec.conf.inc
157 4 Yaron Sheffer
</pre>
158 4 Yaron Sheffer
159 4 Yaron Sheffer
h3. /etc/ipsec.secrets on the Gateway
160 6 Yaron Sheffer
161 5 Yaron Sheffer
<pre>
162 4 Yaron Sheffer
<my-email-address> : PSK "aa82c7a776e2175114213acc02dda9951a6bc25deb433e6d5d6ef7058626c589"
163 1 Yaron Sheffer
</pre>