【17日目】TCP/IPネットワーク入門(第7章Source NAT編)

皆さん,こんにちは.bb_lotusです. さて,今回はTCP/IPネットワークに関しての17日目のアウトプットになります.

すぐアウトプットだけ見たい人はこちらから

(ネットワーク初学者のため,記載内容等間違いがありましたらどしどしコメント,指摘等していただければと思います.)

使用する教材はこちらです.

 

Linuxで動かしながら学ぶTCP/IPネットワーク入門」

 

Linuxで動かしながら学ぶTCP/IPネットワーク入門 | もみじあめ |本 | 通販 | Amazon

www.amazon.co.jp

 

--------------↓ここからアウトプット--------------

今回から第7章に入っていきます!

だいぶ後半まできました!

題材はNATというものになります!それでは早速やっていきましょう!!

 

・NATとは

Network Address Translationの略.

NATは前回までとは少し違い,特定のプロトコルを指した用語ではない.

IPアドレスを変換する」という概念を指している.

DHCPと同じくらい利用されているみたい..

 

・なぜNATという概念ができたのか

IPアドレスIPv4アドレス)が足りなくなったから.

 

厳密にはNATの一種であるNAPT(Network Address Port Translation)が利用される.

 

簡易的なイメージ図を書いてみました!

f:id:bb_lotus:20220413204457j:plain


まず,LANというのが,ローカルのネットワークのことで,主に家庭や組織内のネットワークを指しています.LAN内で用いられるIPアドレスプライベートアドレスといい,上で記載されているプレフィックスがプライベートアドレスとして使用できるように予約されています.

 

このプライベートアドレスはLAN内では使えるのですが,ヘッダにプライベートアドレスが含まれるパケットは,インターネットではルーティングできないためNATによってグローバルアドレスに変換し,インターネットを利用できるようにしているんです.

 

・NATの種類

 Source NAT:一般的にNATまたはNAPTというときはこっちを指す.

文字どおりパケットの送信元IPアドレス(Source IP Address)を変換(書き換え)する.

LAN内のプライベートアドレス→インターネットで通用するグローバルアドレス

 

 Destination NAT:「ポートを空ける」という行為を指す.

 

今回はNATの中でもSource NATについてやっていきます!!

 

一般的に,NATはルータが実施します.

書き換えるのは送信先がグローバルアドレスで,送信元がプライベートアドレスになっているパケットのヘッダです.

ルータは,送信元のプライベートアドレスを,自身のインターフェイスに付与されているグローバルアドレスに書き換えます.

こうすることで,送信元も送信先もグローバルアドレスになるためインターネットでも問題なくルーティングが可能.

 

しかし,これだけでは通信が成立しません.

それは,「行き」でした作業を「戻り」でもする必要があるからです.

つまり,「行き」とは反対の作業を「戻り」でします.

 

ネットワークアドレス変換 - Wikipedia

ja.wikipedia.org

 

また,IPアドレスを書き換えるだけでは,グローバルアドレスの節約にはならないです.

というのも,送信元アドレスを無条件に変えると,「行き」は問題ありませんが,「戻り」が困ります.なぜなら,LANにたくさんのホストがつながっていると誰にパケットを戻せばいいのかがわからないためです.

そのため,IPアドレス以外のフィールドである,トランスポート層のポートも書き換えます.

そのため厳密にはNAPT(Network Address Port Translation)になるわけです.

 

NAPTでは,インターネットに転送するパケットのIPアドレスとポート番号を必要に応じて書き換え,記憶します.書き換える前と書き換えた後の対応関係を覚えておくことで戻ってきたパケットに対してもLAN内のどのホストにパケットを転送すれば良いのかが判断できます.

 

 

それではここから実際にネットワークを組んで,Source NATを体験します.

今回のネットワーク構成図は以下の通りです.

 

f:id:bb_lotus:20220414104004j:plain

f:id:bb_lotus:20220414104000j:plain

 

では,ネットワークを組んでいきます.

 

~[復習]ネットワークを組む手順~

その1. Network Namespaceの作成

その2. ネットワークインターフェースを作成し,つなげる.

その3. 2をNetwork Namespaceで使えるようにする.

その4. お互いが通信できるようにインターフェースにIPアドレスを付与する.

その5. ネットワークインターフェースを有効にする.

その6. pingで疎通確認.

 

その1. Network Namespaceの作成

$ sudo ip netns add lan
$ sudo ip netns add router
$ sudo ip netns add wan

 

その2. ネットワークインターフェースを作成し,つなげる.

