পুতুলের সাহায্যে iptables পরিচালনা করা


10

iptablesপুতুলের সাথে আমাদের বিধি পরিচালনার ধারণাটি সামনে এনেছে। আমি দেখতে পাচ্ছি যে augeasএকটি iptablesলেন্স রয়েছে তবে এটি বর্তমানে পরীক্ষামূলক।

কীভাবে এটি পরিচালনা করবেন সে সম্পর্কে কারও কোনও পরামর্শ আছে? আদর্শভাবে, আমি একটি সার্ভারের ক্লাসের উপর ভিত্তি করে চেইনগুলি তৈরি করতে চাই।


1
লিনাক্সের কোন স্বাদ? কারও কারও কাছে ডিফল্ট iptables উপাদান রয়েছে যা কাজ করা ভাল ধারণা idea
ফ্রেইহাইট

1
আমার পরিস্থিতিতে RHEL।
বেলমিন ফার্নান্দেজ

উত্তর:


6

আমি রেড হ্যাট এন্টারপ্রাইজ (আরএইচইএল) দিয়ে যা করছি তা এখানে।

আরএইচইএলের একটি iptablesপরিষেবা রয়েছে যা থেকে নিয়মগুলি লোড করা হয় /etc/sysconfig/iptablesএবং আমি সেই ফাইলটি সংশোধন করে এবং আইপেটেবল পরিষেবাটি পুনরায় চালু করার সাথে কাজ করছি। অনেকে iptables.d ডিরেক্টরিতে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো থেকে শুরু করে আমি ডিফল্ট রুলসেটটি পুনর্নির্মাণের জন্য জিনিসগুলি অন্তর্ভুক্ত করি তবে এটি সাধারণত কিছুই করে না। আপনার প্রয়োজনীয়তাগুলি যদি সহজ হয় তবে আপনি কেবল একটি আইপটিবল ফাইলটি সিস্টেমে অনুলিপি করতে পারেন।

এটি দেখতে কুরুচিপূর্ণ হওয়া সত্ত্বেও, এটি RHEL4, RHEL5 এবং RHEL6 এ বেশ ভালভাবে পরীক্ষা করা হয়েছে।

পুতুলের আগে অউজিয়ার সমর্থন পাওয়ার আগে আমার এই অবস্থা ছিল। আজ যদি আমি আবার এটি লিখতে থাকি তবে অবলম্বন করার আগে আমি আউজিয়ার আইপটিবল লেন্সটি দেখতে চাই exec { "perl ...": }

কিছু গ্লোবাল স্থানে ফাইল সম্পাদনা করার জন্য সংজ্ঞায়িত করে

মূলত http://reductivelabs.com/trac/puppet/wiki/SimpleTextRecines থেকে স্টাফের উপর ভিত্তি করে

# Ensure that the line "line" exists in "file":
# Usage: 
# append_if_no_such_line { dummy_modules:
#        file => "/etc/modules",
#        line => dummy 
# }
# 
define append_if_no_such_line($file, $line, $refreshonly = 'false') {
   exec { "/bin/echo '$line' >> '$file'":
      unless => "/bin/grep -Fxqe '$line' '$file'",
      refreshonly => $refreshonly,
   }
}

# Ensure that the line "line" exists in "file":
# Usage: 
# prepend_if_no_such_line { dummy_modules:
#        file => "/etc/modules",
#        line => dummy 
# }
# 
define prepend_if_no_such_line($file, $line, $refreshonly = 'false') {
   $line_no_slashes = slash_escape($line)
   exec { "/usr/bin/perl -p0i -e 's/^/$line_no_slashes\n/;' '$file'":
      unless => "/bin/grep -Fxqe '$line' '$file'",
      refreshonly => $refreshonly,
   }
}

define insert_line_after_if_no_such_line($file, $line, $after) {
    $line_no_slashes = slash_escape($line)
    $after_no_slashes = slash_escape($after)

    exec { "/usr/bin/perl -p0i -e 's/^($after_no_slashes)\$/\$1\n$line_no_slashes/m' '$file'":
        onlyif => "/usr/bin/perl -ne 'BEGIN { \$ret = 0; } \$ret = 1 if /^$line_no_slashes/; END { exit \$ret; }' '$file'",
    }
}

