|Home|私のLinux活用記録-Home-|

私のLinux活用記録

-Page13-

項目

kh13-01[SSH Server の構築]
kh13-02[iptables 概要]
Kh13-03[iptables によるファイアーウォール]

 

[SSH Server の構築]

作成:2002年10月20日

RAS (Remote Access Server) として、これまで PPP を用いた PPP Server を使ってきましたが、Windows Client からのアクセスは問題ないのですが、Linux Client からのアクセスはどうも今一歩不安定でした(何故か、通信が途中で固まってしまったりします)。それに、遠隔地間で通信するとなると電話代もかかります。
Telnet や FTP に相当する通信がインターネット経由で、かつ安全に行える SSH Server を今回導入しました。ソフトウェアは、Vine Linux2.1.5, Vine Linux 2.5 標準でインストールされる OpenSSH を使用しました。

■ [参考]
日経 Linux 2000/12月号 P149
日経 Linux 2001/ 1月号 P139
日経 Linux 2001/ 2月号 P155
日経 Linux 2001/ 5月号 P103
http://240net.ddo.jp/linux/linuxssh.html
http://www.linux.or.jp/security/firststep.html
http://www.hokudai.ac.jp/hines/HINESworld/No.51/hw51_2.html
http://www.zdnet.co.jp/help/tips/linux/l0093.html
http://www.zdnet.co.jp/help/tips/linux/l0154.html
http://unixuser.org/~haruyama/security/openssh/index.html
http://home7.highway.ne.jp/dayan/tips/unix/ssh.html
http://www-106.ibm.com/developerworks/library/l-keyc.html
□設定の参考にしたのは、主として 日経 Linux 2001/ 5月号 P103 です。

使用ディストリビューション
■ Server
Vine Linux2.1.5 (openssl,openssh 等は全て最新のものにアップデート済)
■ Client
Vine Linux2.5   (同上)

openssh の起動
Server 及び Client となるマシンの openssh を起動します。
まず、以下をチェックします。
# ls -Fal /etc/rc.d/rcX.d (X=3:Runレベル3, X=5:Runレベル5)
S55sshd が表示されていたら、すでに openssh は起動しています。
K55sshd が表示されていたら、
# /etc/rc.d/init.d/sshd start で openssh が起動します。
コンピューター起動時に openssh を自動で起動するには、
# cd /etc/rc.d/rcX.d (X=3:Runレベル3, X=5:Runレベル5)
# mv K55sshd S55sshd

秘密鍵と公開鍵の作成
Client マシンで秘密鍵と公開鍵を作成します。
$ ssh-keygen -d
Pass Phrase を訊いてきますので、10-30 文字の Pass Phrase を入力します。
以下のファイルがユーザディレクトリ配下に作成されます。
~/.ssh/id_dsa(秘密鍵)
~/.ssh/id_dsa.pub(公開鍵)

Server マシンへの公開鍵登録
Client マシンのユーザディレクトリに生成した~/.ssh/id_dsa.pub をフロッピーディスク等のリムーマブルメディアを使って Server マシンのユーザディレクトリ配下
-/.ssh/ にコピーします(セキュリティー確保のため、FTP や NFS 等の手段でコピーしないこと)。
次いで、id_dsa.pub を authorized_keys2 に変換します。
$ cd ~/.ssh
$ cat id_dsa.pub >> authorized_keys2

SSH Server の設定
■ /etc/ssh/sshd_config の設定
デフォルトからの変更点のみ以下に記述します。
□ # Protocol 2,1 --> Protocol 2
SSH2 プロトコルのみ使用、SSH2 プロトコルは、Telnet 相当機能に加えて、 FTP 相当機能をサポートします。

□ RSAAuthentication  yes --> no
SSH1 プロトコルを使用しないので、RSA 認証を使いません。

□ PasswordAuthentication  yes --> no
パスワードによる認証を行わない。安全のため、SSH ではユーザ名とパスワードによる認証を行わないようにします。

□ X11Forwarding  no --> yes
Server 側の X アプリケーションが Client 側の X 上で実行できるようにします。

■ tcp_wrapper の設定
tcp_wrapper によるアクセス制限を解除するために、以下の設定を行います。

□ /etc/hosts.deny の設定
All:All

□ /etc/hosts.allow の設定
sshd: All

■ パケットフィルタリングの設定
SSH は、Port 22 を使用します。パケットフィルタリングで Port 22 を解放します。
なお、パケットフィルタリングの詳細は、
kh10-01[フレッツ-ADSL とファイア−ウォール設定]
kh10-01.02 ネットワークと ADSL ルーターの設定
kh10-01.03 Host A のファイアウォールの設定
を参照して下さい。

■ sshd の再起動
# /etc/rc.d/init.d/sshd restart

SSH Client の設定
■ /etc/ssh/ssh_config の設定
デフォルトでは、
ForwardX11  yes 
となっているので、
Protocol 2
を追記するだけです。

■ sshd の再起動
# /etc/rc.d/init.d/sshd restart

■ [2002.12.21 追記]
その後のテストで確認した結果、SSH Client 側の sshd は起動する必要はないようです。

戻る

[iptables 概要]

作成:2002年11月02日
更新:2004年02月10日

iptables は Kernel-2.4 でサポートされているパケットフィルタリング機能です。
Kernel-2.2  でサポートされていた ipchains とは、似ているところもかなりありますが、おおきく変わっているところもあります。近い将来、ipchains がサポートされなくなることも想定して、iptables に乗り換えるため、調べた情報を整理しました。

■ [参考]
□ http://www.redhat.co.jp/manual/Doc73/RH-DOCS/rhl-rg-ja/index.html
(Red Hat Linux 7.3 オフィシャル Red Hat Linux リファレンスガイド)
□ jman iptables
□ http://www.itboost.co.jp/inst/inst_38.php
□ http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO.html
□ http://www.linux.or.jp/JF/JFdocs/NAT-HOWTO.html

iptables の全体概念

iptables では、下図のように、PREROUTING, FORWARD, INPUT, OUTPUT, POSTROUTING という機能によって、パケットが処理されます。

   ┌───┐              ┌───┐
   │packet│              │packet│
   └─┬─┘              └───┘
     ↓     Firewall Machine     ↑
┏━━┯━━━┯━━━━━━━━━━━━━━┯━┷━┯━━┓
┃  │ I/F │              │ I/F │  ┃
┃  └─┬─┘              └───┘  ┃
┃    ↓                  ↑    ┃
┃ ┌─────┐           ┌───┴──┐ ┃
┃ │PREROUTING│           │POSTROUTING │ ┃
┃ │ Chain  │           │  Chain  │ ┃
┃ └──┬──┘           └──────┘ ┃
┃    │  ┌────┐         ↑ ↑   ┃
┃    ├─->│FORWARD ├─────────┘ │   ┃
┃    │  │ Chain │           │   ┃
┃    │  └────┘           │   ┃
┃    │  ┌────┐ ┌────┐ ┌──┴─┐ ┃
┃    └─->│ INPUT ├->│  Local ├->│ OUTPUT │ ┃
┃       │ Chain │ │ Process│ │ Chain │ ┃
┃       └────┘ └────┘ └────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

ipchains と iptables の主要な相異点

■ ipchains
□ FORWARD Chain は Local Process 内で INPUT Chain と OUTPUT Chain の中間で作用します。パケットの フォワードを有効にするには INPUT Chain とOUTPUT Chain の通過を許可する必要があります。

□ IP-Masquerade は FORWARD Chain によって設定します。

□ FORWARD Chain でのインターフェースは、アウトプットインターフェースだけが指定できます。

■ iptables
□ チェーンルールを作成するための、3つのテーブルが装備され、 各テーブルで使用されるチェーンの種類が決められています。

