プライベートIPしか取得できない環境でLinuxをルータとして使う方法
実質的には下記の記事の改訂版
レオネット攻略への道 - なんとな~くしあわせ?の日記
ネットワーク構成
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の拡張は必要)