define insert_line_before_if_no_such_line($file, $line, $beforeline) {
    $line_no_slashes = slash_escape($line)
    $before_no_slashes = slash_escape($beforeline)

    exec { "/usr/bin/perl -p0i -e 's/^($before_no_slashes)\$/$line_no_slashes\n\$1/m' '$file'":
        onlyif => "/usr/bin/perl -ne 'BEGIN { \$ret = 0; } \$ret = 1 if /^$line_no_slashes/; END { exit \$ret; }' '$file'",
    }
}

আমার iptables বর্গ:

class iptables {
   if $lsbmajdistrelease >= '6' {
     $primarychain = 'INPUT'
   } else {
     $primarychain = 'RH-Firewall-1-INPUT'
   }

   package {
      iptables: 
         ensure => installed   # "latest" would be too much
   }

   service { 
     iptables:
        enable    => true,    # default on
        ensure    => running, # start it up if it's stopped
        hasstatus => true,    # since there's no daemon
  }


   file {
     "/etc/sysconfig/iptables":
       ensure => present;
   }

   ##
   # Build up a config if it's missing components we expect; should
   # automatically repair a config if it's broken for really simple reasons
   ##

   # Very first thing: a comment at the top warning about our evil; add even if
   # we're not touching anything else...
   prepend_if_no_such_line { 
      "/etc/sysconfig/iptables comment":
         file => "/etc/sysconfig/iptables",
         line => "# This file partially managed by puppet; attempts to edit will result in magic reappearances"
   }

   # start
   # *filter
   insert_line_after_if_no_such_line {
      "/etc/sysconfig/iptables *filter":
         file    => "/etc/sysconfig/iptables",
         line    => "\\*filter",
         after   => "#.*",
         notify => Service[iptables],
   }

   # first default chain
   # :INPUT ACCEPT [0:0]
   insert_line_after_if_no_such_line {
      "/etc/sysconfig/iptables:INPUT":
         file   => "/etc/sysconfig/iptables",
         line   => ":INPUT ACCEPT \\[0:0\\]",
         after  => "\\*filter",
         notify => Service[iptables],
   }

   # second default chain
   # :FORWARD ACCEPT [0:0]
   insert_line_after_if_no_such_line {
      "/etc/sysconfig/iptables:FORWARD":
         file   => "/etc/sysconfig/iptables",
         line   => ":FORWARD ACCEPT \\[0:0\\]",
         after  => ":INPUT ACCEPT \\[\\d+:\\d+\\]",
         notify => Service[iptables],
   }


   # third default chain
   # :OUTPUT ACCEPT [0:0]
   insert_line_after_if_no_such_line {
      "/etc/sysconfig/iptables:OUTPUT":
         file   => "/etc/sysconfig/iptables",
         line   => ":OUTPUT ACCEPT \\[0:0\\]",
         after  => ":FORWARD ACCEPT \\[\\d+:\\d+\\]",
         notify => Service[iptables],
   }

   if $lsbmajdistrelease <= 5 {

      # Finally, the RH special chain
      # :RH-Firewall-1-INPUT - [0:0]
      insert_line_after_if_no_such_line {
         "/etc/sysconfig/iptables:RH-Firewall-1-INPUT":
            file   => "/etc/sysconfig/iptables",
            line   => ":RH-Firewall-1-INPUT - \\[0:0\\]",
            after  => ":OUTPUT ACCEPT \\[\\d+:\\d+\\]",
            notify => Service[iptables],
      }

      # redirect INPUT to RH chain
      # -A INPUT -j RH-Firewall-1-INPUT
      insert_line_after_if_no_such_line {
         "/etc/sysconfig/iptables:INPUT:RH-Firewall-1-INPUT":
            file   => "/etc/sysconfig/iptables",
            line   => "-A INPUT -j RH-Firewall-1-INPUT",
            after  => ":RH-Firewall-1-INPUT - \\[\\d+:\\d+\\]",
            notify => Service[iptables],
      }

      # redirect FORWARD to RH chain
      # -A FORWARD -j RH-Firewall-1-INPUT
      insert_line_after_if_no_such_line { 
         "/etc/sysconfig/iptables:FORWARD:RH-Firewall-1-INPUT":
            file   => "/etc/sysconfig/iptables",
            line   => "-A FORWARD -j RH-Firewall-1-INPUT",
            after  => "-A INPUT -j RH-Firewall-1-INPUT",
            notify => Service[iptables],
      }

   }

