Debian/ファイアーウォールの設定

Debian/ファイアーウォールの設定

この記録はDebian Sargeでやったもの。かなり古い。

Linuxのファイアーウォールは Netfilterという機能で実装されている。 コレを制御するために iptables というコマンドが使われる

まず iptables の設定を保存するための環境を作る

スクリプトのサンプルが

/usr/share/doc/iptables/examples/oldinitdscript.gz

っであるのでこいつを改造する

こいつを解凍して起動のスクリプトの場所に設置する。

$ gunzip oldinitdscript.gz
$ cp oldinitdscript /etc/init.d/iptables

このスクリプトに実行権限を与える

$ chmod 755 iptables

さらにこいつの iptables の設定ファイルの保存先を作る 場所は

/var/lib/iptables

なぜこんな場所なのかは知らん

一覧を見ると・・・

$ ls
apt       canna  dictionaries-common  dpkg            exim4      misc  urandom
aptitude  dhcp   discover             emacsen-common  logrotate  nfs   usbutils

なのでたぶんデーモン系の設定ファイルとかはここらしいね

とりあえず作る 作った

ファイアーウォールに用いられるルールのテーブルは主に二つ filternat だ。

filter はパケットを制限し nat はルーティングに用いる

ここから iptable コマンドによりルールを登録していく

まずルールを全部破棄する。入力パケット出力パケットすべてを拒否する

$ iptables -P INPUT DROP
$ iptables -P OUTPUT DROP

入力パケットを拒否設定にしたらネットワーク越しのsshのログインが跳ねられた。 それも設定した瞬間・・・当たり前である。

ローカルから作業する

今のところ全部拒否になってるのでルールを追加して穴ぼこを空けていく

自分自身に対しての許可をする ループバックの許可ってやつらしいね

$ iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

コマンドのオプションは

  • A ルールを追加する
  • s 発信元
  • d 受信先
  • j アクション指定 今の場合は ACCEPTで許可

つまりこのコマンドならローカル発信のローカル受信の場合の入力は許可することになる

再び通信可能なように ssh の穴ぼこを空ける

$ iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
$ iptables -A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
  • p 使用するプロトコルを指定する。今回はsshなのでtcp
  • m モジュール指定なんかパケット指定の部品の使い方指定パケットフィルタの場合はとりあえず stateでいいらしい
  • –state mオプションでstateを指定したのでそのためのオプション指定 新規セッション確立のNEWらしい 深い意味はワカラン
  • –dport 送信先ポートの指定 今は sshの 22番ポートを指定
  • 入力 プロトコルtcpにかんして 22番でセッションを確立することを許可

22番ポートでの新規セッション確立を許可したのでセッション確立後の通信は全部許可することにする

$ iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
$ iptables -A OUTPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

ってことで許可されたっポイんでリモート接続してみる

できたOKOKO

そうしたらこの設定を何回も打ち込むのは面倒なんで 保存する ちなみに全部拒否でsshだけ穴が開いている状態なんで当然webなんかもできない

自動更新のシステムapt-getにはftpを利用しているのでftpのリクエストが出て行く穴を開けておかないと 何かと不便なんで空けておく

FTP

$ iptables -A OUTPUT -p tcp -m state --state NEW --dport 20 -j ACCEPT
$ iptables -A OUTPUT -p udp -m state --state NEW --dport 20 -j ACCEPT
$ iptables -A OUTPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT
$ iptables -A OUTPUT -p udp -m state --state NEW --dport 21 -j ACCEPT

http

$ iptables -A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
$ iptables -A OUTPUT -p udp -m state --state NEW --dport 80 -j ACCEPT

dns

$ iptables -A OUTPUT -p tcp -m state --state NEW --dport 53 -j ACCEPT
$ iptables -A OUTPUT -p udp -m state --state NEW --dport 53 -j ACCEPT

OK全部許可したので セーブする

$ /etc/init.d/iptables save active

と打ちこむと、さっきの var/lib/iptables のところに保存されるらしい

保存されてた! なんかコマンドを打ち込んだ順番がきになるが

iptable の起動スクリプトを Linux 起動時に起動するようにする

とりあえず今の標準の runlevel が何か調べてみる

/etc/inittab

現在の標準はレベル2だった だからレベル2のところにショートカットをつくりゃいいわけ

$ cd /etc/rc2.d
$ ls
S10sysklogd  S18portmap  S20inetd    S20ssh         S89cron
S11klogd     S20canna    S20lpd      S21nfs-common  S99rmnologin
S14ppp       S20exim4    S20makedev  S89atd         S99stop-bootlogd

本では18番でポートマップが始まって20で各種サービスって言っているので 19あたりでサービスに関するフィルタをしておけばいいだろってことで S19iptablesのシンボリックリンクを作っておく

ちなみに portmap は NFS とか NIS とかちょっとヤバメの古いプログラムの番号をTCPにマッピングする仕組みらしい 必要ないような・・・

$ ln /etc/init.d/iptables ./S19iptables

で完了。これで開始時にさっきのルールが適用される

って調子ぶっこいてたらapt-getコマンドが使えなくなった・・・ 正確に言うと更新情報はゲットできるけど更新のデータそのものがダウンロードできない ドコにも情報が載ってないんだよね・・・・

っでググりまくったらなんかファイアーウォール設定した上でFTPを使うには ip_conntrack_ftp とかいうモジュールがカーネルに組み込まれている必要があるっぽく

ってことで

$ modprobe ip_conntrack_ftp

を実行すると・・・

$ apt-get install vim

が成功しました!ってことねあとで起動時に読み込む設定にしておかねば

ルーティングもしてる場合は ip_nat_ftp もいるらしい・・・

ftpは古いからな こういうところでネジレが出てるのかな

linux/distribution/debian/firewall_setting.txt · 最終更新: 2018-11-30 11:37 by ore