EN
EN

Sorun Giderme Aracı: FortiOS’de Bulunan Paket Takibi Özelliğini Kullanmak


Sunum

Tüm FortiGate birimlerinin kendi üzerinde güçlü paket takipçisi bulunmaktadır.  Eğer tcpdump biliyorsanız FortiGate Sniffer’ı rahatça kullanabilirsiniz.
Ek sniffer ipucuları için "Packet capture (sniffer) tips" yazısına bakınız.
Bu döküman FortiOS v2.80-MR5 ve daha yüksek sürümlere göre hazırlanmıştır.
                         DMZ
                            |
                            |
                      +-----------+
  ----internal----| FortiGate |---external-----
                      +-----------+

Sniffer Temelleri

Paket takipçisi FortiGate’de “oturur” ve belirli bir arabirimde veya tüm arabirimlerdeki trafiği takip eder.  Verbose Levels olarak da bililen 3 farklı düzeyde bilgi vardır. Verbose 1 daha az bilgi, verbose 3’de en çok bilgiyi gösterir. Verbose 4, 5 ve 6 ek olarak arabirim ayrıntılarını gösterir.

Ayrıntılı olarak Verbose düzeyleri:
1: paketlerin başlık çıktısı
2: paketlerin IP’sinden başlık ve veri çıktısı print header and data from IP of packets
3: paketlerin Ethernet’inden başlık ve veri çıktısı
4: arabirim adı ile paketlerin başlık çıktısı
5: arabirim adı ile birlikte paketlerin IP’sinden başlık ve veri çıktısı
6: arabirim adı ile birlikte paketlerin ethernet’inden başlık ve veri çıktısı

Bu yazıda farklı hata giderme imkanlarını göstermek için farklı verbose düzeyleri ve bazı örnekler verilmektedir.

Temel sniffing komutu
Tüm Packet sniffing komutları şöyle başlar:
# diag sniffer packet <interface> <’filter’> <verbose> <count>

Şöyle ki:
<interface>           bir arabirim adı veya tüm arabirimler için “any” olabilir.
<verbose>            tanımlandığı şekilde verbosity düzeyidir.
<count>                sniffer’ın durmadan önce okuduğu paket sayısıdır.
<’filter’>              daha sonra daha ayrıntılı şekilde açıklanacak olan çok güçlü bir filtre özelliğidir.

Örnek 1: Basit İz
Dahili arabirimde verbose 1 düzeyi ile tüm trafiğin Sniff 3 paketleri
# diag sniffer packet internal none 1 3
192.168.0.1.22 -> 192.168.0.30.1144: psh 2859918764 ack 1949135261
192.168.0.1.22 -> 192.168.0.30.1144: psh 2859918816 ack 1949135261
192.168.0.30.1144 -> 192.168.0.1.22: ack 2859918884
Grdüğünüz gibi bir bağlantı sırasında bazı paketler yakaladık. 192.168.0.1 IP adresi  22 (192.168.0.1.22)’yi kullandığından bir SSH oturumundan paket yakaladığımızı tahmin edebiliriz. "none" değeri ’filtre uygulaması yok’ anlamına gelir, "1" ’verbose 1’ anlamına gelir ve "3" ’3 paket yakala ve dur’ anlamına gelir.

Örnek 2: Basit İz
Dahili arabirimde verbose 1 düzeyi ile tüm trafiğin Sniff 3 paketleri
# diag sniffer packet internal none 1 3
192.168.0.30.1156 -> 192.168.0.1.80: syn 2164883624
192.168.0.1.80 -> 192.168.0.30.1156: syn 3792179542 ack 2164883625
192.168.0.30.1156 -> 192.168.0.1.80: ack 3792179543

Bir TCP oturumu henüz başlatıldığında daha ilginç bilgiler yakaladık. 192.168.0.30, Port 80 üzerinden 192.168.0.1’e syn ile bağlanmaya çalışıyor ve bir ack back alıyor. Son olarak oturum onaylanıyor ve 3-way TCP handshake’in ardından kuruluyor.

Bilgi düzeyi Verbose 1’e kurulmuşken Source and Destination IP Address (Kaynak ve Hedef IP Adresi) ve Source and Destination Port (Kaynak ve Hedef Port’u) görüyoruz. Aynı zamanda buna ilişkin dizi sayılarını da görebiliriz.

Eğer bir <count> değeri girmezseniz, Sniffer <CTRL c> ile durdurmadığınız sürece çalışır.
İpucu: Daha fazla inceleme için bir dosyanın logunu tutmak iyi bir fikirdir. Eğer Putty kullanıyorsanız (Windows için ücretsiz bir SH istemcisi) tüm çıktıyı bir dosyaya log edebilir ve bu dosyada arayabilir/ sınıflandırabilir/ işlem yapabilirsiniz.

Verbose 2 ve Verbose 3 düzeyleri:
Verbose 2 daha fazla bilgi içerir
1. Verbose 1’de gördüğümüz gibi IP Başlığı
2. IP paketinin kendi yükü

Verbose 2’nin bir çıktısı şöyle görünür:
# diag sniffer packet internal none 2 1
192.168.0.1.22 -> 192.168.0.30.1144: psh 2867817048 ack 1951061933
0x0000   4510 005c 8eb1 4000 4006 2a6b c0a8 0001        E....@.@.*k....
0x0010   c0a8 001e 0016 0478 aaef 6a58 744a d7ad       .......x..jXtJ..
0x0020   5018 0b5c 8ab9 0000 9819 880b f465 62a8      P...........eb.
0x0030   3eaf 3804 3fee 2555 8deb 24da dd0d c684      >.8.?.%U..$.....
0x0040   08a9 7907 202d 5898 a85c facb 8c0a f9e5       ..y..-X........
0x0050   bd9c b649 5318 7fc5 c415 5a59                  ...IS.....ZY

Verbose 3 Ethernet (Ether Frame) Bilgisi de barındırır. Bu format teknik desteğin problemi analiz ederken genellikle isteyeceği formattır.
Elde edilen bir verbose 3 çıktısını Ethereal tarafından okunabilen ve kodu çözülebilen bir dosyaya çevirecek olan bir script (fgt2eth.pl) mevcuttur.

Filtre Özelliği
Daha önce bahsedildiği üzere: diag sniffer’ın burada anlatılacak olan güçlü bir filtre özelliği bulunmaktadır.
FortiOS bize şunu der:
<filter>    sniffer için filtre
Syntax: ’[[src|dst] host<host_name_or_IP1>] [[src|dst] host<host_name_or_IP2>] [[arp|ip|gre|esp|udp|tcp] [port_no]] [[arp|ip|gre|esp|udp|tcp] [port_no]]’
Eğer ikinci bir host tanımlandıysa sadece 2 host arasındaki trafik görüntülenir.
<filter>    sniffer için esnek mantıksa filtreler (veya "none").
Örneğin: To print udp 1812 traffic between forti1 and either forti2 or forti3
’udp and port 1812 and host forti1 and ( forti2 or forti3 )’
Sadece bir PC’den diğer PC’ye olan trafiği takip etmek istediğinizi varsayın. Filtre olmadan sniffer çok uzak veya debug edilmesi zor olan tüm paketleri görüntüleyecektir.

