Linuxで作るADSL(PPPoE)ルーター

以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際にUNIXUSER 本誌に記載されたものとは異なる。誤字脱字等そのままである。

致命的な誤り以外は加筆修正等は行なわないので情報の鮮度に気をつけつつ 利用して欲しい。

目次


Part3 Linuxで作るADSL(PPPoE)ルーター

Part2にひきつづき、Linuxを利用したルータマシンを作成してみよう。ここでは 
Turbo Linux 7 Server 【脚註: 本誌2002年2月号付録CD-ROMににFTP 版が収録さ
れている】を例にADSL(PPPoE)ルーターを作る手順を示そう。

■NICの2枚差し

Part2で解説したFreeBSDの場合と同様、ルータとして動作させるためにLinuxマシ
ンに2枚のネットワークカードを装着することを前提とする。Linuxの場合2 つの
インタフェースがある場合それぞれ eth0, eth1 というインタフェース名でアク
セスすることになる。ここでは、

	WAN側(ADSLモデムと接続)		eth0
	LAN側				eth1

という接続になっていると仮定して解説を行なう。

■OSのインストール

ここでは Turbo Linux 7 Server を例としよう。HDDの容量次第でどのようなイ
ンストールタイプを選んでも良いだろう。ただ、最後のセキュリティレベルを選
ぶ画面では「高セキュリティ」を選んでおく方が間違いを起こしにくいだろう
【画面 ぬ】。

---[図 ぬ]------------------------------------------------------------


       %image(tl-install-sec.png)


----------------------------------------------------------------------

先月号付録CD-ROMに収録した Turbo Linux 7 インストーラでは最小インストー
ルタイプの「ランタイムシステム」を選んでもPPPoE接続に必要なパッケージ
(ppp と rp-pppoe)がインストールされた状態となる。もし、手元のLinuxマシン
に ppp, rp-pppoe が導入されていない場合はこれらをインストールしておこう。

  【例:】
	# rpm -i ppp-2.4.1-2.i386.rpm
	# rpm -i rp-pppoe-3.2-3.i386.rpm

■ネットワーク設定の確認

FreeBSDと同様、ルータとして利用するマシンではIPフォワーディングを有効に
しておく必要がある。/etc/sysctl.conf にある

  # Disables packet forwarding
  net.ipv4.ip_forward = 0

を書き変えて

  # Enables packet forwarding
  net.ipv4.ip_forward = 1

にしておこう。リブートせずにIPフォワーディングを有効にするにはコマンドラ
インから

  # sysctl net.ipv4.ip_forward=1

とする。

■PPPoEの設定

LinuxでPPPoE接続を行なうには rp-pppoe
【脚註: http://www.roaringpenguin.com】
を利用するのが一般的である。ここでは rp-pppoe が導入されているものとして、
それを利用したPPPoE接続の設定方法を解説しよう。rp-pppoe では、adsl-setup 
コマンドを利用すると対話的にパラメータを設定できる。接続環境を以下のもの
と仮定する。

	配給されたIPアドレス		192.168.1.12
	アカウント名			PPPoEaccount@provider
	パスワード			PPPoEpassword
	LANのネットワークアドレス	10.0.1.0/24
	ADSLモデムへのインタフェース	eth0
	LAN側インターフェース		eth1

対話的セットアップ作業に先立ち、システム起動時にはADSL側のネットワークイ
ンタフェースを利用しないように変えておく。/etc/sysconfig/network ファイ
ルから GATEWAY と GATEWAYDEV の記述を削除する。

  ---[ /etc/sysconfig/network ]---
	GATEWAY=172.16.212.1	    ←削除
	GATEWAYDEV=eth0		    ←削除

 また /etc/sysconfig/network-scripts/ifcfg-eth0 で、eth0デバイスを起動時
に有効化しない記述にする。

  ---[ /etc/sysconfig/network-scripts/ifcfg-eth0 ]---
	DEVICE=eth0
	ONBOOT=no

adsl-setup コマンドを起動して質問に答えていく。

# adsl-setup
Welcome to the Roaring Penguin ADSL client setup.  First, I will run
some checks on your system to make sure the PPPoE client is installed
properly...

Looks good!  Now, please enter some information:

  ↓↓最初にアカウント名を入力する

USER NAME

>>> Enter your PPPoE user name (default bxxxnxnx): PPPoEaccount@provider
                                                   ~~~~~~~~~~~~~~~~~~~~~

  ↓↓PPPoEを行なうネットワークインタフェース名を入力する


INTERFACE

>>> Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethn, where 'n' is a number.
(default eth1): eth0
                ~~~~

  ↓↓自動接続時の自動切断時間を聞いて来る。常時接続の場合は no と答える。

Do you want the link to come up on demand, or stay up continuously?
If you want it to come up on demand, enter the idle time in seconds
after which the link should be dropped.  If you want the link to
stay up permanently, enter 'no' (two letters, lower-case.)
NOTE: Demand-activated links do not interact well with dynamic IP
addresses.  You may have some problems with demand-activated links.
>>> Enter the demand value (default no): no
                                         ~~

  ↓↓ネームサーバを答える。既に /etc/resolv.conf が設定してある場合は
  [Enter]のみを、セッション確立時に自動設定する場合は server と答える。

DNS

Please enter the IP address of your ISP's primary DNS server.
If your ISP claims that 'the server will provide DNS addresses',
enter 'server' (all lower-case) here.
If you just press enter, I will assume you know what you are
doing and not modify your DNS setup.
>>> Enter the DNS information here: server
                                    ~~~~~~

  ↓↓PPPoE接続のパスワードを入力する

PASSWORD

>>> Please enter your PPPoE password: PPPoEpassword     (実際には表示されない)
                                      ~~~~~~~~~~~~~
>>> Please re-enter your PPPoE password: PPPoEpassword  (実際には表示されない)
					 ~~~~~~~~~~~~~

  ↓↓自動設定されるファイアーウォールの種別を選択する。NAT機能も有効に
  したい場合は 2 を選ぶ。

FIREWALLING

Please choose the firewall rules to use.  Note that these rules are
very basic.  You are strongly encouraged to use a more sophisticated
firewall setup; however, these will provide basic security.  If you
are running any servers on your machine, you must choose 'NONE' and
set up firewalling yourself.  Otherwise, the firewall rules will deny
access to all standard servers like Web, e-mail, ftp, etc.  If you
are using SSH, the rules will block outgoing SSH connections which
allocate a privileged source port.

The firewall choices are:
0 - NONE: This script will not set any firewall rules.  You are responsible
          for ensuring the security of your machine.  You are STRONGLY
          recommended to use some kind of firewall rules.
1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
                for a LAN
>>> Choose a type of firewall (0-2): 2
				     ~


  ↓↓入力に間違いがなければ y を答える。

** Summary of what you entered **

Ethernet Interface: eth0
User name:          PPPoEaccount@provider
Activate-on-demand: No
DNS addresses:      Supplied by ISP's server
Firewalling:        MASQUERADE

>>> Accept these settings and adjust configuration files (y/n)? y
								~

  ↓↓問題がなければ /etc/ppp 以下の設定ファイルが自動調整されて完了する。

Adjusting /etc/ppp/pppoe.conf
Adjusting /etc/ppp/pap-secrets and /etc/ppp/chap-secrets
  (But first backing it up to /etc/ppp/pap-secrets-bak)
  (But first backing it up to /etc/ppp/chap-secrets-bak)

Congratulations, it should be all set up!

Type 'adsl-start' to bring up your ADSL link and 'adsl-stop' to bring
it down.  Type 'adsl-status' to see the link status.


続いて、動作確認のため adsl-start を起動してみよう。

# adsl-start
. Connected!

のように 「Connected!」と表示されれば成功である。adsl-status コマンド
により接続に関する情報が表示される

# adsl-status
adsl-status: Link is up and running on interface ppp0
ppp0      Link encap:Point-to-Point Protocol  
          inet addr:192.168.1.12  P-t-P:192.168.1.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:46 (46.0 b)  TX bytes:52 (52.0 b)

もしうまく接続できない場合は、Part2のFreeBSDの場合と同様のチェックポ
イントを当たってみよう。

接続までうまく行くことが確認できたら、次回起動時以降自動的にadsl-start 
が走るようにしておく。

	# chkconfig adsl on

■LANと外部ネットワークとの接続

FreeBSDでの設定例と同様、プロバイダからグローバルIPアドレスを1個もらう場
合だとして、LANから外部ネットワークへはPCルータによるNATを介してアクセス
できるように設定しよう。

先に述べた adsl-setup コマンドの「FIREWALLING」の問いに対して「2 -
MASQUERADE」を選んだ場合は、PPPoE接続完了後に /etc/ppp/firewall-masq ス
クリプトを自動的に呼び出すようになる。本来ここでNATが有効化されるのだが
このスクリプトで前提となっているのは ipchains である。ドキュメントにある
ようにカーネル2.6または2.8が出る頃にはipchainsは廃止が予測されている。
したがって、これから新たにルータマシンを立てる場合にはiptables を利用す
るのが有利だろう。

ここでは、iptablesについての簡単な説明と、パケットフィルタリング・NAT 機
能の有効化について順を追って解説しよう。

■iptablesによるパケットフィルタリング

  ●ipchainsとiptables

  カーネル2.4で本格的に導入された iptables は、それまでのipchainsを置き
  換える形で設計されている。両者は同時に使用することができないので、もし
  システムが既にipchainsモジュールをロードしている状態になっていたら、こ
  れをアンロードする必要がある。

	# lsmod

  として、ipchains が存在する場合は chkconfig ipchains off しておくと、
  次回起動時以後ipchainsもジュールはロードされなくなる
  【脚註: カーネルに組み込まれている場合は ipchains を外して再構築する必
  要がある】

  ●iptablesの動作概念

  iptablesを利用したパケットフィルタリングを行なう場合には、カーネルを中
  心としたパケットの流れを基準に考える必要がある。iptablesでは、フィルタ
  リング対象となるパケットを【図 を】のように取り扱う。

    * INPUT	外部からカーネルに入って来るパケットに対するルールセット
    * FORWARD	別のインタフェースにIPフォワードされるパケットに対する
		ルールセット
    * OUTPUT	カーネルから外部に出ていくパケットに対するルールセット

  あらかじめパケットの向かう方向に応じて3分類されたルールセットにフィル
  タリングルールを追加していく。iptablesではこのルールセットのことを「チェ
  イン」という。


http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO-6.html

----[図 を]-----------------------------------------------------------
  入方向  ┌──────┐   / ̄ ̄ ̄\        出方向
      ―→│ルーティング│→|FORWARD |――→
          │の決定      │   \___/         ↑
          └──────┘                      │
                   │                           │
                   ↓                        / ̄ ̄\
                / ̄ ̄\                    |OUTPUT|
               |INPUT |                    \__/
                \__/                        ↑
                   │                           │
                   └─→ ローカル プロセス ──┘
