家に帰ったらCommon Lispのコードを書いてみた。

Shibuya.lisp Tech Talk #4 LT発表資料 「さあ家に帰ったらSchemeのコード書いてみよう」 – ひげぽん OSとか作っちゃうかMona-

higeponさんにインスパイアされて、何かを書くことにしました。

redhat系のiptablesは、/etc/sysconfig/iptables にルールを書いておいて、/etc/init.d/iptablesで制御できるようになっている。最近のubuntuでは、ちょっと流儀が違うらしいけど、redhat系のiptablesに慣れているので、redhat系の設定ファイルを読み込んでiptablesのルールを適応するようにしました。


redhat系のiptablesのルールファイルと同じ形式で、/etc/iptablesというファイルを置いて、それを解釈してiptablesを起動するものをclispで書いてみました。やったことは、redhat系の/etc/init.d/iptables start で行なわれる処理をclispに移植しただけです。

#!/usr/bin/clisp
(defun get-chains ()
 (let ((out (ext:run-shell-command "cat /proc/net/ip_tables_names"
             :output :stream)))
  (loop for line = (read-line out nil nil)
   while line
   collect line)))
 
(defun apply-chains (command chains)
 (let ((option-arg (cond ((equal command "delete") "-X")
                    ((equal command "flash") "-F")
                    (t (error 'illegal-arg)))))
  (loop for c in chains
   do (ext:run-shell-command
           (format nil "iptables -t ~a ~a" c option-arg)))))
 
(defun clear-settings ()
 (let ((chains (get-chains)))
  (apply-chains "flash" chains)
  (apply-chains "delete" chains)))
 
(defun get-legal-line (line)
 (let ((index (search "#" line)))
  (string-trim '(#\Space #\Tab #\Newline)
   (if index
    (subseq line 0 index)
    line))))
 
(defun get-iptables-rules ()
 (with-open-file (in "/etc/iptables")
  (loop for line = (read-line in nil)
   while line
   collect (get-legal-line line) into lines
   finally (return (remove "" lines :test 'equal)))))
 
(defun apply-iptables-rules (rules)
 (let ((pipe (ext:make-pipe-output-stream "/sbin/iptables-restore -c")))
  (format pipe "~{~a~%~}" rules)))
 
(defun main ()
 (clear-settings)
 (apply-iptables-rules (get-iptables-rules)))
 
(main)

/etc/iptables

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
(snip)

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.