def id
      return @id if @id
      joined = (@setup.map       {|rule| rule.to_iptables } +
                @prerouting.map  {|rule| rule.to_iptables }.uniq +
                @postrouting.map {|rule| rule.to_iptables }.uniq +
                @input.map       {|rule| rule.to_iptables }.uniq +
                @forward.map     {|rule| rule.to_iptables }.uniq +
                @table.map       {|rule| rule.to_iptables }.uniq).join(' ')
      @id = "#{Digest::MD5.hexdigest(joined)[0..5]}"
    end
def id
      return @id if @id
      joined = (@setup.map       {|rule| rule.to_iptables } +
                @prerouting.map  {|rule| rule.to_iptables }.uniq +
                @postrouting.map {|rule| rule.to_iptables }.uniq +
                @input.map       {|rule| rule.to_iptables }.uniq +
                @forward.map     {|rule| rule.to_iptables }.uniq +
                @table.map       {|rule| rule.to_iptables }.uniq).join(' ')
      @id = "#{Digest::MD5.hexdigest(joined)[0..5]}"
    end
FIXME: Maybe implement the concept of dirtiness?