----------------------------------------------------------------------

  ●チェインの操作

  フィルタリングルールは、iptablesコマンドを用いて INPUT, OUTPUT,
  FORWARD いずれかのチェインにルールを登録していく。チェインへのルールの
  追加は

	# iptables -A <チェイン> <条件> -j ターゲット

  としておこなう。ターゲットとしては

	ACCEPT	パケットを通過させる
	DROP	パケットを弾き落とす
	QUEUE	パケットをユーザスペースに送る

  という代表的アクションの他、別のチェインへ評価先を経由させることができ
  る。たとえば、外部に接続されたネットワークインタフェース(PPPoEの場合は
  ppp0)から入って来るパケットは到達点によって INPUT, FORWARD いずれかの
  チェインを通過することになる。このような場合、同じフィルタリングルール
  を適用する場合も、INPUTチェイン/FORWARDチェイン、それぞれに同じルール
  を書きた場合がある。もし、パケットの到達点に依らない共通のフィルタリング
  ルールが多数ある場合は、その共通部分をくくり出して、もう一つ別の「ユー
  ザ定義チェイン」に登録して使うと(管理上の)効率が良くなる。

  新しいチェインは以下の操作で作成/クリア/削除できる。

  * 作成
	# iptables -N <チェイン>
  * 登録されたルールの全クリア
	# iptables -F <チェイン>
  * 削除
	# iptables -X <チェイン>

  削除のときには、ルールを空にしておく必要があるので -X の操作の前には
  -F が必要となる。また、-F はINPUT, OUTPUT, FORWARDなどの組込みチェイン
  に対しても有効な操作である。

  以下で実例を示すが、上記のようにして作成したユーザ定義チェインに評価先
  を経由させる場合は

	# iptables -A INPUT <条件> -j <ユーザ定義チェイン>
	# iptables -A FORWARD <条件> -j <ユーザ定義チェイン>

  のようにすればよい。

  ●条件の記述

  実際にフィルタリング対象となるパケットの比較条件に利用できる iptables
  のオプションのうち代表的なものを以下に示す。これらを0個以上組み合わせ
  たものが一つのルールのマッチング条件となる。[]で囲んだものは省略可能を
  意味する。ここに列挙したもの以外に関しては iptables(8) マニュアルページ、
  もしくは Linux 2.4 Packet Filtering HOWTO
  【http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO.html】
  を参考にしてほしい。

  --------------------------------------------------
  -p [!] プロトコル		パケットのプロトコルの種別
  (--protocol)			tcp, udp, icmp, all あるいは
				/etc/protocols にある識別子または番号を
				指定できる。! をつけると NOT の意味にな
				り条件を否定できる
  --------------------------------------------------
  -s [!] アドレス[/マスク]	パケットのソースアドレスの選別指定
  (--source, --src)		! をつけると「否定」になる
  --------------------------------------------------
  -d [!] アドレス[/マスク]	パケットのデスティネーションアドレスの選別指定
  (--destination, --dst)	! をつけると「否定」になる
  --------------------------------------------------
  -i [!] インタフェース名	入り方向のインタフェース名の選別指定
				INPUT, FORWARD, PREROUTING チェインでの
				み指定可能
				! をつけると「否定」になる
  --------------------------------------------------
  -o [!] インタフェース名	出方向のインタフェース名の選別指定
				OUTPUT, FORWARD, POSTROUTING チェインでの
				み指定可能
				! をつけると「否定」になる
  --------------------------------------------------
  [!] -f			フラグメントパケットの選別指定
  (--fragment)			! をつけると「否定」になる(つける位置に
				注意)
  --------------------------------------------------



  また、以下の条件は -p で指定したプロトコルが特定の場合のみ意味を持つ。

  プロトコル	     オプション		 意味
  ----+---------------------------------+-------
  tcp	--source-port [!] [port[:port]]	 ソースポートの選別指定
  udp	--sport				 2つの値を:で区切るとその範囲
					 全てを意味する
					 !をつけると「否定」になる
  ----+---------------------------------+-------
  tcp	--destination-port [!] [port[:port]]	行先ポートの選別指定
  udp	--sport				 2つの値を:で区切るとその範囲
					 全てを意味する
					 !をつけると「否定」になる
  ----+---------------------------------+-------
  tcp	--tcp-flags [!] mask comp
		    パケットのTCPフラグの選別指定。maskには、調べたいフ
		    ラグ全てをカンマ(,)で区切って示し、そのうちセットさ
		    れているべきものをcompに列挙する。
		    ! をつけると「否定」になる
  ----+---------------------------------+-------
  tcp	[!] --syn
		   --tcp-flags SYN,RST,ACK SYN と同値。この種のパケット
		   はTCPコネクション開始時のものである。
  ----+---------------------------------+-------

  これらの比較は -p の指定により自動的にロードされた拡張比較モジュールで
  実現されている。これら以外にも -m オプションで明示的にモジュール利用を
  指示して使うことができる比較条件がある。本稿ではとくに有用な以下の拡張
  モジュールとそれによって可能となる比較を利用する。

  モジュール	比較条件			意味
  multiport	--source-port <ポートリスト>	ポート番号をカンマで区切っ
		(--sport) 			て複数の接続元ポートを指
						定。-p tcp, -p udp いず
						れかで利用可能
		+----------------------------------------------------------
  		--destination-port <ポートリスト> ポート番号をカンマで区切っ
		(--dport)			て複数の接続先ポートを指
						定。-p tcp, -p udp いず
						れかで利用可能
						れかで利用可能
		+----------------------------------------------------------
  		--port <ポートリスト> 		ポート番号をカンマで区切っ
		(--dport)			て複数の接続元ポートまた
						は接続先ポートを指
						定。-p tcp, -p udp いず
						れかで利用可能
   -------------------------------------------------------------------------
   state	--state <状態>	  コネクションの状態に関する比較。
				<状態>を示すキーワードとして
				INVALID		不当な接続
				ESTABLISHED	確立済みのコネクション
				NEW		新規コネクション
				RELATED		新規コネクションだが、
						既存コネクションに関連す
						るもの。たとえば、ftp-data
						など。

  ●ポリシーの設定

  iptablesのフィルタリングテーブルでは、どこでも落とされず「チェイン」の
  末尾まで通り抜けたパケットを通過させるか弾き落とすかのデフォルト動作を
  決定できる。これを「ポリシー」といいiptablesの-Pオプションで変更できる。

	# iptables -P <チェイン> <ターゲット>

  とすることで <チェイン> の末尾まで到達したときのターゲットが、 <ターゲッ
  ト> になる。たとえば、

	# iptables -P INPUT DROP

  とすると、INPUTチェインのポリシーが DROP(つまりパケット破棄)になる。


  ●フィルタリングルールの設定例
  以上を用いてFreeBSD(ipfw)でのフィルタリングルール(???ページ)と同様の方
  針のルールを書いてみよう。方針としては

	* ローカルホストパケットを許可	
	* LAN内との通信を許可
	* 確立済コネクションの通過
	* LANから外部へのTCP接続を全て通す
	* 必要なUDPパケットの通過
	* 外部に提供するサービスの通過
	* ICMPの通過
	* 上記以外のものを拒否

  というものである。ipfwでは全てのルールを同一のテーブルに登録していった
  のだが、iptablesではパケットの方向によって違うチェインを使うことに注意
  する。今回のルールでは「外に出て行くものは許し、入って来るものを制限」
  というのが前提なので、OUTPUTチェインにはとくにルールを設定せず、ポリシー
  を「ACCEPT」にする。逆に、入り方向として考えられる INPUT, FORWARD両チェ
  インに ???ページ (←ipfwのページ)と同様のルールを設定する。ここでは、
  同一のルールを設定するため、新たなチェイン 「myrule」 を作成し、そこに
  登録して行こう。そして、INPUT, FORWARD両チェインから全てのパケットを
  myrule チェインに向かわせることでパケットの行先にかかわらず同じルール
  を適用させる【図 わ】。

