ox0xo infosec tutorial

NAT/NAPT

2019-07-16

NATの概要

NATはIPアドレスの枯渇への対策として登場した技術です。

当社に1,000台のPCが存在するとしてそのすべてにグローバルIPアドレスを割り当てることは不可能です。 組織内の通信ではプライベートIPアドレスを使い、インターネットを利用する時だけグローバルIPアドレスを使うようにすればこの問題を緩和できます。

まずは社内とインターネットの境界にあるゲートウェイにグローバルIPアドレスを割り当てます。 内部から外部に通信するときにはパケットの送信元IPアドレスをゲートウェイのグローバルIPアドレスに変換してから送信します。 応答はゲートウェイのグローバルIPアドレスに返って来るので元のIPアドレスに変換して内部ネットワークに流します。 これがNAT(Network Address Translation)の基本です。

NAPTの概要

NAPTは一つのグローバルIPアドレスを複数のホストで共用するための技術です。

組織内のほぼ全てのPCがインターネット接続を必要とするようになると従来のNATでは対応しきれなくなりました。 NATのアドレス変換は1対1なのでプライベートIPの数だけグローバルIPが必要になるからです。 NAPTはゲートウェイのポート番号にプライベートIPアドレスを対応させて複数のプライベートIPをアドレス変換することが出来ます。 現在ではNATと言えばNAPTのことを指すのが一般的です。

NAT on CentOS

ここで仮にプライベートIPを 172.16.0.0/24 としてグローバルIPを 172.16.100.0/24 とします。 NATを使ってプライベートIPをグローバルIPに変換する環境を作ります。

setup command

# INTERNAL
## IPアドレス設定
nmcli connect modify enp0s8 ipv4.addresses 172.16.0.1/24

## ゲートウェイ設定
nmcli connect modify enp0s8 ipv4.routes "172.16.100.0/24 172.16.0.254"

## ネットワーク設定反映
nmcli connect down enp0s8 && nmcli connect up enp0s8

## IPアドレス確認
ip address show enp0s8

## ゲートウェイ確認
ip route
# NAT
## IPアドレス設定
nmcli connect modify enp0s8 ipv4.addresses 172.16.0.254/24
nmcli connect modify enp0s9 ipv4.addresses 172.16.100.254/24

## ネットワーク設定反映
nmcli connect down enp0s8 && nmcli connect up enp0s8
nmcli connect down enp0s9 && nmcli connect up enp0s9

## IPアドレス確認
ip address show enp0s8
ip address show enp0s9

# NAT用Firewallゾーン作成
firewall-cmd --new-zone nat_external --permanent
firewall-cmd --reload

## NAT有効
firewall-cmd --zone=nat_external --add-masquerade --permanent

# グローバルIPを持つインタフェースにNATを適用
firewall-cmd --zone=nat_external --change-interface=enp0s9 --permanent
firewall-cmd --reload
# EXTERNAL
## IPアドレス設定
nmcli connect modify enp0s8 ipv4.addresses 172.16.100.1/24

## ゲートウェイ設定
nmcli connect modify enp0s8 ipv4.routes "172.16.0.0/24 172.16.100.254"

## ネットワーク設定反映
nmcli connect down enp0s8 && nmcli connect up enp0s8

## IPアドレス確認
ip address show enp0s8

## ゲートウェイ確認
ip route

動作確認

NATの適用状況を確認するためにEXTERNALホストでtcpdumpを使います。 INTERNALからEXTERNALにpingを打った時に、NATの状態によってパケットがどう変化するか確認しましょう。

NAT無効

# NATのFierwallが次の状態のときNAT無効です
firewall-cmd --zone=nat_external --list-all | grep masq
#  masquerade: no
# INTERNALホスト -> EXTERNALホスト のPINGをtcpdumpでモニタしています
tcpdump -i enp0s8

# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
# listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
# 00:14:07.864084 IP 172.16.0.1 > client2: ICMP echo request, id 1746, seq 1, length 64
# 00:14:07.864142 IP client2 > 172.16.0.1: ICMP echo reply, id 1746, seq 1, length 64
# 00:14:08.865526 IP 172.16.0.1 > client2: ICMP echo request, id 1746, seq 2, length 64
# 00:14:08.865610 IP client2 > 172.16.0.1: ICMP echo reply, id 1746, seq 2, length 64

NATが利いていないのでプライベートIPがそのまま見えています。

NAT有効

# NATのFierwallが次の状態のときNAT有効です
firewall-cmd --zone=nat_external --list-all | grep masq
#  masquerade: yes
# INTERNALホスト -> EXTERNALホスト のPINGをtcpdumpでモニタしています
tcpdump -i enp0s8

# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
# listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
# 00:12:05.581705 IP 172.16.100.254 > client2: ICMP echo request, id 1742, seq 557, length 64
# 00:12:05.581797 IP client2 > 172.16.100.254: ICMP echo reply, id 1742, seq 557, length 64
# 00:12:06.583651 IP 172.16.100.254 > client2: ICMP echo request, id 1742, seq 558, length 64
# 00:12:06.583735 IP client2 > 172.16.100.254: ICMP echo reply, id 1742, seq 558, length 64

NATが利いているのでプライベートIPがグローバルIPに変換されています。


Content