   # Let anything on localhost work...
   # -A $primarychain -i lo -j ACCEPT
   insert_line_after_if_no_such_line {
      "/etc/sysconfig/iptables:$primarychain lo":
         file    => "/etc/sysconfig/iptables",
         line   => "-A $primarychain -i lo -j ACCEPT",
         after  => "-A FORWARD -j $primarychain",
         notify => Service[iptables],
   }

   # And let through all the ICMP stuff:
   # -A $primarychain -p icmp --icmp-type any -j ACCEPT
   if $lsbmajdistrelease >= '6' {
     insert_line_after_if_no_such_line {
        "/etc/sysconfig/iptables:$primarychain icmp":
           file   => "/etc/sysconfig/iptables",
           line   => "-A $primarychain -p icmp -j ACCEPT",
           after  => "-A $primarychain -i lo -j ACCEPT",
           notify => Service[iptables],
     }
   } else {
     insert_line_after_if_no_such_line {
        "/etc/sysconfig/iptables:$primarychain icmp":
           file   => "/etc/sysconfig/iptables",
           line   => "-A $primarychain -p icmp --icmp-type any -j ACCEPT",
           after  => "-A $primarychain -i lo -j ACCEPT",
           notify => Service[iptables],
     }
   }

   # Finally, let anything that's part of an exisiting connection through:
   # -A $primarychain -m state --state ESTABLISHED,RELATED -j ACCEPT
   insert_line_after_if_no_such_line {
      "/etc/sysconfig/iptables:ESTABLISHED":
         file   => "/etc/sysconfig/iptables",
         line   => "-A $primarychain -m state --state ESTABLISHED,RELATED -j ACCEPT",
         after  => "-A $primarychain -p icmp --icmp-type any -j ACCEPT",
         notify => Service[iptables],
   }

   # Very last thing:
   # COMMIT
   append_if_no_such_line {
      "/etc/sysconfig/iptables:COMMIT":
         file   => "/etc/sysconfig/iptables",
         line   => "COMMIT",
         notify => Service[iptables],
   }

   # Next to last thing: reject!
   # -A $primarychain -j REJECT --reject-with icmp-host-prohibited
   insert_line_before_if_no_such_line {
      "/etc/sysconfig/iptables:final reject":
         file       => "/etc/sysconfig/iptables",
         line       => "-A $primarychain -j REJECT --reject-with icmp-host-prohibited",
         beforeline => "COMMIT",
         notify     => Service[iptables],
   }
}

# example:
# iptable_rule { "iptable:ssh":
#   rule => "-m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT"
# }
# change your mind about a rule, do this:
# iptable_rule { "iptable:ssh":
#   rule   => "-m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT",
#   ensure => "absent",
# }
define iptable_rule($rule, $ensure = 'present') {
   if $lsbmajdistrelease >= '6' {
     $primarychain = 'INPUT'
   } else {
     $primarychain = 'RH-Firewall-1-INPUT'
   }
   $iptablesline = "-A $primarychain $rule"
   case $ensure {
      default: { err ( "unknown ensure value $ensure" ) }
      present: {
         insert_line_before_if_no_such_line {
            "/etc/sysconfig/iptables:add $rule":
               file       => "/etc/sysconfig/iptables",
               line       => $iptablesline,
               beforeline => "-A $primarychain -j REJECT --reject-with icmp-host-prohibited",
               notify     => Service[iptables],
         }
      }
      absent: {
         delete_lines {
            "/etc/sysconfig/iptables:remove $rule":
               file    => "/etc/sysconfig/iptables",
               pattern => $iptablesline,
               notify  => Service[iptables],
         }
      }
   }
}

# Example:
# iptable_tcp_port { "iptable:ssh":
#    port => "22",
# }
# Example:
# iptable_tcp_port { "iptable:oracle:130.157.5.0/24":
#    port    => "1521",
#    source => "130.157.5.0/24",
# }
# (add ensure => "absent" to remove)
define iptable_tcp_port($port, $ensure = 'present', $source = 'ANY') {
   case $source {
      "ANY": {
         iptable_rule {
            "iptable_tcp_port:$port":
               rule   => "-m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT",
               ensure => $ensure,
         }
      }
      default: {
         iptable_rule {
            "iptable_tcp_port:$port:$source":
               rule   => "-m state --state NEW -m tcp -p tcp --source $source --dport $port -j ACCEPT",
               ensure => $ensure,
         }
      }
   }
}

