第4回 Slackware で自宅サーバー! ルーター編

久々の “Slackware で自宅サーバー” シリーズの記事です。VPN サーバーを Slackware マシンで作っちゃうよ!というのを当面の目標にします。最近は Yahoo! オークションで Yamaha RTX シリーズなんかが数千円で買えちゃうので、わざわざ Linux マシンでやらなくても…なんて無粋な批判は受け付けません。VPN サーバーを作るなら断然 Slackware なのです。

さて、今回は本題に入る前に、Slackware でパケット転送ができるように設定しましょう。要は Slackware マシンをネットワークルーターとして動作させます。でないと VPN どころじゃないですからね!

VPN サーバーは NIC が1つあれば十分ですが、今回使うポンコツ PC は NIC が3つもついています。まずは実験で 2 つの NIC を使ってパケット転送してみます。VirtualBox でも内部ネットワークだのホストオンリーアダプタだのブリッジアダプターだのを駆使すれば、今回のような実験に使う分に不足ないと思います。

まず、現在パケット転送が有効かどうか確認してみます:

root@slackware14:~# cat /proc/sys/net/ipv4/ip_forward
0

“0” が表示されたので、無効だと分かりました。有効にするには、 “1” を書き込んでやります:

root@slackware14:~# echo 1 > /proc/sys/net/ipv4/ip_forward
root@slackware14:~# !cat
cat /proc/sys/net/ipv4/ip_forward
1

“1” になりましたね。これでパケット転送ができるようになりました。簡単!

ちなみに、以下のファンシーなコマンドを実行しても同じ効果があります:

# 現在の値の確認
root@slackware14:~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

# 値の変更
root@slackware14:~# sysctl -w 'net.ipv4.ip_forward=1'
net.ipv4.ip_forward = 1

さて、カーネルパラメータというのは上のように /proc 擬似ファイルシステム内のファイルにテキストデータを書き込むことで変更できますが、OS を再起動すると元通りになってしまいます。Slackware には /etc/rc.d/rc.ip_forward というスクリプトがあり、こいつに実行権限を付けておけば OS 起動時に上の echo コマンドを実行してくれます。せっかくだから利用しましょう:

root@slackware14:~# chmod +x /etc/rc.d/rc.ip_forward

これで枕を高くして寝ることができます。

次に NIC の設定です。Slackware では、NIC の設定を /etc/rc.d/rc.inet1.conf に記述します。今回は以下のようにしました(抜粋):

# Config information for eth0:
IPADDR[0]="192.168.3.12"
NETMASK[0]="255.255.255.0"
USE_DHCP[0]=""
DHCP_HOSTNAME[0]=""

# Config information for eth1:
IPADDR[1]="192.168.4.30"
NETMASK[1]="255.255.255.224"
USE_DHCP[1]=""
DHCP_HOSTNAME[1]=""

eth0 は社内 LAN、eth1 は実験用ネットワークにつながっています。なお、eth1 は頭の体操ということで半端なサブネットにしてみました。僕の頭はまだ大丈夫そうです。暗算に自信がない人は ipcalc を使いましょう: http://jodies.de/ipcalc

なお、VirtualBox を使う人は、eth0 をブリッジアダプタ、eth1 を内部オンリーアダプタにしておくといいと思います。

では eth1 の設定を反映しましょう:

root@slackware14:~# /etc/rc.d/rc.inet1 start

eth1 の IP アドレスを確認します:

root@slackware14:~# ip addr show dev eth1
4: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether 00:14:c2:09:30:68 brd ff:ff:ff:ff:ff:ff
    inet 192.168.4.30/27 brd 192.168.4.31 scope global eth1

バッチリです。eth1 にノート PC を接続してみます。VirtualBox の人は、別の仮想マシンを用意して、内部オンリーネットワークに接続してください。ノート PC の NIC は以下のように設定しました:

  • IP アドレス: 192.168.4.1
  • サブネットマスク: 255.255.255.224
  • デフォルトゲートウェイ: 192.168.4.30

それで実際にケーブルをノート PC と Slackware マシンに挿すんですが、今回用意した Slackware マシンは NIC が 3 つあり、1つは社内 LAN に接続済みなので、eth1 は残った 2 つの口のどちらかです。確認方法は、ケーブル接続後、Slackware マシンで以下のコマンドを発行します:

root@slackware14:~# ip link show dev eth1
4: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
    link/ether 00:14:c2:09:30:68 brd ff:ff:ff:ff:ff:ff

この例では

root@slackware14:~# ip link show dev eth1
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
    link/ether 00:14:c2:09:30:68 brd ff:ff:ff:ff:ff:ff

NO-CARRIER が消えたので、正しい口に接続できました。なお、表示がこのように変化するのは接続して数秒後です。リンクスピードとか MDI, MDI-X の判定とかで時間がかかるんでしょう。

これでいわゆるデータリンク層はつながったので、本題のネットワーク層が動作するか確認しましょう。ノート PC (Windows XP マシンです) で ping を実行します:

C:¥>ping 192.168.4.30

Pinging 192.168.4.30 with 32 bytes of data:

Reply from 192.168.4.30: bytes=32 time
Reply from 192.168.4.30: bytes=32 time
Reply from 192.168.4.30: bytes=32 time
Reply from 192.168.4.30: bytes=32 time
Ping statistics for 192.168.4.30:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

これでノート PC から Slackware マシンへの ping の送信ができることが分かりました。

次に 192.168.3.0/24 に ping を送りたいところですが、その前に一手間必要です。192.168.3.0/24 につながっているマシンは、192.168.3.0/24 以外のネットワークへのパケットは全てデフォルトゲートウェイである 192.168.3.254 に送ってしまい、Slackware マシン (192.168.3.12) が受け取る事ができません。例えば、ノート PC (192.168.4.1) が 192.168.3.1 に Ping を送信しても、彼は返事を 192.168.3.254 に送ってしまいます。192.168.3.0/24 につながるマシン全てに「192.168.4.0/27 宛のパケットは 192.168.3.12 に送りなさい」という風に設定する、192.168.3.0/24 のデフォルトゲートウェイで 192.168.4.0/27 宛のパケットを 192.168.3.12 に回送する、等の手もありますが、ここではお手軽に Slackware マシンでソース NAT します。192.168.4.0/24 からのパケットの送信元を 192.168.3.12 に書き換えてしまえば、192.168.4.0/27 から 192.168.3.0/24 への通信ができるようになります。ただし、192.168.3.0/24 から 192.168.4.0/27 宛に通信を開始することはできません。また、192.168.3.0/24 につながっているマシンからは、192.168.4.0/27 のマシンのアドレスが全て 192.168.3.12 になってしまうため、正確にマシンを識別することができなくなります。社内サーバーのアクセスログの価値が下がってしまうので、気をつけましょう。

ip_forward_network

ともあれ、Slackware マシンで iptables を設定します:

root@slackware14:~# iptables -t nat -A POSTROUTING -s 192.168.4.0/27 -j SNAT --to 192.168.3.12

設定できたか確認します:

root@slackware14:~# iptables -t nat -nvL POSTROUTING
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 SNAT       all  --  *      *       192.168.4.0/27       0.0.0.0/0            to:192.168.3.12

この状態でノート PC で ping 192.168.3.1 を試すと、正常に ping することができます。Slackware マシンがインターネットにつながるなら、ノート PC から ping 8.8.8.8 等、インターネット宛の通信も行えます。

この iptables も OS を再起動すると設定が消えてしまうので、init スクリプトに書かないといけません。Slackware には iptables を扱うようなスクリプトはないようなので、以下のようなスクリプトを書き、/etc/rc.d/rc.iptables として保存しました:

#!/bin/bash

CONF_PATH="/etc/rc.d/rc.iptables.conf"

case $1 in
    start|reload)
        if [ -f "$CONF_PATH" ]; then
            iptables-restore < "$CONF_PATH"
        else
            echo "No such file: $CONF_PATH"
            exit 1
        fi
        ;;
    save)
        iptables-save > "$CONF_PATH"
        ;;
    stop)
        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -t nat -P INPUT ACCEPT
        iptables -t nat -P OUTPUT ACCEPT
        iptables -t nat -P PREROUTING ACCEPT
        iptables -t nat -P POSTROUTING ACCEPT
        iptables -F
        iptables -t nat -F
        iptables -Z
        iptables -t nat -Z
        ;;
    *)
        echo "Usage: `basename $0` start|stop|reload|save"
        ;;
esac

早速実行します:

root@slackware14:/etc/rc.d# chmod +x /etc/rc.d/rc.iptables
root@slackware14:/etc/rc.d# /etc/rc.d/rc.iptables save

これで /etc/rc.d/rc.iptables.conf というファイルが作成されたはずです。

次に、rc.iptables が自動起動するよう、/etc/rc.d/rc.inet2 の中から rc.iptables を呼び出すようにします。以下はオリジナルとの差分です:

--- rc.inet2.orig	2012-12-06 12:20:17.066464783 +0900
+++ rc.inet2	2012-12-06 12:20:39.665463148 +0900
@@ -80,6 +80,11 @@
   . /etc/rc.d/rc.ip_forward start
 fi

+# Turn on iptables.
+if [ -x /etc/rc.d/rc.iptables ]; then
+  . /etc/rc.d/rc.iptables start
+fi
+
 # Start the inetd server:
 if [ -x /etc/rc.d/rc.inetd ]; then
   /etc/rc.d/rc.inetd start

今回はここまでです。ではまた次回!

(コウヅ)

広告

第4回 Slackware で自宅サーバー! ルーター編」への2件のフィードバック

  1. Slackware、とても好きです。
    筆者さんもとても好きです。
    このコーナー、特に注目しています。
    応援しています。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中