自分用: インフラとネットワークのメモ


はじめに

ネットワークは前にやったきりで時間も経ってるため、だいぶ忘れてしまいました.
久しぶりにネットワークの復習と追加学習をしました.
その内容をここにメモします.
間違ってたりアドバイスあったら優しく教えてくれると助かります〜

TCP

L3までのおかげでパケットを相手に送信する事ができるようになったが、実際に届いたかどうかはわからない.
なので、相手はパケットが届いたら届いたよ!と、教えたりするルールを設けたのがTCP.(詳しくは省く

パケットを送る時はPORT番号を指定する必要がある.
TCPの場合、相手からのパケットも受け取る必要があるので、依頼元も今回の通信で使うPORT番号を指定する.
送信元PORT番号は[動的・プライベート ポート番号 (49152–65535)]から選ばれる.
つまり、このout用のport番号を超えた65535-49152=16383を超える同時な外部へのTCPでの接続は工夫しないと、基本的にできない.
UDPの場合も送信元PORTが必要.

ARP

ARPはL3のプロトコルで、ARP Requestをブロードキャストすることにより、ARP Requestに含まれている ARP Replyを頂ける.
ARP ReplyにリクエストされたMACアドレスが含まれた状態で届く.
これを利用することにより、ARP tableに宛先mac addressがない場合でもパケットを届けられるようになる.

ARPのusecaseその4ぐらい

手動でnic設定したstatic ip addressで一度も外部通信していない場合、bridgeやRouterのARP tableにmac addressが記録されていない.
その様な状態の時に、Routerは受け取った宛先 IPのMac AddressをARPを使って調べる.

firewall

firewallでよく80番ポートだけ開放するとかやります.
その場合、80番ポート以外のポートが記載されたパケットを全てロスする設定になっていると、動的ポート番号のパケットまで捨てられてしまいます.
そうした場合、TCPを利用したやりとりができなくなってしまいます.
なので、当たり前ですが、基本的にinとout用でセキュリティで考慮することや設定は変わります.
ちなみにUDPの場合は、response用のポートを動的ポート番号で確保する必要ないので、UDPリクエストしかしないと保証されているようなクライアントがいた場合、全てのportを閉じてもデータを外部に送れます.

NIC

eh0はnic0枚目、eth1はnic1枚目って事
ethN == nicって認識で基本大丈夫
物理レイヤーにパケットを送る場合はethに送信パケットを投げて、ethがそれをethのpeerに対して送る. (nicは基本イーサネットケーブル等を通じて、bridgeやrouter等、対となるnicと繋がっている.その対のことをpeerと呼ぶ.

Router作成の概念

http://redhatlinux.kt.fc2.com/cont/router.htm
このサイトが詳しい.
route -nの見方がわからない場合、このサイトを見るといい.
https://xtech.nikkei.com/it/article/COLUMN/20080520/303086/
http://linux.kororo.jp/cont/intro/dgate.php

コンバージェンスとか一旦置いといた、一番シンプルなRouterはNICから受け取ったパケットを別のNICに飛ばす技術であるip forwardだけで実現が可能.
linuxでip forwardを有効化するには、/etc/sysctl.confnet.ipv4.ip_forward=1を追記し、ネットワークを再起動すると、ip forwardの機能が有効化される.

ifconfig vs ip command

ifconfigはnet-toolsパッケージに含まれているコマンド.
その他にもよく使うroute, netstat, arpなどもnet-toolsパッケージに入っているコマンド.
net-toolsパッケージは現在非推奨になっている.

仮想bridgeの作り方

bridgeは以下のいずれからでも作成できる

  • bridge-utils
  • iproute2
  • netctl
  • systemd-networkd
  • NetworkManager

bridgeにはeth0等の実デバイスとveth等の仮想デバイスを接続することができます

仮想networkの作り方

仮想nicを作りまくって、仮想bridgeに繋げば、仮想プライベートネットワークは作れる.

しかし、このままだとプライベートネットワークがインターネットとやりとりできない.
直接eth0と繋ぐと、今度はeth0が専有されて、プライベートネットワークに所属していない奴らがインターネットに接続できなくなる.
なので、iptablesを使い、ipマスカレードする事によって、できる.
なので、docker等のbridgeのipマスカレードの設定を消すと、完全にネットワークから切り離せる.

ipマスカレード(NAPT

iptablesを使う事により、ipマスカレードを使える.
ipマスカレードを使うと、NAPTの機能はもちろん、port forwardや、securityとかも行える.

port forward

https://qiita.com/Ayaka14/items/449e2236af4b8c2beb81
こんな感じ
iptablesでもできる
特定のportに届いたパケットを特定のip addressのportに転送できる.
L2のproxyとして使える.
また、ネットワークセグメント同士を繋ぐのにも使える.
ネットワークセグメント同士を繋げば、VXLANが構築できる.

VXLAN

https://tech.uzabase.com/entry/2017/08/23/175813
このサイトが詳しい.

冗長化

基本的に対障害の為、単一のマイクロサービスを複数ホストに配置したいので、1マイクロサービスは複数ネットワークセグメント上に展開する.

VXLANの感想

結局はroutingの設定って感じがした.
routingの特定項目の設定とかにport forwardとか色んな特別な名前をつけてる感じ.

VRRP

アプリケーションをスケールアウトさせるとき、ロードバランサを前段に立てて、そいつに後に振り分けてもらう.
しかし、ロードバランサが1つしかないとそこが単一障害点になる.
なので、ロードバランサを冗長化させるために、VRRPを実装したkeepalived等を使う.
これを使うと、複数のホストに同一の仮想IPと仮想MACアドレス(仮想IPから導出される)を与えられて、プライオリティの高いホストから3秒間連絡なかったら、次にプライオリティが高い待機していたホストがそのIPとMACの保持者になり、リクエストをさばく.
VRRPプロトコルの詳しい仕組みについては、この記事か、適当にググると沢山でてくる.

MySQLのMaster Slave構成の場合のメモ

Master Slave構成の場合、Queryの内容を見て、master or slaveへロードバランシングするProxyはHAProxyがメジャーぽい.
または、クライアントロードバランシングで、updateを含む一連のQueryを発行する場合は、Masterに発行し、Readだけの場合はSlaveにQueryを渡すようにしている構成も見る.
その場合、Slaveのロードバランシングの手法は色々見受けられるが、NGINXのTCP Loadbalancer + keepaliveでのLoadbalancerの冗長化構成が良さそう. (Nginxの設定ファイル以外はWeb Serverのクラスターのロードバランサーと同じ様な設定にできるし、シンプルに済みそう.

参考文献