----[図 わ]-----------------------------------------------------------
  入方向  ┌──────┐   / ̄ ̄ ̄\        出方向
      ―→│ルーティング│→|FORWARD |――→
          │の決定      │   \___/         ↑
          └──────┘   │    ↑           │
                   │        ↓    │           │
                   ↓     +------+ │        / ̄ ̄\
                / ̄ ̄\→|myrule|→        |OUTPUT|
               |INPUT | +------+           \__/
                \__/ ←                     ↑
                   │                           │
                   └─→ ローカル プロセス ──┘

 ※※INPUTとFORWARDのチェインから myrule にいったん経由して元に戻る絵
----------------------------------------------------------------------

  さて、では実際にルールを決定して行こう。

  * チェインの準備

    OUTPUTチェインはデフォルトで全て許可し、INPUT, FORWARDチェインはデフォ
    ルトで全て破棄するようにポリシーを決めて、全てのチェインのルールを消
    去する。

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

iptables -F FORWARD
iptables -F INPUT
iptables -F OUTPUT

    また、INPUT, FORWARD共通で使うためのユーザ定義チェイン myrule を作成
    する。

iptables -N myrule
iptables -F myrule

    そして、INPUTチェイン、FORWARDチェインに入って来たものを全て myrule
    チェインを通すようにする。

iptables -A INPUT -j myrule
iptables -A FORWARD -j myrule

  * ローカルホストパケットを許可

    ループバックインタフェース(lo)を通るパケットを許可し、それ以
    外のインタフェースからの127.0.0.0/8パケットは破棄する。

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.0/8 -i '!' lo -j DROP

  * LAN内との通信を許可

    LAN内パケットは eth0 インタフェースを通過する 10.0.1.0/24 のもので
    ある。

iptables -A myrule -i eth1 -s 10.0.1.0/24 -j ACCEPT

    もし複数のLANがある場合はネットワークアドレス指定を適宜書き変える。

  * 確立済コネクションの通過

    TCPのestablished connectionと、フラグメントパケットは通過させる。前
    者については拡張マッチングモジュール state をロードする必要があるの
    で -m state を付加する。

iptables -A myrule -p tcp -m state --stat ESTABLISHED -j ACCEPT
iptables -A myrule -f -j ACCEPT

  * LANから外部へのTCP接続を全て通す

    これに関してはOUTPUTチェインのポリシーで全通過させているので特にルー
    ルを書く必要はない。

  * 必要なUDPパケットの通過

    DNS(53)とNTP(123)を通過させたい場合以下のように記述する。

iptables -A myrule -p udp --dport 53 -j ACCEPT
iptables -A myrule -p udp --sport 53 -j ACCEPT
iptables -A myrule -p udp --dport 123 -j ACCEPT
iptables -A myrule -p udp --sport 123 -j ACCEPT

  * 外部に提供するサービスの通過

    外部ネットワークに公開したいサービスとして SSH(22), SMTP(25),
    HTTP(80), POP3(110)を通過させたい場合は次のようになる。拡張マッチン
    グモジュール multiport を利用すると次のように1行のルールで書ける。

iptables -A myrule -p tcp -m multiport --dport 22,25,80,110 -j ACCEPT

  * ICMPの通過

    ネットワーク到達性試験のためにICMPを通したい場合は以下を追加。

iptables -A myrule -p icmp -j ACCEPT

  * 上記以外のものを拒否

    myruleチェインの末尾まで達したパケットは、INPUTチェインあるいは
    FORWARDチェインに復帰して、それらのポリシーである DROP によって弾き
    落とされることになる。ただ、ルールセットの調整を行なっているときは必
    要ならログを出すようにしておくと良いだろう。

iptables -A myrule -j LOG

	-	-	-	-

●NATの設定

  iptablesでは、3つの「テーブル」を扱うようになっている。これまで解説し
  たパケットフィルタリングを行なうための "filter" のほかに、"nat",
  "mangle" がある。iptables でNATを行なうために利用するのが "nat" テーブ
  ルである。

  今回の例の場合は、LANからppp0インタフェースを経由して外に出ていくパケッ
  トのNAT処理を行ないたいので、nat テーブルの POSTROUTING チェインに
  ターゲット MASQUERADE を指定すればよい。

	# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

  これにより、LAN内の全マシンから外部のサービスに(NATを介して)接続できる
  ようになる。

●スクリプト化

  以上をまとめてスクリプト化し、PPPoE接続時に自動的に呼んでもらうために
  /etc/ppp/firewall-masq ファイルにセーブする【リスト か】。

---[リスト り /etc/rc.firewall.local]---------------------------------
#!/bin/sh
#
# firewall-masq         This script sets up firewall rules for a machine
#                       acting as a masquerading gateway
#
# Copyright (C) 2000 Roaring Penguin Software Inc.  This software may
# be distributed under the terms of the GNU General Public License, version
# 2 or any later version.

# Interface to Internet
EXTIF=ppp+

ANY=0.0.0.0/0

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

iptables -F FORWARD
iptables -F INPUT
iptables -F OUTPUT

# Make own rule set chain
iptables -N myrule
iptables -F myrule

# Bypass to myrule
iptables -A INPUT -j myrule
iptables -A FORWARD -j myrule

# Allow packets in local
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.0/8 -i '!' lo -j DROP

# Allow packets within LAN
iptables -A myrule -i eth1 -s 10.0.1.0/24 -j ACCEPT
# Established packets
iptables -A myrule -p tcp -m state --stat ESTABLISHED -j ACCEPT
# Fragments

iptables -A myrule -f -j ACCEPT
# Essential UDP's
iptables -A myrule -p udp --dport 53 -j ACCEPT
iptables -A myrule -p udp --sport 53 -j ACCEPT
iptables -A myrule -p udp --dport 123 -j ACCEPT
iptables -A myrule -p udp --sport 123 -j ACCEPT
# Pass SSH, SMTP, HTTP, POP3
iptables -A myrule -p tcp -m multiport --dport 22,25,80,110 -j ACCEPT
# Allow ICMP
iptables -A myrule -p icmp -j ACCEPT

# Log the rest
iptables -A myrule -j LOG

# Do masquerading
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# Ensure IP forwarding here
sysctl -w net.ipv4.ip_forward=1
----------------------------------------------------------------------


■DHCPサーバ

Linuxでも ISC-DHCP が利用できる。今回インストールした Turbo Linux 7
Server でもデフォルトでDHCPサーバがインストールされる。これは以下のコマ
ンドで確認できる。

	# rpm -qa | grep dhcp
	dhcp-client-2.0pl5-3
	dhcp-2.0pl5-3

上記の場合 dhcp-2.0pl5-3 がDHCPサーバに必要なパッケージである。インストー
ルされていない場合は、dhcp-<バージョン名>.rpm を入手して

	# rpm -i dhcp-<バージョン名>.rpm 

としてインストールしよう。

isc-dhcp 2.x の場合は dhcpd.conf の書式が若干異なる。

---[ /etc/dhcpd.conf ]------------------------------------------------
#
# dhcpd.conf
#

# ドメイン名とネームサーバ
option domain-name "example.com";
option domain-name-servers ns.example.com;

# lease時間の指定
default-lease-time 600;
max-lease-time 7200;

# LANの
subnet 10.0.1.0 netmask 255.255.255.0 {
        # ゲートウェイアドレス
        option routers 10.0.1.1;
        # Unknown clients get this pool.
        # 使わせるIPアドレスの範囲指定
        range 10.0.1.200 10.0.1.253;
}
----------------------------------------------------------------------

  /var/dhcp/dhcpd.leases ファイルを作成し、dhcpdを-dオプションつきで起動
  してみる。

	# touch /var/lib/dhcp/dhcpd.leases
	# dhcpd -d

  これでエラーメッセージとともに異常終了しなければ、次回起動時にはDHCPサー
  バとして機能するように

	# chkconfig dhcpd on

  としておこう。

■まとめ

PPPoE接続、NAT機能、パケットフィルタリング、DHCPサーバ、これらの機能が揃
えばホームルータとしての役割は十分に果たせるだろう。単なるルータから始め
て、WWWやメイルサーバなど自分のところでサービスしたいものを順次追加して
育てていくのも常時接続環境で得られる大きな楽しみのひとつだろう。


yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]