□ FORWARD Chain は Local Process 外で作用するので、パケットは Local Prcess 内を通過することなく、フォワードされます。

□ IP-Masquerade は POSTROUTING Chain によって設定します。

□ インターフェースの指定は、インプットとアウトプットを区別する必要があります。FORWARD Chain のインターフェースは、インプットとアウトプット、どちらも指定できます。

□ PREROUTING, POSTROUTING Chain によって、パケットの送信元アドレス、送信先アドレスの変換、リダイレクションなどを設定します。

iptables ルールの表記方法

iptables [-t <table>] <command> <chain> <rule>
<rule>::<parameter> <option> <target>

■ <table>
3種類のテーブルがあります。テーブルを指定しない場合は、デフォルトとして、filter テーブルが選択されます。

iptables -t filter ■ INPUT, OUTPUT, FORWARD Chain を使用
iptables ■ iptables -t filter と同じ
iptables -t nat ■ IP-Masquerade の設定、送信元・送信先アドレス変換、リダイレクションなどに使用
■ PREROUTING, OUTPUT, POSTROUTING Chain を使用
iptables -t mangle ■ 特別なパケット変換に使用
■ PREROUTING, OUTPUT Chain を使用

■ <command>
チェーンルールを定義するための <command>

-P <chain> <target> ■ デフォルトポリシー( <chain> の全ての <rule> に合致しない場合のパケットの処理方法)を設定
-F ■ 全ての <chain> の全ての <rule> をクリアー、デフォルトポリシーはクリアーされない
-F <chain> ■ <chain> の全ての <rule> をクリアー、デフォルトポリシーはクリアーされない
-A <chain> <rule> ■ <chain> に <rule> を追加
-D <chain> <rule> ■ <chain> から、既登録の <rule> を削除
-D <chain> <line-number> ■ <chain> の <line-number> 相当の <rule> を削除
□ <line-number> は、iptables -L --line-number で確認

■ その他の <command>

-L ■ 全ての <chain> の <rule> をリスト
-L --line-number ■ 全ての <chain> の <rule> を付番してリスト
-L -v ■ チェックしたパケット数とバイト数、規則に適合したパケット数とバイト数、特定の規則に適用されるインターフェースなどの情報を出力
-L -x ■ 数値の正確な価を出力
-L -n ■ IP アドレスとポート番号を数値で出力
-R <chain> <line-number> <rule> ■ <chain> <line-number> 相当の <rule> を指定した <rule> で置換
-I <chain> <line-number> <rule> ■ <chain> <line-number> の位置に <rule> を挿入
-Z ■ 全ての <chain> のバイトカウンタとパケットカウンタを 0 にする
-N ■ ユーザー定義チェーン作成    (詳細省略)
-X ■ ユーザー定義チェーン削除    (詳細省略)
-E ■ ユーザー定義チェーン名前変更(詳細省略)
-h ■ 書式のヘルプ

■ <chain>

INPUT       <rule> ■ INPUT       <chain> の <rule> を指定
OUTPUT      <rule> ■ OUTPUT      <chain> の <rule> を指定
FORWARD     <rule> ■ FORWARD     <chain> の <rule> を指定
PREROUTING  <rule> ■ PREROUTING  <chain> の <rule> を指定
POSTROUTING <rule> ■ POSTROUTING <chain> の <rule> を指定

■ <parameter> <option>
[!] <option> は、! <option>::"<option> 以外を指定" を指定できます

□ 送信先、送信元 IP-Address の指定

-d [!] <ip-address>[/<mask>]

-d 192.168.1.0/255.255.255.0
-d 192.168.1.0/24
■ 送信先アドレスを指定
 
■ 192.168.1.0-192.168.1.255 を指定
■ 同上
-s [!] <ip-address>[/<mask>]

-s 192.168.1.0/255.255.255.0
-s 192.168.1.0/24
■ 送信元アドレスを指定
 
■ 192.168.1.0-192.168.1.255 を指定
■ 同上

□ フラグメントパケットの指定