# Example:
# iptable_udp_port { "iptable:ntp":
#    port => "123",
# }
# (again, ensure => "absent" if needed)
define iptable_udp_port($port, $ensure = 'present', $source = 'ANY') {
   case $source {
      "ANY": {
         iptable_rule {
            "iptable_udp_port:$port":
               rule   => "-p udp -m udp --dport $port -j ACCEPT",
               ensure => $ensure,
         }
      }
      default: {
         iptable_rule {
            "iptable_udp_port:$port":
               rule   => "-p udp -m udp --source $source --dport $port -j ACCEPT",
               ensure => $ensure,
         }
      }
   }
}

অন্যান্য শ্রেণিতে ব্যবহারের কয়েকটি উদাহরণ:

class ssh {
  include iptables
  iptable_tcp_port {
    "iptables:ssh":
      port   => "22",
      ensure => "present"
   }
}
class ssh_restricted inherits ssh {
  Iptable_tcp_port["iptables:ssh"]{ensure => "absent"}
  iptable_tcp_port {
    "ssh:RESTRICTED":
      port   => "22",
      source => "X.Y.0.0/16", 
      ensure => "present";
   }
}

class apache {
  iptable_tcp_port {
    "iptables:http":
      require => Service["httpd"],
      port => "80";
  }
}

class apache::secure {
  iptable_tcp_port {
    "iptables:https":
      require => Service["httpd"],
      port => "443";
  }
}

class snmp {
  iptable_udp_port { "iptables:snmp": port => "161" }
}

6

পুতুল ল্যাবগুলির উইকিতে ঠিক একটি উদাহরণ রয়েছে: মডিউল Iptables প্যাটার্নস

সংক্ষেপে: আপনি প্রতিটি পরিষেবার জন্য টুকরোগুলি তৈরি করেন এবং তারপরে ipt_fraਮੈਂਟ সংজ্ঞায়িত-প্রকারের মাধ্যমে তাদের ইনস্টল করুন:

ipt_fragment {"ফিল্টার-এফটিপি": নিশ্চিত করুন => উপস্থিত}

যখন কোনও খণ্ড ইনস্টল করা হয় (তারা /etc/iptables.d/ এ থাকে), এটি কোনও স্ক্রিপ্টের কার্যকারিতা চালিত করে যা সমস্ত টুকরো টুকরো করে এবং iptables পুনরায় আরম্ভ করে।


4

প্রশ্নটি হল, আপনি কী অর্জন করতে চান?

পুতুলের উপরে আইপটিবলগুলি রাখা সহজ: স্ক্রিপ্টটি পুতুল সার্ভারে রাখুন এবং যেখানে আপনার প্রয়োজন সেখানে এটি পরিবেশন করুন। যদি এটি কিছু স্বনির্ধারণের প্রয়োজন হয় তবে এটি একটি টেম্পলেট করুন।

এখন, সম্ভবত আপনি "হোস্ট এক্স-এর যদি ওয়েব সার্ভার থাকে তবে এর 80 এবং 443 এর পোর্ট অবশ্যই খোলা থাকতে হবে" এর মতো কিছু চান। সেক্ষেত্রে, আমি আপনাকে যা করতে পরামর্শ দিচ্ছি তা হল একাধিক ফাইল অংশ থেকে স্ক্রিপ্টটি রচনা করা, সাধারণ মডিউল ব্যবহার করে concatenated_fileবা concatfilepart(আমি পরেটিরটিকে পছন্দ করি, যা ক্রম সক্ষম করে, তবে এটি সমস্ত কাঁটাচায় পাওয়া যায় না - আমি আপনাকে নির্দেশ করছি ক্যাম্পটোক্যাম্পস, এটি রয়েছে)।

এই ফাইল অংশগুলি টেমপ্লেটগুলি ব্যবহার করে সহজেই লেখা যায়। কৌতুক যে তুমি রপ্তানিconcatfilepart উপর Apache(ক সংজ্ঞায়িত করে এমন একটি দেয়ঃ সম্ভবত কল করে বর্গ concatfilepartযেমন IP ঠিকানা এবং পোর্ট হিসাবে পরামিতি উপর ভিত্তি করে), এবং iptablesবর্গ বুঝতে চাই সব রপ্তানি concatfilepartসঙ্গে বাঁধা iptablesবা ওই জাতীয় কিছু।

যদি আপনি এটি করেন তবে আমি গিথুবটিতে সেই মডিউলটি দেখতে পছন্দ করব। আমি কখনই আইপিটিবল মডিউলটি লিখতে পারি নি। :-)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.