この項では IP マスカレードについてご紹介します. IP マスカレードは, 例えば, グローバルアドレスがひとつしかない環境で
LAN 内のプライベートアドレス持った複数のクライアントからインターネットにアクセスすることを可能とするような仕組みです.
これを利用すると, 外部(インターネット)からは IP マスカレードが動作している端末しか見えないのでセキュリティ上, 望ましいですし, またグローバルアドレスが不足している場合にも,
インターネットを利用できるという利点があります.
IP マスカレードを利用するためにはカーネルで下記のオプションが有効になっている必要がありますが, 多くのディストリビューションでは有効になっているかと思います.
確認したい場合は, kernel configuration で出来ます. 下図に Kernel-2.2.x と Kernel-2.4.2 の場合の設定項目を示します.
| カーネル 2.2.x の場合 | |
| Networking options | |
| Network firewalls | y |
| TCP/IP networking | y |
| IP: firewalling | y |
| IP: masquerading | y |
| IP: ICMP masquerading | y |
| IP: masquerspecial modules support | y |
| IP: ipportfw masq support | m |
| IP: ipautofw masquerade support | m |
| IP: ip fwmask masq-forwarding support | m |
| カーネル 2.4.2 の場合 | |
| Networking options | |
| Network packet filtering | y |
| Network packet filtering debugging | y |
| IP netfilter configuration | |
| Connection tracking (required for masq/NAT) | m |
| FTP protocol support | m |
| IRC protocol support | m |
| IP tables support (required for filtering/masq/NAT) | m |
| limit match support | m |
| MAC address match support | m |
| netfilter MARK match support | m |
| Multiple port match support | m |
| TOS match support | m |
| tcpmss match support | m |
| Connection state match support | m |
| Unclean match support (EXPERIMENTAL) | m |
| Owner match support (EXPERIMENTAL) | m |
| Packet filtering | m |
| REJECT target support | m |
| MIRROR target support (EXPERIMENTAL) | m |
| Full NAT | m |
| MASQUERADE target support | m |
| REDIRECT target support | m |
| Packet mangling | m |
| TOS target support | m |
| MARK target support | m |
| LOG target support | m |
| ipchains (2.2-style) support | y |
関連文書: カーネルの再構築
IP マスカレードを設定する Linux ルーターには, LAN 側とインターネット側それぞれに NIC が必要です. そしてどちらも正常に動作していることが前提です.
その上でインターネット側にグローバルアドレスを割り当て, LAN 側にプライベートアドレスを割り当てます. Redhat 系ディストリビューションでのこの場合の設定ファイルは
/etc/sysconfig/network-scripts/ の下にインターネット側が ifcfg-eth1, LAN 側が ifcfg-eth0 というファイルを作ります.
----/etc/sysconfig/network-scripts/ifcfg-eth0----
DEVICE=eth0
IPADDR=10.158.0.21
NETMASK=255.255.255.0
NETWORK=10.158.0.0
BROADCAST=10.158.0.255
ONBOOT=yes
BOOTPROTO=static
-------------------------------------------
また, /etc/sysconfig/network では以下のように yes にしておきます.
--------------------------------
FORWARD_IPV4=yes
--------------------------------
ただし, Redhat Linux 6.2 以降のバージョンでは /etc/sysctl.conf に以下の記述を書きます.
--------------------------------
net.ipv4.ip_forward=1
--------------------------------
次に以下のコマンドを実行します.
# sysctl -p /etc/sysctl.conf
# cat /proc/sys/net/ipv4/ip_forward
ここで "1" と表示されなければいけません. "1" ならば IP フォワードが動作しているということです.
"0" ならば以下のコマンドで書き換えます.
# echo 1>/proc/sys/net/ipv4/ip_forward
これ起動時に実行させるには /etc/rc.d/rc.local にでも書き足しておきます.
次にルーティングの設定をします. この例では LAN 内へのパケットが eth0 に, インターネット側へのパケットは eth1 へ送られるようにします.
デフォルトゲートウェイはインターネット上(ISP など)のアドレスを指定します.
# route add -net 10.156.0.0 netmask 255.255.255.0 dev eth0
# route add default gw xxx.xxx.xxx.xx eth1
そして IP マスカレードの設定をします. ここでまず, 次のように必要なモジュールを組み込んでおく必要があります. そしてモジュールの組み込みが出来れば
IP マスカレードの設定を行います.
■ Kernel-2.2 の設定
# depmod -av
# modprobe ip_masq_ftp
# modprobe ip_masq_cuseeme
# modprobe ip_masq_raudio
# modprobe ip_masq_irc
ここまでがモジュールの組み込みです.
# ipchains -P forward DENY
# ipchains -A forward -s 10.158.0.0/24 -d 0.0.0.0/0 -j MASQ
上記の設定では, まずあらゆるパケット転送を禁止します. そして内部から外部へのパケット転送を特定のホストに限定せずにすべて許可します. それぞれのオプションですが, まず
-A で新しいルールを適用するためのものです. -s はパケットの送信元のアドレス, -d は転送先のアドレスで, -j はルールのターゲットが "MASQ"
で IP マスカレードであるということです.
■ Kernel-2.4 の設定
# modprobe iptable_nat
# modprobe ip_conntrack_ftp
# modprobe ip_nat_ftp
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 210.123.456.78
kernel-2.4 系では, ipchains の他に iptables が利用できますので, その iptables の設定をご説明します. 上記の例では, IP Masquerade を利用するために SNAT 使っています. プライベートアドレスが 192.168.0.0/24 として, インターネット側 (eth0) を -o で明示します. そして, --to で インターネット側の IP アドレスを指定します. この例では, 固定 IP アドレスが割り当てられている場合ですが, IP アドレスが動的な場合は次のようにすればいいでしょう.
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
もしもダイヤルアップで接続している場合は次のようにすればいいでしょう.
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
尚, iptables を利用する場合は, ipchains のモジュールを削除しておく必要があります.
ここで少しだけパケットフィルタリングについて触れておきます. チェインのポリシーを設定していきますが, まずすべてのパケットを拒否します.
# ipchains -P forward DENY
外に出て行くパケットは IP アドレスを変換します.
# ipchains -A forward -s 10.156.0.0/24 -d 0.0.0.0/0 -j MASQ
DNS のポートの通過を許可します.
# ipchains -A forward -p udp -s 10.156.0.0/24 1024:65535 -d 0.0.0.0/0 53 -j
ACCEPT
# ipchains -A forward -p udp -s 0.0.0.0/0 53 -d 10.156.0.0/24 1024:65535 -j
ACCEPT
telnet は, 内部からのみ許可します.
# ipchains -A forward -p tcp -s 10.156.0.0/24 1024:65535 -d 0.0.0.0/0 23 -j
ACCEPT
このようにルールを適用していきます. きちんとしたルールを設定していけばそれなりのセキュリティ対策にもなるかと思います.