-f ■ 分割されたパケットの2番目以降に適用
! -f ■ 最初のパケットか、分割されていないパケットに適用

□ 入力インターフェース、出力インターフェースの指定

-i [!] <interface>
 
 
 
例 -i eth0
   -i eth+
   -i ppp0
■ 入力インタフェースを指定
□ filter-table:INPUT、FORWARD Chain に適用
□ nat-table   :PREROUTING Chain に適用
□ mangle-table:PREROUTING Chain に適用
■ 入力インタフェースとして eth0 を指定
■ 入力インタフェースとして全イーサネットを指定
■ 入力インタフェースとして ppp0 を指定
-o [!] <interface>
 
 
 
例 -o eth0
   -o eth+
   -o ppp0
■ 出力インタフェースを指定
□ filter-table:OUTPUT, FORWARD Chain に適用
□ nat-table   :POSTROUTING Chain に適用
□ mangle-table:POSTROUTING Chain に適用
■ 出力インタフェースとして eth0 を指定
■ 出力インタフェースとして全イーサネットを指定
■ 出力インタフェースとして ppp0 を指定

□ TCP Protocol と <option> の指定

-p [!] tcp --dport [!] [:]<port>[:][<port>] ■ 送信先ポートを指定
□ [:]<port>[:][<port>]
 xxxx      :: xxxx
:xxxx      ::    0-xxxx
 xxxx:     :: xxxx-65535
 xxxx:yyyy :: xxxx-yyyy
-p [!] tcp --sport [!] [:]<port>[:][<port>] ■ 送信元ポートを指定
□ [:]<port>[:][<port>]
 xxxx      :: xxxx
:xxxx      ::    0-xxxx
 xxxx:     :: xxxx-65535
 xxxx:yyyy :: xxxx-yyyy
-p [!] tcp [!] --syn ■ 通信開始用パケットを指定 (補足)
-p [!] tcp [!] --tcp-flags SYN,RST,ACK SYN と同義
-p [!] tcp [!] --tcp-flags <mask-flag> <comp-flag>
 
 
 
 
 
 
 
 
 
 
 
 
 
例 -p tcp --tcp-flags SYN,RST,ACK SYN
■ 特定ビットを持つパケットを指定 (補足)
□ <mask-flag> 検査対象フラグを指定
□ <comp-flag> ビット=1 を検査するフラグを指定
指定フラグ   ビット=1 を検査
非指定フラグ ビット=0 を検査
□ フラグ
ACK:接続了解
FIN:切断
PSH:バッファ内データ送信
RST:強制切断
SYN:接続要求
URG:緊急データ
ALL:全てのフラグを指定
NONE:どのフラグも指定しない
■ SYN=1, RST=0, ACK=0 を検査
-p [!] tcp [!] --tcp-option [!] <number> ■ <number> で指定された TCP オプションを指定、<number> については、未確認です

□ UDP Protocol と <option> の指定

-p [!] udp --dport [!] [:]<port>[:][<port>] ■ 送信先ポートを指定
□ [:]<port>[:][<port>]
 xxxx      :: xxxx
:xxxx      ::    0-xxxx
 xxxx:     :: xxxx-65535
 xxxx:yyyy :: xxxx-yyyy
-p [!] udp --sport [!] [:]<port>[:][<port>] ■ 送信元ポートを指定
□ [:]<port>[:][<port>]
 xxxx      :: xxxx
:xxxx      ::    0-xxxx
 xxxx:     :: xxxx-65535
 xxxx:yyyy :: xxxx-yyyy

□ ICMP Protocol と <option> の指定

-p [!] icmp --icmp-type [!] <type-name> ■ icmp-type を <type-name> で指定
■ <type-name> は、iptables -p icmp -h で確認できる

□ その他の <option> モジュール

-m mac --mac-sources [!] <mac-address> ■ 送信元 MAC アドレスを指定
□ <mac-address> xx:xx:xx:xx:xx:xx
□ PRERPUTING, FORWARD, INPUT Chain で有効
-m limit --limit <number>/<time>
 
