ひよっこエンジニアの備忘録

日常とかSEとしての備忘を書いていきます。

NAT(Network Address Translation)

[NATとは]

IPアドレスを変換する技術。
主に内部(LAN)内のホストが外部(インターネット)へ通信する際に
プライベートIPをグローバルIPへ変換する技術として使われる。
※インターネットにアクセスするにはグローバルIPが必要
 グローバルIPの取得にはお金がかかる(大体1ipにつき9kくらい?)ことと
 そもそもグローバルIPの数に限りがあることからNAT(NAPT)によって
 プライベートIPをグローバルIPへ変換しインターネットにアクセスする。

インターネットアクセス以外にプライベートIPの重複回避や
外部からアドレス情報を隠蔽するために使用されるパターンもある。

[NAT用語]

・内部ローカルアドレス(Inside local)
 →内部ネットワークのホストに割り当てられるIPアドレス
  (つまり変換前のアドレス、LAN内のプライベートIP)
・内部グローバルアドレス(Inside global)
 →外部ネットワークから見た、内部ネットワークのホストのIPアドレス
  (つまり変換後のアドレス、グローバルIP
・外部ローカルアドレス(Outside local)
 →内部ネットワークから見た、外部ネットワークのホストのIPアドレス
・外部グローバルアドレス(Outside global)
 →外部ネットワークのホストに割り当てられるIPアドレス
 ※内部と外部で考え方が変わるので注意が必要。
・スタティックNAT
 →1対1でアドレス変換を行う
・ダイナミックNAT
 →1対多もしくは多対多で変換を行う。


[NAT動作]

送信元IPアドレス192.168.1.1を1.1.1.100に変換する
スタティックNATの動作例は下記のとおり。
・192.168.1.1のPCから1.1.1.1のサーバへ通信
・NATルータにより送信元アドレス192.168.1.1を1.1.1.100に変換
・1.1.1.1のサーバがパケット着信。
 送信元と送信先アドレスを逆転させ応答パケットを送信。
・NATルータにより送信先アドレス1.1.1.100を192.168.1.1へ変換
・192.168.1.1のPCが応答パケット着信

f:id:nrlay00:20180804211206p:plain

ポイントは上記のようなInsideSourceでNATを行う場合、
Inside側で着信した場合は送信元アドレス変換、
Outside側で着信した場合は送信先アドレス変換となること。

またInsideから着信した場合とOutsideで着信した場合で
RoutingとNATの処理順序が異なるため注意。
慣れないうちは頭の中でパケットフローを考えると混乱しやすい。

ダイナミックNATも上記と同じような動作をする・
しかしダイナミックNATにも欠点があり、例えばグローバルIPが3つある場合
インターネット向けに通信できるのは3ホストまでとなってしまう。
この制限を回避するため、グローバルIPとポート番号を紐づけて
NAT変換を行う技術をNAPTもしくはPATと呼ぶ。
インターネット接続時はNAPTを使用するのが一般的。

[NATコンフィグ]

スタティックNAT
①1対1でNAT変換する「ローカルアドレス」と「グローバルアドレス」を定義
 ip nat [ inside|outside] source static local-ip global-ip
 ※セグメント毎変換する場合は以下のように「network」コマンドを入れる
 ip nat [ inside|outside] source static network local-segment global-segment

②インターフェースに「内部」または「外部」を定義
 interface X/X
ip nat [ inside | outside ]
 
 EX)
 ip nat inside source static 192.168.1.1 1.1.1.100
 interface fa0/0
  ip address 192.168.1.254 255.255.255.0
  ip nat inside
  no shut
 interface fa0/1
  ip address 1.1.1.254 255.255.255.0
  ip nat outside
  no shut
 end

ダイナミックNAT
①NAT変換後アドレスのプールを作成
 ip nat pool pool_name start-ip end-ip [netmask mask | prefix-length length]
 ※interfaceアドレスへ変換する場合は不要
②NAT対象アドレスの範囲をACLで定義
 (standard)access-list number permit source wildcard
 (extended)access-list number permit protocol source wildcard [port] destination wildcard [port]
③変換前と変換後のACLとNATpoolを紐づける。
 NAPTする場合は末尾にoverloadをつける
 ip nat [ inside | outside ] source list X [ pool XXX | interface XXX ] [overload]
④インターフェースに「内部」または「外部」を定義
 interface X/X
ip nat [ inside | outside ]

EX)
 ip nat pool NAT1 192.168.1.1 192.168.1.254 netmask 255.255.255.0
 access-list 101 permit ip 192.168.1.1 0.0.0.255 any
 ip nat inside source list 101 pool NAT1
 interface fa0/0
  ip address 192.168.1.254 255.255.255.0
  ip nat inside
  no shut
 interface fa0/1
  ip address 1.1.1.254 255.255.255.0
  ip nat outside
  no shut
 end

 ※ちなみにダイナミックNATはACLに合致することが
  NATテーブル登録のトリガーとなります。
  上記の例だと、Inside側から着信した場合はNATが掛かりますが
  Outside側からの着信だとACLに引っかからなく、NATテーブルへの
  登録が発生しないためNATが掛かりません。

  (先日この事象にはまってしまいましたので備忘メモ。。)