※環境は、Vine Linux 3.2 でした。
- 参考にさせて頂いたページ
- 【5/5参考リンク追記】
-
本格的に設定するなら下記ページが参考になりそう
【5/4追記】IPTABLES って何?
脳内老化が顕著化している私には(要するにアホってことですねw)難しすぎますけど、なんか面白いです。まぁ、普段は「パケット・フィルタリング」なんて言葉を簡単に使ってますけど、実際の構造はかくも複雑なものであったのだ!ということで。(何
ぶりかまさんの俺でも解るIPTABLESがかなりわかりやすいです。
- iptables
- filter テーブル
- INPUT チェイン(入力)
- OUTPUT チェイン(出力)
- FORWARD チェイン(転送?)
- nat テーブル
- PREROUTING チェイン(送信時に変換)
- POSTROUTING チェイン(受信時を変換)
- OUTPUT チェイン(出力)
- filter テーブル
もう一つmangleという特殊なパケット変換に使われるテーブルがあるのですが難しくて理解できません(汗汗)。ヘッダ(内のフィールド)を書き換えたりするみたいです。
クライアント機として使う(ルーターとして使わない)場合は、filterテーブルのINPUTチェインとOUTPUTチェインのみが関係するということですね。換言すると、この2点はローカルへのパケットに適用する設定であると。
デフォルトのチェイン以外に新しいチェインを作り、-j new_chain として処理(ターゲット)を指定することも可能。
え?と、FORWARDがよくわかりません。NAT(ルーターとして)を使う場合には設定が必須となるようです。最終的な宛先が自分自身ではない場合に、natテーブルに処理を送るってことでしょうか?う?ん、きちんと理解するには下記のチュートリアルを頭に叩き込む必要がありそうです。
確認
# iptables -L |
設定リスト表示 |
# iptables -L -v |
詳細リスト表示 |
# iptables -F |
ルールのクリア |
- 起動設定確認 -
$ chkconfig --list iptables
- 状態確認 -
# service iptables status
- 設定の保存 -
# /etc/init.d/iptables save
- サービス再起動 -
# service iptables restart
初期設定ではすべてACCEPT(通過)となっています。
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
まず、INPUT
(受信)をすべてDROP(破棄)にして確認しつつ設定することにしました。FORWARD
はルーターとして使う場合の設定なんだそうですので、これもDROP(破棄)にします。OUTPUT
(送信)は設定しません。(許可のまま)
基本設定
# iptables -P INPUT DROP # iptables -P FORWARD DROP
-P |
デフォルトのポリシーを設定 |
一旦ここで設定を保存してサービスを再起動させます。設定を保存しないと再起動時に初期設定に戻されてしまいますので。
# /etc/init.d/iptables save # service iptables restart
確認してみます。PINGに応答しません。外部からSamba(SMB)共有への接続がブロックされます。送信は許可されてますが、応答パケットが破棄されるのでWEBも繋がりません。
- [1]ローカルループバックアダプタ(
lo
)を通るものを許可
# iptables -A INPUT -i lo -j ACCEPT
-A,--append |
ルールを追加 |
-i,--in-interface |
受信インターフェイスを指定※ |
-j,--jump |
処理を指定 |
※(この設定は-i lo
のみでいいですけど)NIC(LANアダプタとか)が複数ある場合は、-i eth0
とか指定できますね。(OUTPUTなら-o eth0
とか)
- [2]応答パケットを許可
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
設定を保存してサービスを再起動。
# /etc/init.d/iptables save # service iptables restart
いわゆるoutbound(の応答)を許可する設定ですね。
-m
または --match
について。複数の条件からマッチしたらってことかな?
iptables は拡張されたパケットマッチングモジュールを使うことができる。 これらのモジュールは 2 種類の方法でロードされる: モジュールは、 -p または --protocol で暗黙のうちに指定されるか、 -m または --match の後にモジュール名を続けて指定される。 これらのモジュールの後ろには、モジュールに応じて 他のいろいろなコマンドラインオプションを指定することができる。 複数の拡張マッチングモジュールを一行で指定することができる。 また、モジュールに特有のヘルプを表示させるためには、 モジュールを指定した後で -h または --help を指定すればよい。
--state
については・・・
--state state
state は、マッチングを行うための、コンマで区切られた接続状態のリストである。 指定可能な state は以下の通り。 INVALID: このパケットは既知の接続と関係していない。 ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。 NEW: このパケットが新しい接続を開始したか、 双方向にはパケットがやり取りされていない接続に属するパケットである。 RELATED: このパケットが新しい接続を開始しているが、 FTP データ転送や ICMP エラーのように、既存の接続に関係している。
ESTABLISHED
は既に接続済み(outbound)、RELATED
はアクティブモードでのFTPとか?(20/tcpへのinbound)、ICMPエラーのUDPパケットとかのことかな?
ここでまた設定保存して再起動。IPアドレス直打ちならWEBは繋がりますが、ドメインでは繋がりません。DNSサーバからの応答パケット(DNSリゾルバ)を許可しないといけないですね。もう一度確認したら繋がりました...すみません。
ここまでで、いわゆるoutboundを許可、inboundはすべて遮断という簡易的ファイアウォール設定ができたことになりますね。別機からのPING(Echo Request)も破棄されます。送信はOKでした。
共有とICMP
このマシンはLAN内で使ってますのでSamba(SMB)共有とICMPを許可設定します。
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 445 -j ACCEPT # iptables -A INPUT -s 192.168.0.0/24 -p udp --dport 445 -j ACCEPT # iptables -A INPUT -s 192.168.0.0/24 -p udp --dport 137 -j ACCEPT # iptables -A INPUT -s 192.168.0.0/24 -p udp --dport 138 -j ACCEPT # iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 139 -j ACCEPT
-p, --protocol |
プロトコル |
-s, --source |
送信元(ホスト名/IPアドレス/ネットワークアドレス) |
dport,--destination-ports |
宛先ポート |
【追記】すみません・・・名前解決(ホスト名での接続)とブラウジング(一覧表示)には以下2点も必要な筈ですね。(滝汗
# iptables -A INPUT -s 192.168.0.0/24 -p udp --sport 137 -j ACCEPT # iptables -A INPUT -s 192.168.0.0/24 -p udp --sport 138 -j ACCEPT
設定を保存してサービスを再起動。
# /etc/init.d/iptables save # service iptables restart
ログを記録
LAN内では要らない気もしますが、やっぱりログを記録したいのでFantasic Nightscapeさんのiptablesのページを参考に、というかそのままですが以下を追加で設定しました。
# iptables -A INPUT -j LOG --log-prefix "Bad packet: "
設定を保存してサービスを再起動。
# /etc/init.d/iptables save # service iptables restart
ポートスキャンをかけてみるとこんなログが記録されます。
# cat /var/log/messages ---抜粋--- Apr 30 16:37:12 localhost kernel: Bad packet: IN=eth0 OUT= MAC=<--省略--> SRC=192.168.0.2 DST=192.168.0.3 LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=60731 DF PROTO=TCP SPT=2026 DPT=325 WINDOW=29200 RES=0x00 SYN URGP=0 ------
全くの基本だけですけど、とりあえず終了です。
# iptables -L -v Chain INPUT (policy DROP 573 packets, 55522 bytes) pkts bytes target prot opt in out source destination 132 6792 ACCEPT all -- lo any anywhere anywhere 1788 1605K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 0 0 ACCEPT tcp -- any any 192.168.0.0/24 anywhere tcp dpt:microsoft-ds 0 0 ACCEPT udp -- any any 192.168.0.0/24 anywhere udp dpt:microsoft-ds 5 426 ACCEPT udp -- any any 192.168.0.0/24 anywhere udp dpt:netbios-ns 9 2004 ACCEPT udp -- any any 192.168.0.0/24 anywhere udp dpt:netbios-dgm 0 0 ACCEPT tcp -- any any 192.168.0.0/24 anywhere tcp dpt:netbios-ssn 0 0 ACCEPT icmp -- any any anywhere anywhere 0 0 LOG all -- any any anywhere anywhere LOG level warning prefix `Bad packet: '
/etc/sysconfig/iptables
に初期設定も含めたすべての設定が保存されるようです。