介紹Linux系統下的conntrack命令:允許您檢查和修改跟蹤的連接
以下介紹Linux操作系統下的conntrack命令,conntrack允許您檢查和修改跟蹤的連接,將檢查連接跟蹤表和存儲在跟蹤流中的NAT信息。本文的內容有:Conntrack狀態表、Conntrack狀態表和NAT、Conntrack擴展、插入和更改條目、刪除條目、Conntrack錯誤計數器。
介紹 通過iptables或nftables配置的NAT建立在netfilters連接跟蹤工具之上。conntrack命令用於檢查和更改狀態表,它是“conntrack-tools”軟件包的一部分。 參考:Linux系統管理員要知道的16個iptables使用技巧。
Conntrack狀態表 連接跟蹤子系統跟蹤已看到的所有數據包流,運行“sudo conntrack -L”以查看其內容: tcp 6 43184 ESTABLISHED src=192.168.2.5 dst=10.25.39.80 sport=5646 dport=443 src=10.25.39.80 dst=192.168.2.5 sport=443 dport=5646 [ASSURED] mark=0 use=1 tcp 6 26 SYN_SENT src=192.168.2.5 dst=192.168.2.10 sport=35684 dport=443 [UNREPLIED] src=192.168.2.10 dst=192.168.2.5 sport=443 dport=35684 mark=0 use=1 udp 17 29 src=192.168.8.1 dst=239.255.255.250 sport=48169 dport=1900 [UNREPLIED] src=239.255.255.250 dst=192.168.8.1 sport=1900 dport=48169 mark=0 use=1 每行顯示一個連接跟蹤條目。您可能會注意到,每行兩次顯示地址和端口號,甚至是反向的地址和端口對。這是因為每個條目兩次插入到狀態表中。第一個地址四元組(源地址和目標地址以及端口)是在原始方向上記錄的地址,即發起方發送的地址。第二個四元組是conntrack希望在收到來自對等方的答復時看到的內容。這解決了兩個問題: 如果NAT規則匹配(例如IP地址偽裝),則將其記錄在連接跟蹤條目的答復部分中,然后可以自動將其應用於屬於同一流的所有將來的數據包。 狀態表中的查找將是成功的,即使它是對應用了任何形式的網絡或端口地址轉換的流的答復包。 原始的(第一個顯示的)四元組永遠不會改變:它是發起方發送的。NAT操作只會將回復(第二個)更改為四倍,因為這將是接收者看到的內容。對第一個四倍的更改將毫無意義:netfilter無法控制啟動程序的狀態,它只能影響數據包的接收/轉發。當數據包未映射到現有條目時,conntrack可以為其添加新的狀態條目。對於UDP,此操作會自動發生。對於TCP,conntrack可以配置為僅在TCP數據包設置了SYN位的情況下添加新條目。默認情況下,conntrack允許中流拾取不會對conntrack變為活動狀態之前存在的流造成問題。
Conntrack狀態表和NAT 如上一節所述,列出的答復元組包含NAT信息。可以過濾輸出以僅顯示應用了源或目標nat的條目。這樣可以查看在給定流中哪種類型的NAT轉換處於活動狀態。“sudo conntrack -L -p tcp –src-nat”可能顯示以下內容: tcp 6 114 TIME_WAIT src=10.0.0.10 dst=10.8.2.12 sport=5536 dport=80 src=10.8.2.12 dst=192.168.1.2 sport=80 dport=5536 [ASSURED] 此項顯示從10.0.0.10:5536到10.8.2.12:80的連接。但是,與前面的示例不同,答復方向不僅是原始的反向方向:源地址已更改。目標主機(10.8.2.12)將答復數據包發送到192.168.1.2,而不是10.0.0.10。每當10.0.0.10發送另一個數據包時,具有此條目的路由器將源地址替換為192.168.1.2。當10.8.2.12發送答復時,它將目的地更改回10.0.0.10。此源NAT是由於nft假裝規則所致: inet nat postrouting meta oifname "veth0" masquerade 其他類型的NAT規則,例如“dnat to”或“redirect to”,將以類似的方式顯示,其回復元組的目的地不同於原始的。
Conntrack擴展 conntrack記帳和時間戳記是兩個有用的擴展。“sudo sysctl net.netfilter.nf_conntrack_acct=1”使每個流的“sudo conntrack -L”跟蹤字節和數據包計數器。 “sudo sysctl net.netfilter.nf_conntrack_timestamp=1”記錄每個連接的“開始時間戳”。然后,“sudo conntrack -L”顯示自第一次看到流以來經過的秒數。添加“–output ktimestamp”也可以查看絕對開始日期。
插入和更改條目 您可以將條目添加到狀態表。例如: sudo conntrack -I -s 192.168.7.10 -d 10.1.1.1 --protonum 17 --timeout 120 --sport 12345 --dport 80 conntrackd將此用於狀態復制。活動防火牆的條目將復制到備用系統。這樣,備用系統就可以接管而不會中斷連接,即使建立的流量也是如此。Conntrack還可以存儲與網上發送的數據包數據無關的元數據,例如conntrack標記和連接跟蹤標簽。使用“update”(-U)選項更改它們: sudo conntrack -U -m 42 -p tcp 這會將所有tcp流的connmark更改為42。
刪除條目 在某些情況下,您想從狀態表中刪除條目。例如,對NAT規則的更改不會影響屬於表中流的數據包。對於壽命長的UDP會話(例如像VXLAN這樣的隧道協議),刪除條目可能很有意義,這樣新的NAT轉換才能生效。通過“sudo conntrack -D”刪除條目,然后刪除地址和端口信息的可選列表。下面的示例從表中刪除給定的條目: sudo conntrack -D -p udp --src 10.0.12.4 --dst 10.0.0.1 --sport 1234 --dport 53
Conntrack錯誤計數器 Conntrack還可以導出統計信息: # sudo conntrack -S cpu=0 found=0 invalid=130 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=10 cpu=1 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=0 cpu=2 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=1 cpu=3 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=0 大多數計數器將為0。“Found”和“insert”將始終為0,僅出於向后兼容的目的而存在。造成的其他錯誤包括: invalid:數據包與現有連接不匹配,並且未創建新連接。 insert_failed:數據包開始新的連接,但是插入狀態表失敗。例如,當偽裝時NAT引擎恰巧選擇了相同的源地址和端口時,可能會發生這種情況。 drop:數據包啟動一個新的連接,但是沒有可用的內存為其分配新的狀態條目。 early_drop:conntrack表已滿。為了接受新連接,丟棄了沒有雙向通信的現有連接。 error:icmp(v6)收到與已知連接不匹配的icmp錯誤數據包 search_restart:查找由於另一個CPU的插入或刪除而中斷。 clash_resolve:幾個CPU嘗試插入相同的conntrack條目。 除非它們經常發生,否則這些錯誤條件是無害的。可以通過針對預期工作負載調整conntrack系統來減輕某些負擔。net.netfilter.nf_conntrack_buckets和net.netfilter.nf_conntrack_max是典型的候選者。 當數據包無效時,請使用“sudo sysctl net.netfilter.nf_conntrack_log_invalid=255”來獲取更多信息。例如,當conntrack遇到清除了所有tcp標志的數據包時,記錄以下內容: nf_ct_proto_6: invalid tcp flag combination SRC=10.0.2.1 DST=10.0.96.7 LEN=1040 TOS=0x00 PREC=0x00 TTL=255 ID=0 PROTO=TCP SPT=5723 DPT=443 SEQ=1 ACK=0
概括 以上介紹了如何檢查連接跟蹤表和存儲在跟蹤流中的NAT信息。
相關主題 |
- 在Deepin 20.2.2中提示bash: winecfg:未找到命令的說明
- 將Linux系統命令輸出重定向到文件的三種方法
- 在Linux系統上使用tee命令的基本語法和7個用法示例
- Ubuntu/Debian/CentOS下安裝ifconfig和使用ifconfig命令的方法
- 在Fedora Linux上安裝cpulimit及使用cpulimit命令的方法
- 在Linux系統下的ss命令(socket statistics)各種使用示例
- 在Deepin中執行終端命令提示“倉庫xxx的簽名不再生效”的原因
- 在Linux系統中用grep命令排除單詞和模式、及排除目錄和文件
- 在Deepin 20下編譯Linux內核提示bash:make:未找到命令的解決
- git clone命令漏洞CVE-2021-213介紹,附降低風險的方案
- 監視Linux磁盤IO性能命令:iotop,iostat,vmstat,atop,dstat,ioping
- 修改Deepin系統命令行(終端)的背景色和文件目錄顏色的方法
- Linux用戶最愛使用的搜索引擎是百度,其次是Google
- 介紹Ubuntu 20.04服務器中的Netplan及配置靜態IP地址
- 適用於Linux系統的七款PDF內容編輯器,附下載和安裝方法
- 網友對中國主流廠商不開發Linux版本軟件各有主見,附評論內容
- deepin-wine5應用升級方法,以手動升級deepin-wine5微信為例
- 在優麒麟、Ubuntu 20.04系統下安裝和使用Crossover的方法
- 優麒麟的網易、哈工大、蘭大、華農大、開源社鏡像站地址
- 在Ubuntu 20.04/18.04下安裝PHP 8.0和PHP 8擴展
- Linux下使用有線網絡和WiFi能不能疊加網速?網友評論不一
- 快速在Ubuntu 20.04上安裝LAMP Stack(Apache+MySQL+PHP)
- 在Ubuntu 20.04系統上安裝Deepin桌面環境(DDE)的方法
- 在Ubuntu 20.04系統中安裝TeamViewer_amd64.deb的方法