I work from a small office/home office, and I need to set up an IPSec site-to-site VPN between a Cisco/OpenBSD IPSec-enabled gateway and firewall running PFSense. How do I configure the VPN tunnel so that I can access remote subnet and servers behind a Cisco firewall/router securely? How do I setup a tunnel mode configuration which will provide you with an encrypted site-to-site network, allowing networks at multiple remote locations to be able to communicate using my PFSense located in my SOHO securely?

Tutorial details
Difficulty level Advanced
Root privileges Yes
Requirements PFSense
Est. reading time 15m
[/donotprint]Internet Protocol security (IPsec) uses cryptographic security mechanism to protect communications over Internet Protocol (IP) networks. IPSec protocol allows you to authenticate and encrypt all IP traffic between your local office/datacenter/SOHO and remote location. You can pass all traffic over the Internet or through networks which would otherwise be considered insecure. In this tutorial, you will set up the VPN using PFSense in tunnel mode (network-to-network VPNs) and use the ESP protocol to encrypt the VPN traffic as it traverses the Internet.

Our sample setup to configure PFSense Site-to-Site IPSec vpn tunnel

Fig.01: Howto Configure PFSense Site-to-Site IPSec VPN Tunnel (Sample Setup)

Fig.01: A simple site-to-site VPN setup

Above is a very simple site-to-site VPN, with a security gateway (SOHO and Remote IDC) linking two remote private networks and Remote IDC VPN powered by either a Cisco/OpenBSD based system and local SOHO VPN (PFSense) gateways already configured. From the above, you can see the IPSec config on is as follows:

VPN config provided by a CISCO/OpenBSD gateway located in remote IDC

Phase 1:

Phase 1 config Savings
Your peer IPv4 address
Cisco/OpenBSD gateway IPv4 address
Preshared Key YOUR-super-secret-password-key
Encryption 3DES
Authentication MD5
Diffie-Hellman Group 2
Keylife 14400

Phase 2:

Phase 2 config Values
Encryption 3DES
Authentication MD5
Perfect Forward Secrecy (PFS) Yes
Diffie-Hellman Group 2
Keylife 3600
SOHO Subnets
Remote Subnets and

Howto Configure PFSense Site-to-Site IPSec VPN Tunnel

Let us get started with the configuration.

PFSense appliance VPN IPSec configuration

pfSense must be set up and be working correctly for the existing local network environment. Both locations must be using non-overlapping LAN IP subnets. For demo purpose my PFSense appliance located at

Step #1: Login to admin webui

Fire a browser and type the following url:
Sample outputs:

Fig.02: PFSense admin Login Username and Password

Step #2: Setup the VPN Tunnel

Click on VPN > IPSec:

Fig.03: PFSense configure the vpn

You will see screen as follows. Make sure you check Enable IPsec and click Save to enable IPsec:

Fig.04: Enable PFSense

Step #3: Configure a new tunnel

Click on + button (see fig.04) to add a new IPsec tunnel Phase 1 configuration. Make sure Interface set to “WAN”, Remote Gateway to “”, Authentication Method to Pre-Shared key to “YOUR-super-secret-password-key”, Encryption to “3DES”, Authentication to “MD5”, Diffie-Hellman Group to “2”, Keylife to “14400”, and finally press the Save button.

Fig.05: PFSense New IPsec VPN Tunnel Phase 1 Configuration

You will see the message as follows on screen:

The IPsec tunnel configuration has been changed. You must apply the changes in order for them to take effect.

Click on the Apply changes button:

Fig.06: Saving Phase 1 Config

Step #4: Create a new Phase 2 config

To create a new Phase 2, click the large + inside the Phase 1 entry in the list, on the left-hand side. This expands the list to display all Phase 2 entries for this Phase 1. Click the + button on the right to add a new entry:

Gif 01: Create a new Phase 2 to build the VPN

The Phase 2 information must be set as described in Phase 2 config table (see above):

Fig. 07: PFSense IPSec VPN Phase 2 Configuration

You must set remote network as “”, Protcol to “ESP”, Encrption algorithmes to “3DES”, Hash algothrithms to “MD5”, PFS key group to “2”, lifetime to “3600” and finally click on the Save button and Apply changes button to activate the tunnel.

Step #5: Add IPSec firewall rules

By default firewall rules are automatically added to the WAN to allow the tunnel to connect, but if the option to disable automatic VPN rules is checked, then manual rules may be required. The following rules added by the firewall (you can see them by typing the pfctl -sr | grep -i ipsec command at PFSense console)

anchor "ipsec/*" all
pass out on enc0 all flags S/SA keep state label "IPsec internal host to host"
pass out route-to (rl0 inet proto udp from any to port = isakmp keep state label "IPsec: SL IPsec - outbound isakmp"
pass in on rl0 reply-to (rl0 inet proto udp from to any port = isakmp keep state label "IPsec: SL IPsec - inbound isakmp"
pass out route-to (rl0 inet proto udp from any to port = sae-urn keep state label "IPsec: SL IPsec - outbound nat-t"
pass in on rl0 reply-to (rl0 inet proto udp from to any port = sae-urn keep state label "IPsec: SL IPsec - inbound nat-t"
pass out route-to (rl0 inet proto esp from any to keep state label "IPsec: SL IPsec - outbound esp proto"
pass in on rl0 reply-to (rl0 inet proto esp from to any keep state label "IPsec: SL IPsec - inbound esp proto"

To setup IPSec firewall rules as per your needs, click on the Firewall > Rules and IPsec tab. Setup rules as per your needs.

How do I see the current status of the IPSec vpn?

Click on the Status > IPSec:

Fig.08: PFSense IPSec Status: Connect or Disconnect VPN Tunnel

You will see the screen as follows:

Fig 09: Current IPSec Status

Give it a few seconds to connect to the remote side. Once connected you will see the status as follows:

How do I test my vpn setup?

Try to ping or ssh into one of the remote server:

$ ping -c2
PING ( 56 data bytes
64 bytes from icmp_seq=0 ttl=60 time=267.420 ms
64 bytes from icmp_seq=1 ttl=60 time=271.900 ms

--- ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 267.420/269.660/271.900/2.240 ms
## try ssh now ##
$ ssh root@


And, there you have it, VPN up and running from your SOHO. For more info see the official doc here.

🐧 Get the latest tutorials on Linux, Open Source & DevOps via RSS feed or Weekly email newsletter.

🐧 15 comments so far... add one

CategoryList of Unix and Linux commands
Disk space analyzersdf ncdu pydf
File Managementcat cp mkdir tree
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network UtilitiesNetHogs dig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
15 comments… add one
  • Joe Mar 1, 2015 @ 8:33

    Thank you!

    • Nebojsa Aug 22, 2016 @ 9:13

      Hello, I have IPsec status established, but could not ping remote server. Could you please help me? Thanks in advance, BR Nebojsa

  • Noah Mar 1, 2015 @ 20:13

    Great write up. If your device supports it should use AES instead of 3DES. Also use group 5 for both phases.

    This will offer more secure connection and transport. With today’s firewall hardware there should be small performance hit with the higher security settings.

    Newer firewalls can support group 22 and higher!!

    I always use almost the highest setting if both firewalls supports it. You will have to tweak the settings to provide a good balance between performance and security.

  • tauseef Mar 2, 2015 @ 7:20

    So now i will follow the same setup process on other vpn tool because i have different vpn provider that i have found on vpnranks. This is also good but first i will try to use it on my current provider.

  • plex Mar 9, 2015 @ 0:53

    Actually it’s “pfSense” rather than “PFSense”. I know, a small typo but it’s also part of the trademark. Check out the logo on http://pfsense.org/. My fifty cents.

  • Abid May 27, 2015 @ 15:27

    Nice guide there
    I need help setting up any to any vpn. We have multiple subnets across our various branches. can you please guide me how to configure any to any vpn? I will be grateful

  • Fabio Jan 26, 2016 @ 13:12


    Why doesn´t pfsense have Key exchange version option? IPSEC phase 1 has internet protocol, interface, remote gateway and description.

    pfsense 2.1.5


  • David Lin Jun 15, 2016 @ 10:17

    many thanks, this is helpful for me. thanks again..

  • MikeD Jun 23, 2016 @ 0:33

    Thanks for the guide! It’s a great help!
    I have one Q though, I can connect from my network to other network (ipsec network) via ssh to any servers. But when I’m in the other network, and trying to connect back to our network, I can’t access the servers.

    Any help will be appreciated!


  • mamad Oct 16, 2016 @ 19:49

    hi,thanks for this helpful tutorial.
    can i contact u on skype or … for ask some question?
    i really need help

  • wwwparker Nov 29, 2016 @ 15:56

    Most often once you establish the IPsec VPN tunnel you will need to add (on pfSense anyway) Firewall Rules of type IPsec that allow the remote subnet access to your network.

    Here is an example:
    Remote subnet:

    You would add the subnet as the source and the local LAN subnet (mind your aliases) as the destination. That is usually the cause and solution to one-way traffic.

  • tatt chua Jan 23, 2017 @ 4:11


    i am using pfsense 2.2 and 2.3 on the remote site. is it able to link on two different versions?


  • Ehh May 25, 2017 @ 11:38

    So… how we do configure ipsec on pfSense? Kinda forgot that tidbit important part.

  • vinesh Aug 5, 2017 @ 9:23

    Hi we have created VPN tunneling but we are getting disconnecting tunnel with in 2 days & once we reboot pf sense its getting connected,Any one give a resolution for this issue

  • boxofrox Sep 14, 2017 @ 23:58

    The article mentions IDC. What is IDC?

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre> for code samples. Still have questions? Post it on our forum