A lot of our customers in Rackspace cloud has been asking how to mass edit firewalls of servers when you have multiple servers without doing it manually.

Part of my cloudservers-api-demo I have written a simple firewall scripts abstracting the Operating System firewall software to allow/enable/disable the firewall and ports/networks.

The script has been kept very simple by design and currently allow only to :

<p style="display: inline !important;">
  enable the firewall
</p>

<p>
  </span></li> 
  
  <li>
    <span style="font-size: medium;"> 
    
    <p style="display: inline !important;">
      disable the firewall
    </p>
    
    <p>
      </span></li> 
      
      <li>
        <span style="font-size: medium;"> 
        
        <p style="display: inline !important;">
          allow or disallow a port or a network
        </p>
        
        <p>
          </span></li> 
          
          <li>
            <span style="font-size: medium;"> 
            
            <p style="display: inline !important;">
              see firewall status
            </p>
            
            <p>
              </span></li> </ul> 
              
              <h3>
                PREREQUISITES
              </h3>
              
              <ul>
                <li>
                  <span style="font-size: medium;"> 
                  
                  <p style="display: inline !important;">
                    A management server under Ubuntu maverick.
                  </p>
                  
                  <p>
                    </span></li> 
                    
                    <li>
                      <span style="font-size: medium;"> 
                      
                      <p style="display: inline !important;">
                        A supported Operating System for clients which includes :
                      </p>
                      
                      <p>
                        </span></li> 
                        
                        <li>
                          <span style="font-size: medium;"> 
                          
                          <p style="display: inline !important;">
                            Debian.
                          </p>
                          
                          <p>
                            </span></li> 
                            
                            <li>
                              <span style="font-size: medium;"> 
                              
                              <p style="display: inline !important;">
                                Ubuntu.
                              </p>
                              
                              <p>
                                </span></li> 
                                
                                <li>
                                  <span style="font-size: medium;"> 
                                  
                                  <p style="display: inline !important;">
                                    RHEL.
                                  </p>
                                  
                                  <p>
                                    </span></li> 
                                    
                                    <li>
                                      <span style="font-size: medium;"> 
                                      
                                      <p style="display: inline !important;">
                                        Fedora
                                      </p>
                                      
                                      <p>
                                        </span></li> 
                                        
                                        <li>
                                          <span style="font-size: medium;"> 
                                          
                                          <p style="display: inline !important;">
                                            My patched python-cloudservers library (see below for installs).
                                          </p>
                                          
                                          <p>
                                            </span></li> 
                                            
                                            <li>
                                              <span style="font-size: medium;"> 
                                              
                                              <p style="display: inline !important;">
                                                Your SSH key installed on all VM for root users.
                                              </p>
                                              
                                              <p>
                                                </span></li> </ul> 
                                                
                                                <h3>
                                                  Install
                                                </h3>
                                                
                                                <ul>
                                                  <li>
                                                    <span style="font-size: medium;"> 
                                                    
                                                    <p style="display: inline !important;">
                                                      After you have kicked a VM with a Ubuntu maverick and connected to it as root you want first execute intall some prereq packages :
                                                    </p>
                                                    
                                                    <p>
                                                      </span></li> </ul> 
apt-get update && apt-get -y install python-stdeb git
                                                      <p>
                                                        checkout my python-cloudservers library :
                                                      </p>
git clone git://github.com/chmouel/python-cloudservers.git
                                                      <p>
                                                        after being checked-out you will go into the python-cloudservers directory which has just been created and do this :
                                                      </p>
cd python-cloudservers/
python setup.py install
                                                      <p>
                                                        this should automatically install all the dependences.
                                                      </p>
                                                      
                                                      <p>
                                                        Now you can install my api-demo which include the firewall script :
                                                      </p>
cd ../
git clone git://github.com/chmouel/cloudservers-api-demo
                                                      <p>
                                                        You need to configure some environemnt variable first which keep information about your rackspace account.
                                                      </p>
                                                      
                                                      <p>
                                                        edit your ~/.bashrc (or /etc/environement if you want to make it global) and configure those variable :
                                                      </p>
export RCLOUD_DATACENTER=UK
export UK_RCLOUD_USER="MY_USERNAME"
export UK_RCLOUD_KEY="MY_API_KEY"
export UK_RCLOUD_AURL="https://lon.auth.api.rackspacecloud.com/v1.0"
                                                      <p>
                                                        or for the US you would have :
                                                      </p>
export RCLOUD_DATACENTER=US
export UK_RCLOUD_USER="MY_USERNAME"
export UK_RCLOUD_KEY="MY_API_KEY"
export UK_RCLOUD_AURL="https://auth.api.rackspacecloud.com/v1.0"
                                                      <p>
                                                        source the ~/.bashrc or relog into your account to have those accounts set-up you can test it to see if that works by going to :
                                                      </p>
~/cloudservers-api-demo/python
                                                      <p>
                                                        and launch the command :
                                                      </p>
./list-servers.py
                                                      <p>
                                                        to test if this is working properly (it should list your servers for your DATACENTER)
                                                      </p>
                                                      
                                                      <p>
                                                        you are now basically ready to mass update firewall on all servers.
                                                      </p>
                                                      
                                                      <p>
                                                        Let's say you have two web servers named web1 and web2 and two db servers named db1 and db2 and you would like to allow the 80 port on the web servers and 3306 port on the db servers.
                                                      </p>
                                                      
                                                      <p>
                                                        You would have to go to this directory :
                                                      </p>
~/cloudservers-api-demo/firewall/
                                                      <p>
                                                        and first execute this command to see the help/usages :
                                                      </p>
./fw-control.py --help
                                                      <p>
                                                        so let's say to enable the firewall on all the web and db server first you can do :
                                                      </p>
./fw-control.py -s "web db" enable
                                                      <p>
                                                        it will connect and enable the firewall on all the servers which match the name web and db.
                                                      </p>
                                                      
                                                      <p>
                                                        now let's say we want to enable port 80 on the web :
                                                      </p>
./fw-control.py -s "web" allow port 80
                                                      <p>
                                                        if you log into the servers you can check with
                                                      </p>
iptables -L -n
                                                      <p>
                                                        that it it has been enabled properly.
                                                      </p>
                                                      
                                                      <p>
                                                        This is simple enough for you to modify the script to your liking to make it more modular for your specific environement.
                                                      </p>