Örnek 3: Filtrelerle İz
İki PC arasında neler olup bittiğini görmek için (veya bir PC ve bir FortiGate),(Filtre ifadelerinizi ’  ’ arasına koymayı unutmayınız ):
# diag sniffer packet internal ’src host 192.168.0.130 and dst host 192.168.0.1’ 1
192.168.0.130.3426 -> 192.168.0.1.80: syn 1325244087
192.168.0.1.80 -> 192.168.0.130.3426: syn 3483111189 ack 1325244088
192.168.0.130.3426 -> 192.168.0.1.80: ack 3483111190
192.168.0.130.3426 -> 192.168.0.1.80: psh 1325244088 ack 3483111190
192.168.0.1.80 -> 192.168.0.130.3426: ack 1325244686
192.168.0.130.1035 -> 192.168.0.1.53: udp 26
192.168.0.130.1035 -> 192.168.0.1.53: udp 42
192.168.0.130.1035 -> 192.168.0.1.53: udp 42
192.168.0.130 -> 192.168.0.1: icmp: echo request
192.168.0.130.3426 -> 192.168.0.1.80: psh 1325244686 ack 3483111190
192.168.0.1.80 -> 192.168.0.130.3426: ack 1325244735
192.168.0.130 -> 192.168.0.1: icmp: echo request
Kabloda çok trafik olduğunu varsayarak bu filtre komutu sadece Kaynak 192.168.0.130’dan Hedef 192.168.0.1’a trafiği (fakat tüm trafiği) gösterecektir. 192.168.0.130’a giden trafiği göstermeyecektir (örneğin ICMP yanıtı) çünkü biz dedik ki:
’src host 192.168.0.130 and dst host 192.168.0.1’
Gördüğünüz gibi bir PC’den ICMP veya DNS sorguları gibi diğer bazı şeyleri de aldık. Eğer sadece belirli bir tipte trafikle ilgileniyorsak (diyelim ki sadece TCP trafiği) filtre komutumuzu şu şekilde değiştirmeliyiz:
# diag sniffer packet internal ’src host 192.168.0.130 and dst host 192.168.0.1 and tcp’ 1
192.168.0.130.3569 -> 192.168.0.1.23: syn 1802541497
192.168.0.1.23 -> 192.168.0.130.3569: syn 4238146022 ack 1802541498
192.168.0.130.3569 -> 192.168.0.1.23: ack 4238146023
ICMP (ping)’nin de çalışmasına rağmen iz sadece TCP kısmını gösterir. Gördüğümüz gibi Hedef: 192.168.0.1.23, ki Port 23’te IP 192.168.0.1’dir. İlk kurulum sırasında 192.168.0.1’a bir Telnet oturumu bulduk.
Diğer yolla benzeri:
# diag sniffer packet internal ’host 192.168.0.130 and icmp’ 1
192.168.0.130 -> 192.168.0.1: icmp: echo request
192.168.0.1 -> 192.168.0.130: icmp: echo reply
Bu örnekte 192.168.0.130’den ve 192.168.0.130’ye sadece ICMP’yi takip ediyoruz.
Başka iyi bir özellik mantıksal kombinasyonlardır. Diyelim ki sadece ICMP ve TCP’yi takip etmek istiyorsunuz (UDP, ARP, vs.’yi değil). Aşağıdaki gibi protokolleri kombime edebilirsiniz:
# diag sniffer packet internal ’host 192.168.0.130 and (icmp or tcp)’ 1
Bu takip host 192.168.0.130’dan ve host 192.168.0.130’a tüm tcp ve imcp trafiğini verbose 1 düzeyinde görüntüleyecektir.
Şimdi takipçiyi daha da sınırlandıracağız:
2 host arasındaki trafiği takip etmek istiyoruz, fakat sadece TCP ve port 80’i.
# diag sniffer packet internal ’host 192.168.0.130 or host 192.168.0.1 and tcp port 80’ 1
192.168.0.130.3625 -> 192.168.0.1.80: syn 2057246590
192.168.0.1.80 -> 192.168.0.130.3625: syn 3291168205 ack 2057246591
192.168.0.130.3625 -> 192.168.0.1.80: ack 3291168206
192.168.0.130.3625 -> 192.168.0.1.80: psh 2057246591 ack 3291168206
192.168.0.1.80 -> 192.168.0.130.3625: ack 2057247265
Telnet ve ssh sadece iki host arasında çalışıyorsa dahi, sadece port 80 trafiğini görürüz.
Son olarak ekte sadece belli TCP flag’lerinde trafik yakalamak için snifferın nasıl kullanılacağına dair ayrıntılı olarak anlatım bulunmaktadır.
Verbose 3 çıktısını Ethereal tarafından okunabilir ve çözülebilir bir dosyaya çevirecek olan fgt2eth.pl scripti de eklidir.

Not: Bu ekli script “olduğu gibi” sağlanmaktadır. Bu dosyalar teknik destek tarafından verilmemektedir.
Not: Stephen Dennis bize explanation_on_how_to_packet_capture_for_only_certain_TCP_flags_v2.txt dosyasının güncel halini göndermiştir. Güncellenmiş dosya aşağıda bulunmaktadır: