made iptables for the VPN connection more secure

Added destination and source definition. Flag -S can be used
to ignore this. It's the new default as it is more secure
and does not impact the way things work (backwords compatible).

(cherry picked from commit ef3b4bb4e3342f166489034fa7149540d2ef1383)


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/47754a68
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/47754a68
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/47754a68

Branch: refs/heads/4.4
Commit: 47754a68acbcb1f582c80d5156375da0716727a8
Parents: 03bf241
Author: Remi Bergsma <rberg...@schubergphilis.com>
Authored: Mon Dec 8 19:06:55 2014 +0100
Committer: Daan Hoogland <d...@onecht.net>
Committed: Tue Dec 9 10:54:44 2014 +0100

----------------------------------------------------------------------
 .../debian/config/opt/cloud/bin/ipsectunnel.sh  | 26 ++++++++++++++------
 1 file changed, 18 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/47754a68/systemvm/patches/debian/config/opt/cloud/bin/ipsectunnel.sh
----------------------------------------------------------------------
diff --git a/systemvm/patches/debian/config/opt/cloud/bin/ipsectunnel.sh 
b/systemvm/patches/debian/config/opt/cloud/bin/ipsectunnel.sh
index a95c65e..e0af6a2 100755
--- a/systemvm/patches/debian/config/opt/cloud/bin/ipsectunnel.sh
+++ b/systemvm/patches/debian/config/opt/cloud/bin/ipsectunnel.sh
@@ -23,7 +23,7 @@ vpnoutmark="0x525"
 vpninmark="0x524"
 
 usage() {
-    printf "Usage: %s: (-A|-D) -l <left-side vpn peer> -n <left-side guest 
cidr> -g <left-side next hop> -r <right-side vpn peer> -N <right-side private 
subnets> -e <esp policy> -i <ike policy> -t <ike lifetime> -T <esp lifetime> -s 
<pre-shared secret> -d <dpd 0 or 1> [ -p <passive or not> -c <check if up on 
creation ]\n" $(basename $0) >&2
+    printf "Usage: %s: (-A|-D) -l <left-side vpn peer> -n <left-side guest 
cidr> -g <left-side next hop> -r <right-side vpn peer> -N <right-side private 
subnets> -e <esp policy> -i <ike policy> -t <ike lifetime> -T <esp lifetime> -s 
<pre-shared secret> -d <dpd 0 or 1> [ -p <passive or not> -c <check if up on 
creation> -S <disable vpn ports iptables> ]\n" $(basename $0) >&2
 }
 
 #set -x
@@ -61,13 +61,16 @@ enable_iptables_subnets() {
   return 0
 }
 
+#
+# Add the right side here to close the gap, so we're sure no one else comes in
+#   also double check the default behaviour of ipsec to drop if wrong....
 check_and_enable_iptables() {
   sudo iptables-save | grep "A INPUT -i $outIf -p udp -m udp --dport 500 -j 
ACCEPT"
   if [ $? -ne 0 ]
   then
-      sudo iptables -A INPUT -i $outIf -p udp -m udp --dport 500 -j ACCEPT
-      sudo iptables -A INPUT -i $outIf -p udp -m udp --dport 4500 -j ACCEPT
-      sudo iptables -A INPUT -i $outIf -p 50 -j ACCEPT
+      sudo iptables -A INPUT -i $outIf -p udp -m udp --dport 500 
$iptables_secure -j ACCEPT
+      sudo iptables -A INPUT -i $outIf -p udp -m udp --dport 4500 
$iptables_secure -j ACCEPT
+      sudo iptables -A INPUT -i $outIf -p 50 $iptables_secure -j ACCEPT
       # Prevent NAT on "marked" VPN traffic, so need to be the first one on 
POSTROUTING chain
       sudo iptables -t nat -I POSTROUTING -t nat -o $outIf -m mark --mark 
$vpnoutmark -j ACCEPT
   fi
@@ -90,9 +93,9 @@ check_and_disable_iptables() {
   if [ $? -ne 0 ]
   then
     #Nobody else use s2s vpn now, so delete the iptables rules
-    sudo iptables -D INPUT -i $outIf -p udp -m udp --dport 500 -j ACCEPT
-    sudo iptables -D INPUT -i $outIf -p udp -m udp --dport 4500 -j ACCEPT
-    sudo iptables -D INPUT -i $outIf -p 50 -j ACCEPT
+    sudo iptables -D INPUT -i $outIf -p udp -m udp --dport 500 
$iptables_secure -j ACCEPT
+    sudo iptables -D INPUT -i $outIf -p udp -m udp --dport 4500 
$iptables_secure -j ACCEPT
+    sudo iptables -D INPUT -i $outIf -p 50 $iptables_secure -j ACCEPT
     sudo iptables -t nat -D POSTROUTING -t nat -o $outIf -m mark --mark 
$vpnoutmark -j ACCEPT
   fi
   return 0
@@ -213,8 +216,9 @@ sflag=
 passive=0
 op=""
 checkup=0
+secure=1
 
-while getopts 'ADpcl:n:g:r:N:e:i:t:T:s:d:' OPTION
+while getopts 'ADSpcl:n:g:r:N:e:i:t:T:s:d:' OPTION
 do
   case $OPTION in
   A)    opflag=1
@@ -260,6 +264,8 @@ do
         ;;
   c)    checkup=1
         ;;
+  S)    secure=0
+        ;;
   ?)    usage
         exit 2
         ;;
@@ -267,6 +273,10 @@ do
 done
 
 logger -t cloud "$(basename $0): parameters $*"
+if [ $secure -eq 1 ]
+then
+   iptables_secure=" -s $rightpeer -d $leftpeer "
+fi
 
 # get interface for public ip
 ip link|grep BROADCAST|grep -v eth0|cut -d ":" -f 2 > /tmp/iflist

Reply via email to