$ sudo ip link add lan-veth0 type veth peer name gw-veth0
$ sudo ip link add wan-veth0 type veth peer name gw-veth1

 

その3. 2をNetwork Namespaceで使えるようにする.

$ sudo ip link set lan-veth0 netns lan
$ sudo ip link set gw-veth0 netns router
$ sudo ip link set gw-veth1 netns router
$ sudo ip link set wan-veth0 netns wan

 

その4. お互いが通信できるようにインターフェースにIPアドレスを付与する.

・router

$ sudo ip netns exec router ip address add 192.0.2.254/24 dev gw-veth0
$ sudo ip netns exec router ip address add 203.0.113.254/24 dev gw-veth1
$ sudo ip netns exec router sysctl net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

 

・lan

$ sudo ip netns exec lan ip address add 192.0.2.1/24 dev lan-veth0
$ sudo ip netns exec lan ip route add default via 192.0.2.254

 

・wan

$ sudo ip netns exec wan ip address add 203.0.113.1/24 dev wan-veth0
$ sudo ip netns exec wan ip route add default via 203.0.113.254

 

その5. ネットワークインターフェースを有効にする.

$ sudo ip netns exec lan ip link set lan-veth0 up
$ sudo ip netns exec router ip link set gw-veth0 up
$ sudo ip netns exec router ip link set gw-veth1 up
$ sudo ip netns exec wan ip link set wan-veth0 up

 

 

続いて,Source NATの設定をしていきます.

まずは,現状でNATの設定を確認します.

LinuxでNATの設定をするには,iptablesというコマンでが使えます.

iptablesを使うと,LinuxのパケットフィルタリングやNATを設定できます.

$ sudo ip netns exec router iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

表示されている内容で,Chainの後ろにPREROUTINGやINPUTとあるのは,処理を適用するタイミングを表しています.(これをチェインと言います)

 

ここで,NATのルールを追加します.

$ sudo ip netns exec router iptables -t nat -A POSTROUTING -s 192.0.2.0/24 -o gw-veth1 -j MASQUERADE

iptablesコマンドのオプションの意味は次のとおりです.

 

-A:処理を追加するチェインを指定.指定しているPOSTROUTINGは,ルーティングが終わってパケットがインターフェイスから出ていく直前を示している.

 

-s:処理の対象となる送信元IPアドレスの範囲

 

-o:処理の対象とする出力先のネットワークインターフェイス

 

-j:条件に一致したパケットをどのように処理するかのルールを指定.iptablesでは,処理方法のルールをターゲットと呼び,指定している.MASQUERAGEは,パケットに適用するターゲットがSource NATであることを示す.

 

再度,設定を確認してみます.

$ sudo ip netns exec router iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  192.0.2.0/24         anywhere

 

それでは,その6. pingで疎通確認してみましょう.pingを打ち続けます.

$ sudo ip netns exec lan ping 203.0.113.1
PING 203.0.113.1 (203.0.113.1) 56(84) bytes of data.
64 bytes from 203.0.113.1: icmp_seq=1 ttl=63 time=0.096 ms
64 bytes from 203.0.113.1: icmp_seq=2 ttl=63 time=0.050 ms
64 bytes from 203.0.113.1: icmp_seq=3 ttl=63 time=0.131 ms
64 bytes from 203.0.113.1: icmp_seq=4 ttl=63 time=0.051 ms
・・・

 

別のターミナルでtcpdumpコマンドを実行し,lanの通信を確認してみます.

$ sudo ip netns exec lan tcpdump -tnl -i lan-veth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lan-veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 192.0.2.1 > 203.0.113.1: ICMP echo request, id 52927, seq 33, length 64
IP 203.0.113.1 > 192.0.2.1: ICMP echo reply, id 52927, seq 33, length 64
IP 192.0.2.1 > 203.0.113.1: ICMP echo request, id 52927, seq 34, length 64
IP 203.0.113.1 > 192.0.2.1: ICMP echo reply, id 52927, seq 34, length 64
・・・

 

またさらに別のターミナルでtcpdumpコマンドを実行し,wanの通信を確認してみます.

$ sudo ip netns exec wan tcpdump -tnl -i wan-veth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wan-veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 203.0.113.254 > 203.0.113.1: ICMP echo request, id 52927, seq 70, length 64
IP 203.0.113.1 > 203.0.113.254: ICMP echo reply, id 52927, seq 70, length 64
IP 203.0.113.254 > 203.0.113.1: ICMP echo request, id 52927, seq 71, length 64
・・・