例 -m limit --limit 5/hour
■ パケットの最大比較回数を指定
□ <time> second, minute, hour, day
■ 1時間当り5回
-m limit --limit-burst <number> ■ パケットを同時に比較できる最大回数
-m state --state <state> ■ パケットの状態を指定する
■ <state>
□ ESTABLISHED:双方向接続のパケット
□ INVALID:既知の接続に関係しないパケット
□ NEW:新しい接続を開始するパケット、または双方向接続でないパケット
□ RELATED:新しい接続の開始パケットで、かつ、既存接続に関係したパケット

■ <target>
-P <chain> <target> の表記では、-j を付けません。
-j <target> は、パケットが <parameter> <option>  に適合した時の処理方法を指定します。

-j ACCEPT ■ パケットの処理を許可
-j DROP ■ パケットを破棄
-j REJECT ■ エラーパケットを送り返して、DROP
-j REJECT --reject-with <type> ■ エラーパケットとともに送り返す詳細情報を指定
■ <type> については、jman iptables 参照
-j RETURN ■ 現在のチェーンでのパケットチェックを停止
■ チェーン規則にマッチすれば元のチェーンに戻る
■ マッチしない場合は現在のチェーンのデフォルトターゲットを適用。
-j QUEUE ■ パケットをユーザースペースのキューに登録
-j SNAT --to-source <ip-address> [-<ip-address>] [:<port>[-<port>]] ■ パケットの送信元アドレスを変換
■ IP-Address を 1つ、または範囲指定可
■ <port> 範囲指定可(-p tcp or -p udp の時) nat table の POSTROUTING Chain で有効
-j DNAT --to-destination <ip-address> [-<ip-address>] [:<port>[-<port>]] ■ パケットの送信先アドレスを変換
■ IP-Address を 1つ、または範囲指定可
■ <port> 範囲指定可(-p tcp or -p udp の時) nat table の PREROUTING, OUTPUT Chain で有効
-j MASQUERADE --to-ports <port>[-<port>] ■ ダイヤルアップ接続時等の 動的 IP-Address に対応して、送信元 IP-Adderss を変換
■ <port> 範囲指定可(-p tcp or -p udp の時) nat table の POSTROUTING Chain で有効
-j REDIRECT --to-ports <port>[-<port>] ■ パケットの送信先アドレスをマシン自身の IP-Address に変換
■ <port> 範囲指定可(-p tcp or -p udp の時) nat table の PREROUTING, OUTPUT Chain で有効

□ <target> のログオプション

-j LOG --log-level <level> ■ 詳細は、jman iptables 参照
-j LOG --log-ip-options ■ 同上
-j LOG --log-prefix <prefix> ■ 同上
-j LOG --log-tcp-options ■ 同上
-j LOG --log-tcp-sequence ■ 同上
 

フラグによるパケットフィルタリングについての補足

-p tcp --syn, -p tcp --tcp-flags <mask-flag> <comp-flag>
などの、フラグを検査するパケットフィルタリングについて、若干補足します。
TCP/IP による通信では、パケットのヘッダ部分にそのパケットの状態を表すフラグが書き込まれています。通信が確立するには、client から server への接続開始要求、server から client への接続了解と接続開始要求、client から server への接続了解、およびその後の継続した双方向通信という手順を経ます。これらの手順とパケットのフラグとの関係は、以下のようになっています。

client ---> server接続開始を要求するパケットSYN=1, ACK=0
client <--- server接続を了解し、接続開始を要求するパケットSYN=1, ACK=1
client ---> server接続を了解するパケット(双方向通信確立)SYN=0, ACK=1
client <--> server通信確立後の継続した双方向通信パケットSYN=0, ACK=1

[注意]
-p tcp ! --tcp-flags SYN,ACK SYN
のように、フラグ指定に "!" を用いた場合、指定フラグの意味に要注意です。
この場合、{SYN=1, ACK=0} 以外、すなわち {SYN=1, ACK=1}, {SYN=0, ACK=1}, {SYN=0, ACK=0} を意味するのではなく、{SYN=1, ACK=0} の逆、すなわち {SYN=0, ACK=1} を意味します。
同様に、-p tcp ! --syn は、{SYN=0, RST=1, ACK=1} を意味するので、新規接続開始要求以外のパケットという意味ではなく、強制切断フラグが立ったパケットということになります。

[重要な訂正](2004.02.10)
上記の[注意]は、
http://www.linux.or.jp/JM/html/iptables/man8/iptables.8.html に記述されている
「--syn の前に "!" フラグを置くと、 SYN ビットがクリアされ ACK と RST ビットが設定されている TCP パケットにのみマッチする。」という一節を根拠にしたものです。一方、
http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO-7.html には、
「--syn は、SYN フラグがセットされていて、RST と ACK フラグがクリアされているパケットです。! --syn は、接続開始のパケットを除く全てのパケットです。」と記述されています。
まったく異なる説明でどちらが正しいのかということになりますが、実験の結果は、
http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO-7.html の記述が正しいことが判りました。したがって、前記の[注意]はまったく間違っていますので、ここに訂正させていただきます。

パケットフィルタリングの例

以下に、外部 I/F ppp0, 内部 I/F eth0 とした場合のパケットフィルタリングの例を紹介します。

■ 外部からの新規接続要求を拒否する
/sbin/iptables -A INPUT -i ppp0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
or /sbin/iptables -A INPUT -i ppp0 -p tcp --syn -j DROP

■ 外部からの、接続確立中 or 接続確立後パケットは受け付ける
/sbin/iptables -A INPUT -i ppp0 -p tcp --tcp-flags ACK ACK -j ACCEPT
or /sbin/iptables -A INPUT -i ppp0 -p tcp -m state --state ESTABLISHED -j ACCEPT

■ 外部への新規接続要求は拒否する
/sbin/iptables -A OUTPUT -o ppp0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
or /sbin/iptables -A OUTPUT -o ppp0 -p tcp --syn -j DROP

■ 外部への、接続確立中 or 接続確立後のパケットは許可する
/sbin/iptables -A OUTPUT -o ppp0 -p tcp --tcp-flags ACK ACK -j ACCEPT
or /sbin/iptables -A OUTPUT -o ppp0 -p tcp -m state --state ESTABLISHED -j ACCEPT

■ 外部からの新規接続要求をフォワードしない
/sbin/iptables -A FORWARD -i ppp0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
or /sbin/iptables -A FORWARD -i ppp0 -p tcp --syn -j DROP

■ 外部からの、接続確立中 or 接続確立後パケットはフォワードする
/sbin/iptables -A FORWARD -i ppp0 -p tcp --tcp-flags ACK ACK -j ACCEPT
or /sbin/iptables -A FORWARD -i ppp0 -p tcp -m state --state ESTABLISHED -j ACCEPT

■ 内部 I/F eth0 からの新規接続要求はフォワードする
/sbin/iptables -A FORWARD -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
or /sbin/iptables -A FORWARD -i eth0 -p tcp --syn -j ACCEPT

■ 内部 I/F eth0 からの、接続確立中 or 接続確立後パケットはフォワードする
/sbin/iptables -A FORWARD -i eth0 -p tcp --tcp-flags ACK ACK -j ACCEPT
or /sbin/iptables -A FORWARD -i eth0 -p tcp -m state --state ESTABLISHED -j ACCEPT

なお、ルーティングとパケットフィルタリングの事例を検討した結果について、別途掲載する予定です。

iptables チェーンルールの保存

# /sbin/iptables-save > /etc/sysconfig/iptables を実行します。
/etc/sysconfig/iptables に全てのチェーンルールが保存されます。
確認は # cat /etc/sysconfig/iptables で行います。
/etc/rc.d/rcX.d(X=3 or 5) 配下に S08iptables があれば、/etc/sysconfig/iptables によって、コンピューター起動時にチェーンルールが自動的に設定されます。
もし K08iptables となっている場合は、
# cd /etc/rc.d/rcX.d
# mv K08iptables S08iptables
# /etc/rc.d/init.d/iptables start とします。
チェーンルールが間違いなく設定されているどうかは、
# iptables -L で確認します。

戻る

[iptables によるファイアーウォール]

作成:2002年11月09日

Vine Linux 2.1.5 で稼動しているホームページ用 WWW Server を  Vine Linux 2.6 に移し替えるのを機会に、 ipchains によるファイアーウォールを iptables に変更しました。パケットフィルタリングの実状を公開するのはセキュリティー上は好ましくないのですが、公開することにしました。

■ [参考]
kh08-01[ネットワークの構築]
kh10-01[フレッツ-ADSL とファイア−ウォール設定]
kh11-02[公開 Web Server の構築]

ネットワーク構成
■ Host1
ルーター(ゲートウェイ、IP-Masquerade 機能)、ホームページ用 WWW Server、SSH ログイン要求を Host2 へフォワードする機能などを持った、ファイアーウォールです。

■ Host2
ローカルネットワーク内での、DNS, Samba, NFS, SSH, 等のサーバーです。

■ Host3
Linux(Vine Linux 2.5)と Windows 98 デュアルブートのクライアントマシンです。

 
図表(ネットワーク構成図)

 

機器構成

■ Host1
Machine  : IBM ThinkPad 380XD (PentiumII 233MHz, MEM=96MB)
eth0     : Corega Ether PCC-TX
eth1     : Corega EtherII PCC-T
Linux    : Vine Linux 2.6 r1

■ Host2
Machine  : PLAT'Home Entry System 700i(PentiumIII 800MHz, MEM=256MB)
eth0     : Intel PRO/100+
eth1     : Corega Ether PCI-TL(不使用)
Linux    : Vine Linux 2.1.5

■ Host3
Machine  : Gateway GP7-450 (pentiumIII 450MHz, MEM=256MB)
eth0     : Corega Ether PCI-T
OS       : Linux (Vine Linux 2.5) & Windows 98

iptables, IP-Masquerade のための準備設定

■ モジュールの準備
/etc/rc.d/rc.local に追記
以下の全てのモジュールが必要かどうか ? ですが、取り敢えずロードします。
/sbin/insmod ip_conntrack.o
/sbin/insmod ip_conntrack_ftp.o
/sbin/insmod ip_conntrack_irc.o
/sbin/insmod ip_nat_ftp.o
/sbin/insmod ip_nat_irc.o
/sbin/insmod ip_nat_snmp_basic.o
/sbin/insmod ip_queue.o
/sbin/insmod ip_tables.o

■ ip_forward の設定
/etc/sysctl.conf の設定
net.ipv4.ip_forward = 1

■ Source Address の正当性チェックの設定(Source Address Verification)
/etc/sysctl.conf に net.ipv4.conf.default.rp_filter = 1 とあるので、不必要かもしれないのですが、以下の設定を行いました。
/etc/rc.d/rc.local への追記
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then
    for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do
        echo 1 > $f
    done
fi

iptables の設定
訂正:2002年11月14日

/usr/local/sbin/ 配下に setiptables.sh を作成します。

--------以下、setiptables.sh の内容--------
#!/bin/sh

# Port list
portlist="21 22 23 25 53 98 110 111 113 119 123 137 138 139 161 194 515 518 901 1178 →
→2010 3128 5680 6000:6010 6667 7000:7010 8080 22273 22289 22305 22321"

# Accept port
# 80

# Clear rule
/sbin/iptables -F
/sbin/iptables -t nat -F

# Policy
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P INPUT  ACCEPT

# pong
/sbin/iptables -A OUTPUT -p icmp --icmp-type echo-reply -s 127.0.0.1 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp --icmp-type echo-reply -s ! 192.169.1.0/24 -j DROP

