iptables命令基礎
【學習筆記】
Iptables規則:
匹配條件:預設為與條件,自上而下的檢查 匹配條件更精確的放到上面
基本匹配:IP,埠,TCP的Flags
擴充套件匹配:通過複雜高階功能匹配
隱式擴充套件:tcp,udp,icmp
顯式擴充套件:必須明確指定擴充套件模組進行的擴充套件
處理動作:跳轉目標
內建處理動作:ACCEPT(一票通過) DROP(一票否決,直接丟棄) REJECT(一票否決,傳送迴應報文,然後立即斷開) SNAT DNATMASQUERADE MARK LOG ……
自定義處理動作:自定義chain,利用分類管理複雜情形
規則要新增在鏈上才能生效;新增在自定義鏈上不會自動生效
鏈chain:
內建鏈:每個內建鏈對應一個鉤子函式
自定義鏈:對內建鏈進行補充擴充套件,只有Hook鉤子函式呼叫時,才生效
Iptables命令
man 8 iptables 手冊
iptables [-t table] {-A(追加)|-C|-D} chain rule-specification iptables [-t table] -I(指定位置插入) chain [rulenum] rule-specification iptables [-t table] -R(替換指定規則) chain rulenum rule-specification iptables [-t table] -D(刪除)chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F(清空指定規則)|-L(列出規則)|-Z(歸零)} [chain [rulenum]] [options...] iptables [-t table] -N(新建鏈) chain iptables [-t table] -X(刪除自定義空鏈) [chain] iptables [-t table] -P(策略) chain target iptables [-t table] -E(0重新命名) old-chain-name new-chain-name
-L的專用選項:
-n選項:如果不加,則會將ip地址反解為主機名,將埠反解為服務名。使用-nL選項可以加速
-v -vv -vvv選項:顯示更詳細的資訊
--line-numbers :顯示規則編號
rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options]
匹配條件:
基本:通用的,PARAMETERS
擴充套件:需要載入模組,MATCH EXTENTIONS
1.、基本匹配條件:無需載入模組,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...]:源IP地址或範圍 [!] -d, --destination address[/mask][,...]:目標IP地址或範圍 [!] -p, --protocol protocol:指定協議,可使用數字如0(all) protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“參看: /etc/protocols [!] -i, --in-interface name:報文流入的介面;只能應用於資料報文流入環節,只應用於INPUT、 FORWARD、 PREROUTING鏈 [!] -o, --out-interface name:報文流出的介面;只能應用於資料報文流出的環節,只應用於FORWARD、 OUTPUT、 POSTROUTING鏈
示例:完成只開放80埠
iptables -t filter -A INPUT -s 192.168.36.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -d 192.168.36.0/24 -p tcp -m tcp --sport 22 -j ACCEPT
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --sport 80 -j ACCEPT
Iptables --> netfilter 立即生效
Iptables [-t table] [subcommand] [chain] [rulenum] [rule-specifiacation]
Subcommand
規則:-A -I -R -L -D
鏈:-N增 -X刪 -F清 -Z置零 -E重新命名 -P重置策略
rule- specification
rule spec
基本匹配:-s源地址 -d目標地址 -p四層協議型別 -i流入介面 -o流出介面
擴充套件匹配:隱式擴充套件 顯式擴充套件
target
-p tcp 專用選項
--tcp-flags mask comp:
SYN(=1,tcp三次握手的第一次或第二次) ACK(=1,確認之前傳送的報文生效) FIN(=1,連線要斷開) RST(連線重置) URG(緊急) PSH()
mask:要檢查的標誌位列數,以逗號分隔
comp:必須為1的標誌位,餘下的出現在mask列表中的標誌位則必須為0
--syn:用於匹配第一次握手,相當於: --tcp-flags SYN,ACK,FIN,RST SYN
udp [!] --source-port, --sport port[:port]:匹配報文的源埠或埠範圍 [!] --destination-port,--dport port[:port]:匹配報文的目標埠或埠範圍 icmp [!] --icmp-type {type[/code]|typename}
type/code 0/0 echo-reply |
icmp應答 |
8/0 echo-request |
icmp請求 |
1、Multiport擴充套件:以離散或連續的方式定義多埠匹配條件
--source-ports, --sports port[,port|,port:port]... 指定多個源埠
--destination-ports,--dports port[,port|,port:port]... 知道你多個目標埠
--ports port[,port|,port:port]...多個源或目標埠
2、iprange 擴充套件:以連續的ip地址範圍指明連續的多地址匹配條件
[!] --src-range from[-to] 源IP地址範圍 [!] --dst-range from[-to] 目標IP地址範圍
示例: iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --srcrange 172.16.1.5-172.16.1.10 -j DROP
3、 set擴充套件:實現不連續ip地址,使用set擴充套件,依賴於ipset命令列工具
4、String擴充套件:對報文中的應用層資料做字串匹配檢測
--algo {bm|kmp} 字串匹配檢測演算法 bm: Boyer-Moore kmp: Knuth-Pratt-Morris --from offset 開始偏移 --to offset 結束偏移 [!] --string pattern 要檢測的字串模式 [!] --hex-string pattern要檢測字串模式, 16進位制格式 示例: iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT
5、 time擴充套件 根據將報文到達的時間與指定的時間範圍進行匹配 --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期 --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --timestart hh:mm[:ss] 時間 --timestop hh:mm[:ss] [!] --monthdays day[,day...] 每個月的幾號 [!] --weekdays day[,day...] 星期幾, 1 – 7 分別表示星期一到星期日 --kerneltz:核心時區,不建議使用, CentOS7系統預設為UTC 注意: centos6 不支援kerneltz , --localtz指定本地時區(預設) 示例: iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
6、 connlimit擴充套件 根據每客戶端IP做併發連線數數量匹配 可防止CC(Challenge Collapsar挑戰黑洞)攻擊 --connlimit-upto #:連線的數量小於等於#時匹配 --connlimit-above #:連線的數量大於#時匹配 通常分別與預設的拒絕或允許策略配合使用 示例: iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
7、 limit擴充套件 基於收發報文的速率做匹配 令牌桶過濾器 --limit #[/second|/minute|/hour|/day] --limit-burst number 示例: iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit10/minute --limit-burst 5 -j ACCEPTiptables -I INPUT 2 -p icmp -j REJECT
8、 state擴充套件 根據”連線追蹤機制“去檢查連線的狀態,較耗資源 conntrack機制:追蹤本機上的請求和響應之間的關係 狀態有如下幾種: NEW:新發出請求;連線追蹤資訊庫中不存在此連線的相關資訊條目,因此,將其識別為第一次發出的請求 ESTABLISHED: NEW狀態之後,連線追蹤資訊庫中為其建立的條目失效之前期間內所進行的通訊狀態 RELATED:新發起的但與已有連線相關聯的連線,如: ftp協議中的資料連線與命令連線之間的關係 INVALID:無效的連線,如flag標記不正確 UNTRACKED:未進行追蹤的連線,如raw表中關閉追蹤 [!] --state state 示例: iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80-m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT 已經追蹤到的並記錄下來的連線資訊庫 /proc/net/nf_conntrack 調整連線追蹤功能所能夠容納的最大連線數量 /proc/sys/net/nf_conntrack_max 不同的協議的連線追蹤時長 /proc/sys/net/netfilter/
iptables的連結跟蹤表最大容量為/proc/sys/net/nf_conntrack_max,各種狀態的超 時連結會從表中刪除;當模板滿載時,後續連線可能會超時 解決方法兩個: (1) 加大nf_conntrack_max 值 vi /etc/sysctl.conf net.nf_conntrack_max = 393216 net.netfilter.nf_conntrack_max = 393216 (2) 降低 nf_conntrack timeout時間 vi /etc/sysctl.conf net.netfilter.nf_conntrack_tcp_timeout_established = 300 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 iptables -t nat -L -n 注意: CentOS7 需要載入模組: modprobe nf_conntrack