なんとな~くしあわせ?の日記

JavaとかAWSの設定とかをメモする技術ブログ

プライベートIPしか取得できない環境でLinuxをルータとして使う方法

実質的には下記の記事の改訂版
レオネット攻略への道 - なんとな~くしあわせ?の日記

ネットワーク構成

[LAN]---[nic1]-[Linux1(Debian)]-[nic2]---[Linux2(Debian)]

isc-dhcp-server

まずはDHCPサーバのパッケージをインストール

 # apt-get install isc-dhcp-server

設定ファイルを作る。下の場合eth1〜eth4までがDHCPサーバがIPアドレスを配る範囲。それぞれセグメントは分ける。

# cat /etc/dhcp/dhcpd.conf

# Dynamic ip address configuration
#	-- DHCP clients are given these parameters. --

default-lease-time 6000;
max-lease-time 72000;
option domain-name-servers 8.8.8.8;
option domain-name "server.host.name.com";

# eth1
# subnet 192.168.20.0 netmask 255.255.255.0 {
#        interface eth1;
#        option subnet-mask 255.255.255.0;
#        option broadcast-address 192.168.20.255;
#        option routers 192.168.20.1;
#        range 192.168.20.130 192.168.20.140;
# }

# eth2
subnet 172.16.0.0 netmask 255.255.255.0 {
	interface eth2;
	option subnet-mask 255.255.255.0;
	option routers 172.16.0.1;
        range 172.16.0.5 172.16.0.15;
}

# eth3
subnet 192.168.16.0 netmask 255.255.255.0 {
	interface eth3;
	option subnet-mask 255.255.255.0;
	option broadcast-address 192.168.16.255;
	option routers 192.168.16.1;
	range 192.168.16.130 192.168.16.254;
}

# eth4
# subnet 192.168.20.0 netmask 255.255.255.0 {
# 	interface eth4;
# 	option subnet-mask 255.255.255.0;
# 	option broadcast-address 192.168.20.255;
# 	option routers 192.168.20.3;
#         range 192.168.20.151 192.168.20.160;
# }

設定ファイルを書いたらisc-dhcp-serverのサービスを 起動させればOK。

iptablesを設定する

さて、DHCPサーバを立てただけでは家庭内のLANから外部ネットワークに出られない。外部ネットワークに出るためにはiptablesを使用してパケットを透過させる必要が有る(というかそれが手っ取り早い)。下のようなシェルスクリプトを書いてやる。

# cat /etc/iptables.rules.sh

#!/bin/bash

# 現在の設定をクリア
iptables -F
iptables -t nat -F

# 異なるインターフェースへのパケットの転送を可とする
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p

# かつての方法だとうまくいかない
# 内側からeth0に対するマスカレードを定義する
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.16.0/21 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/21 -j MASQUERADE
# eth1からeth0へのフォワーディングを許可する
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 確立済みの接続に対するフォワーディングを許可する
iptables -A FORWARD -d 192.168.16.0/21 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -d 172.16.0.0/21 -m state --state ESTABLISHED,RELATED -j ACCEPT

# 設定保存/設定表示
iptables -L
iptables -t nat -L
/sbin/iptables-save -c > /etc/iptables.rules

実行すれば、この範囲「192.168.16.0/21」とこの範囲「172.16.0.0/21」のプライベートアドレスから、Linux1に来たパケットはeth0を通じて外に出られる。また、通信を確立したら外部ネットワークから内部へのパケットも受け入れるので普通のルータとして使用できる。

ひとこと

もしかしたらrasberry piとかでも出来るかもしれない(NICの拡張は必要)