# IP masquerade
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

# INPUT Chain
/sbin/iptables -A INPUT -s xxx.xxx.xxx.xxx/yy -j DROP

for i in $portlist
do
    /sbin/iptables -A INPUT -p tcp --dport $i -s 127.0.0.1 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --dport $i -s ! 192.168.1.0/24 -j DROP
    /sbin/iptables -A INPUT -p udp --dport $i -s 127.0.0.1 -j ACCEPT
    /sbin/iptables -A INPUT -p udp --dport $i -s ! 192.168.1.0/24 -j DROP
done

# PREROUTING Chain
/sbin/iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 22 -j DNAT \
--to-destination 192.168.1.1:22
/sbin/iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 22 -j DNAT \
--to-destination 192.168.1.1:22

# FORWARD Chain
/sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.1 -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.1 -p udp --dport 22 -j ACCEPT
/sbin/iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP
--------以上、setiptables.sh の内容--------

■ /usr/local/sbin/setiptables.sh の内容説明
□ # Port list は、 外部からのアクセスを拒否するポート番号のリストです。これらのポートについては、tcp, udp ともに INPUT を拒否します。
port 番号とサービスプログラム、デーモンとの関係は以下に詳細に記載されています。
http://www.iana.org/assignments/port-numbers

□ # Clear rule と # Policy については、kh13-02[iptables 概要]を参照してください。

□ # pong では、外部から ping が入っても、返答しない設定です。ホストの存在を隠します。

□ # IP masquerade では、 ローカルエリア内からのパケットがインターネットに出ていくために、送信元のローカルアドレスをグローバルアドレスに変換します。この場合は、ADSL or ダイアルアップ接続で、動的IP-Address が割り当てられる想定です。

□ # INPUT Chain では、 まず特定のIP-Addressからのアクセス(不正アクセス等)を拒否します。次いで指定したポートについて、内部からのアクセスを許可し、外部からのアクセスを拒否します。

□ # PREROUTING Chain では、外部からの SSH(port 22)に向けられたパケットだけを、Host2 向けのパケットに変換します。

□ # FORWARD Chain では、上記の SSH(port 22)に向けられたパケットを Host2 にフォワードします。また、外部からの新規な接続パケットのフォワードを拒否します。

iptables の実行と保存
# cd /usr/local/sbin
# setiptables.sh
確認
# iptables-save > /etc/sysconfig/iptables
# cd /etc/sysconfig
# cat iptables

■ [2002.11.14 追記]
INPUT Chain において、外部からのアクセスは Port 80 以外全て拒否するというフィルタリング例です。

--------以下、setiptables.sh の内容--------
#!/bin/sh

# Clear rule
/sbin/iptables -F
/sbin/iptables -t nat -F

# Policy
/sbin/iptables -P INPUT DROP 
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

# IP masquerade
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

# INPUT Chain
/sbin/iptables -A INPUT -s xxx.xxx.xxx.xxx/yy -j DROP 

/sbin/iptables -A INPUT -i ! ppp0 -s 127.0.0.1 -j ACCEPT
/sbin/iptables -A INPUT -i ! ppp0 -s 192.168.1.0/24 -j ACCEPT

/sbin/iptables -A INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -i ppp0 -p udp --dport 80 -j ACCEPT

# PREROUTING Chain
/sbin/iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 22 -j DNAT \
--to-destination 192.168.1.1:22 
/sbin/iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 22 -j DNAT \
--to-destination 192.168.1.1:22

# FORWARD Chain
/sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.1 -p tcp --dport 22 -j ACCEPT
/sbin/iptables -A FORWARD -i ppp0 -d 192.168.1.1 -p udp --dport 22 -j ACCEPT
/sbin/iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP
--------以上、setiptables.sh の内容--------

戻る

counter1counter2counter3counter4counter5counter6

|Home|
 
Valid XHTML 1.1 Valid CSS!