Advertisement
Guest User

Untitled

a guest
Feb 12th, 2010
765
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.95 KB | None | 0 0
  1. #!/usr/bin/perl -Tw
  2.  
  3. # build_iptables.pl domain_list [ domain_list... ]
  4. #
  5. # Create a firewall ruleset in iptables-restore format to create a layer 4 DNS
  6. # proxy using NAT that filters domains from given lists.
  7.  
  8. # In this example:
  9. # - 123.123.123.158 is the proxy address.
  10. # - 123.123.123.{152,154,156} are the real DNS resolvers.
  11.  
  12. # Copyright (c) 2009 Terry Burton
  13. #
  14. # http://www.terryburton.co.uk
  15. #
  16. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
  17. # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  18. # THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  19. # PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  21. # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
  22. # CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  23. # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  24. # IN THE SOFTWARE.
  25.  
  26. use strict;
  27.  
  28. die "Usage: $0 domain_list [ domain_list... ]" unless $#ARGV>=0;
  29.  
  30. my @doms=();
  31. foreach my $filename (@ARGV) {
  32.   open(FILE,"<$filename") or die("Unable to open file");
  33.   @_=<FILE>;
  34.   close(FILE);
  35.   map {chomp} @_;
  36.   push @doms,@_;
  37. }
  38.  
  39. print <<'EOF';
  40. *mangle
  41. :PREROUTING ACCEPT [0:0]
  42. -A PREROUTING -d 123.123.123.158 -p udp -m udp --dport 53 -m statistic --mode nth --every 3 --packet 0      -m state --state new -j CONNMARK --set-mark 1
  43. -A PREROUTING -d 123.123.123.158 -p udp -m udp --dport 53 -m statistic --mode nth --every 3 --packet 1      -m state --state new -j CONNMARK --set-mark 2
  44. -A PREROUTING -d 123.123.123.158 -p udp -m udp --dport 53 -m statistic --mode nth --every 3 --packet 2      -m state --state new -j CONNMARK --set-mark 3
  45. -A PREROUTING -d 123.123.123.158 -p tcp -m tcp --dport 53 -m statistic --mode random --probability 0.333333 -m state --state new -j CONNMARK --set-mark 1
  46. -A PREROUTING -d 123.123.123.158 -p tcp -m tcp --dport 53 -m statistic --mode random --probability 0.5      -m state --state new -j CONNMARK --set-mark 2
  47. -A PREROUTING -d 123.123.123.158 -p tcp -m tcp --dport 53                                                   -m state --state new -j CONNMARK --set-mark 3
  48. COMMIT
  49.  
  50. *nat
  51. :PREROUTING ACCEPT [0:0]
  52. :POSTROUTING ACCEPT [0:0]
  53. -A PREROUTING  -m connmark --mark 1 -j DNAT --to-destination 123.123.123.152
  54. -A PREROUTING  -m connmark --mark 2 -j DNAT --to-destination 123.123.123.154
  55. -A PREROUTING  -m connmark --mark 3 -j DNAT --to-destination 123.123.123.156
  56. -A POSTROUTING -m connmark --mark 1 -j SNAT --to-destination 123.123.123.158
  57. -A POSTROUTING -m connmark --mark 2 -j SNAT --to-destination 123.123.123.158
  58. -A POSTROUTING -m connmark --mark 3 -j SNAT --to-destination 123.123.123.158
  59. COMMIT
  60.  
  61. *filter
  62. :LOGDROP - [0:0]
  63. -A LOGDROP -m limit --limit 1/second --limit-burst 100 -j LOG
  64. -A LOGDROP -j DROP
  65.  
  66. :DNSCHECK - [0:0]
  67.  
  68. :FORWARD ACCEPT [0:0]
  69. -A FORWARD -s 123.123.0.0/16 -p udp --dport 53 -m u32 --u32 "0>>22&0x3C@8>>15&0x01=0" -j DNSCHECK
  70. -A FORWARD -s 123.123.0.0/16 -p udp --dport 53 -j ACCEPT
  71. -A FORWARD -s 123.123.0.0/16 -p tcp --dport 53 -j ACCEPT
  72. -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
  73. -A FORWARD -j LOGDROP
  74.  
  75. EOF
  76.  
  77. my $last_prefix='';
  78. foreach my $dom (sort @doms) {
  79.     (my $prefix,my $suffix)=$dom=~/^(..)(.*)$/;
  80.     if ($prefix ne $last_prefix) {
  81.       $last_prefix=$prefix;
  82.       print ":DNSCHECK$prefix - [0:0]\n";
  83.       if ($prefix=~/^.\./) {
  84.         my $hex=sprintf("01%02lx", ord substr($prefix,0,1));
  85.         print "-A DNSCHECK -m u32 --u32 \"0>>22&0x3C\@18&0xffff=0x$hex\" -j DNSCHECK$prefix\n";
  86.       } else {
  87.         (my $hex=$prefix)=~s/(.)/sprintf("%02lx", ord $1)/eg;
  88.         print "-A DNSCHECK -m u32 --u32 \"0>>22&0x3C\@19&0xffff=0x$hex\" -j DNSCHECK$prefix\n";
  89.       }
  90.     }
  91.     my $enc=''; my $offset=40;
  92.     foreach (split /\./, $dom) {
  93.       $enc.='|'.(sprintf '%02x', length)."|$_";
  94.       $offset+=(length $_)+1;
  95.     }
  96.     print "-A DNSCHECK$prefix -m string --from 40 --to $offset --hex-string \"$enc|00|\" --algo bm -j LOGDROP\n";
  97. }
  98.  
  99. print <<'EOF'
  100. COMMIT
  101. EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement