読者です 読者をやめる 読者になる 読者になる

ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

CentOS6でLAN内サーバーからWANにアクセスする(ルータ構築)

CentOS6でLAN内サーバーからWANにアクセスする(ルータ構築)

環境

・サーバーA
ゲストOS(CentOS6)
eth0:192.168.10.30
eth1:10.0.10.30
※eth0がWAN(グローバルネットワーク)に繋がっている

・サーバーB
ゲストOS(CentOS6)
eth0:10.0.10.40
※WANにつながっていない

やりたいこと

  • サーバーAとサーバーB間でping通信
  • サーバーBからWANにping通信

サーバーBでの設定

固定IP設定

vi /etc/sysconfig/network-scripts/ifcfg-eth0

※抜粋

BOOTPROTO="none"
ONBOOT="yes"
IPADDR=10.0.10.40
PREFIX=24
NETMASK=255.255.255.0
DNS1=10.0.10.30
DNS2=10.0.10.30

サーバーBが直接繋がっているネットワークは、サーバーAしか無い為、デフォルトゲートウェイでサーバーAのIPを設定する。

デフォルトゲートウェイ設定

vi /etc/sysconfig/network
NETWORKING=yes
GATEWAY=10.0.10.30

ネットワーク再起動

/etc/init.d/network restart

デフォルトゲートウェイが反映されない場合があるのでOS再起動

reboot

ルーティングテーブル確認

[root@web ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.10.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         10.0.10.30      0.0.0.0         UG    0      0        0 eth0

ここまでの設定でサーバーBの全ての通信は10.0.10.30をゲートウェイとして通信される。

サーバーAの設定

IP設定

WAN側NIC
eth0

vi /etc/sysconfig/network-scripts/ifcfg-eth0

※抜粋

BOOTPROTO="none"
ONBOOT="yes"
IPADDR=192.168.10.30
PREFIX=24
GATEWAY=192.168.10.1
NETMASK=255.255.255.0
DNS1=192.168.10.1
DNS2=192.168.10.1

LAN側NIC
eth1

vi /etc/sysconfig/network-scripts/ifcfg-eth1

※抜粋

BOOTPROTO="none"
ONBOOT="yes"
IPADDR=10.0.10.30
PREFIX=24
NETMASK=255.255.255.0
GATEWAY=10.0.10.40

デフォルトゲートウェイ設定

vi /etc/sysconfig/network
NETWORKING=yes
GATEWAY=192.168.10.1

networkファイルでゲートウェイを設定する場合は/etc/sysconfig/network-scripts/route-eth*の空ファイルが無い事を確認する。
空ファイルがあるとデフォルトゲートウェイが正常に反映されない事があった。

ネットワーク再起動

/etc/init.d/network restart

デフォルトゲートウェイが反映されない場合があるのでOS再起動

reboot

ルーティングテーブル確認

[root@lb Desktop]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.0.10.0       0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         192.168.10.1    0.0.0.0         UG    0      0        0 eth0

サーバーAのデフォルトゲートウェイは192.168.10.1、
10.0.10.のゲートウェイは10.0.10.40。

IPフォワード設定

sysctl設定でIPフォワードの設定

vi /etc/sysctl.conf 

1に設定

net.ipv4.ip_forward = 1

反映

sysctl -p

再起動

reboot

iptables設定

iptablesコマンドを実行して設定。
ただし、これだと再起動時に設定が消えるのでiptablesスクリプトを組んだ方が良いかも。

iptables -A FORWARD -i eth1 -o eth0 -s 10.0.10.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o $WAN_NIC -s 10.0.10.0/255.255.255.0 -j MASQUERADE

上記3行を簡単に説明すると、
1.
       -i パケットを受信するインターフェイス
       -o パケットを送信するインターフェイス
       -s パケットの送信元
2.ステートフル性を確認し、「--state ESTABLISHED,RELATED」となっているものに通過許可
3.
-t nat natテーブルを使用
-A POSTROUTING POSTROUTINGチェインを使用し、内部ネットから外部ネットへ出ていくパケットのソースIPを書き換える
-o eth0 パケットが出ていくインターフェイス(eth0)を指定
-s $internal_net ソース側ネットワークアドレス(192.168.0.0/24)
-j MASQUERADE IPマスカレードを行う

IPマスカレードの設定を確認

[root@lb ~]# iptables -t nat -nL -v                                                                                   
Chain PREROUTING (policy ACCEPT 1186 packets, 81027 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 6 packets, 460 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 MASQUERADE  all  --  *      eth0    10.0.10.0/24         0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 30 packets, 1900 bytes)
 pkts bytes target     prot opt in     out     source               destination 

10.0.10.0/24をeth0にマスカレードしている。

疎通確認

サーバーAからサーバーB

[root@lb Desktop]# ping 10.0.10.40
PING 10.0.10.40 (10.0.10.40) 56(84) bytes of data.
64 bytes from 10.0.10.40: icmp_seq=1 ttl=64 time=0.231 ms
64 bytes from 10.0.10.40: icmp_seq=2 ttl=64 time=0.158 ms
64 bytes from 10.0.10.40: icmp_seq=3 ttl=64 time=0.501 ms

サーバーAからWANネットワーク
※ここではyahoo宛て

[root@lb Desktop]# ping 183.79.198.79
PING 183.79.198.79 (183.79.198.79) 56(84) bytes of data.
64 bytes from 183.79.198.79: icmp_seq=1 ttl=46 time=44.7 ms
64 bytes from 183.79.198.79: icmp_seq=2 ttl=46 time=42.9 ms

サーバーBからWAN
つながらない・・

[root@web ~]# ping 183.79.198.79
PING 183.79.198.79 (183.79.198.79) 56(84) bytes of data.
64 bytes from 183.79.198.79: icmp_seq=1 ttl=45 time=43.4 ms
64 bytes from 183.79.198.79: icmp_seq=2 ttl=45 time=43.2 ms

出来た!

注意ポイント

ちなみに、この設定かなりはまりました。
正直あきらめそうになった。。
ハマったポイントとして以下を注意。

デフォルトゲートウェイの設定
LANネットワークサーバーのデフォルトゲートウェイはルータのIPとなっている事。
デフォルトゲートウェイの設定出来てると思いきや、ちゃんと反映されてなかったりしてハマった。
設定後は「route -n」コマンドでデフォルトゲートウェイ反映が正常な事を確認する事。

iptablesでのIPマスカレード(IPフォワード)設定
ルータの為にはiptablesの設定が必要と知らずにまずハマる。
iptablesの設定が必要とわかった後も正しい設定にハマる。。

以下のようにpingでLANネットワークサーバーからWAN側に出れない時はIPフォワード周り(iptablesの設定とか)の可能性が高いです。
pingで固まる時も。

[root@web ~]# ping 183.79.198.79
PING 183.79.198.79 (183.79.198.79) 56(84) bytes of data.
From 10.0.10.30 icmp_seq=1 Destination Host Prohibited
From 10.0.10.30 icmp_seq=2 Destination Host Prohibited


以上で、基本的なルータ作成は完了。
後は必要に応じてiptablesで許可、拒否設定等行う。

後、LANネットワークのサーバーではDNSによる名前解決が出来ないみたいなので、別途DNSサーバーを構築する必要があり。
↓下記記事で構築しました。
toriaezu-engineer.hatenablog.com