tcpdumpでdscpを見たい
L3DSRを使ってる会社にいるもので。 L2DSR → L3DSR の変更作業をしたときに使った。L3DSR パケットがLBから来てるか動作確認に便利。
tcpdump -v -i eth0 "tcp[tcpflags] & (tcp-syn) != 0" and ip[1]!=0
解説
-v # これつけないとtosが見えない
-i eth0 # LBからはprivate IP宛に来るので、そのinterfaceを指定
"tcp[tcpflags] & (tcp-syn) != 0" # いったんSYNパケットだけに絞り込んでいる
ip[1]!=0 # これがtosがあるもの限定にしているところ。下の画像を参照
ip[1] の意味
特定のDSCP(TOS)だけにフィルタする
tcpdump -v -i eth0 and "(ip and (ip[1] & 0xfc) >> 2 == 0x05)"
こんな感じで 0x05 の DSCPがあるものだけ見たかったんだけど、これでひっかかるパケットは全部 tos 0x14
になってて、ふむぅとなった。でも0x05のところを違うのにすると引っかからないので取れてると思うんだけど。bit計算苦手すぎて何もわからない
→ 小林というスーパーエンジニアに教えてもらいました! quitaにしてよかった!
ToS field 8bitのうち先頭6bitを使うのがDSCPなので、
DSCP: 00101 = Decimal 5 = Hex 0x05
ToS: 0010100 = Decimal 20 = Hex 0x14
それだ!!!! DSCPとToSは違うんだった! だからビットシフト >>
してるtcpdumpが出てくるのか。
ありがとうございました!!!
以下はメモ
NIC > tcpdump > iptables なので、L3DSRで使う DSCP は tcpdumpで見れる。LBからくるパケットにDSCPが立っている。
packet flow
- client が LB に SYN を投げる
- LB が DSCP=0xN にして server private IP へ。この時点でsrcがclientになっている
- serverの中
4.NIC:eth0
が受け取る
5. tcpdump にわたす
6. iptables にわたす
7. DSCPを見て、DADDRを書き換え
8. このときDSCPは書き換えてないみたい、たぶん
9. DADDRが eth1 宛なので、違う NIC にforwardする(ここの動きがよくわかってない) *1
10. iptablesを出る
11.NIC:eth1
(これがDADDRのVIPを持ってる) が受け取る
12. iptablesに入る
13. 特に設定ないのでスルー
14. iptableを出る
15. processにわたす
*1 このNIC間転送の動きはよくわかってないけどたぶんこういうことなんじゃないだろうか。想像。