netfiler:Framework, TCP/IP
iptables [-t TABLE] COMMAND CHAIN [num] 匹配條件 -j 處理動作
匹配條件
通用匹配
-s 匹配源地址
-d 匹配目標地址
-p 匹配協議的{tcp|udp|icmp}
-i 指定數據報文流入接口
-o 指定書庫報文流出接口
擴展匹配
隱含擴展
-p tcp
--sport PORT [-PORT]: 源端口
--dport PORT [-PORT]: 目標端口
--tcp-flags mask comp:只檢查mask指定的標誌位,是逗號分隔的標誌位列表;
comp:此列表中出現的標記爲必須爲1,comp中沒出現,而mask中出現,必須爲0;
--tcp-flags SYN,FIN,ACK,RST SYN = --syn
--syn:專門匹配tcp三次握手的第一次
-p icmp
--icmp-type
0:echo-reply 響應報文
8:echo-request 請求報文
-p udp
--sport
--dport
顯示擴展:使用額外的匹配機制
-m EXTESTION --spe-opt
state:狀態擴展
結合ip_conntrack追蹤會話的狀態
NEW:新連接請求
ESTABLISHED:已建立的連接
INBALID:非法連接
RELATED:相關聯的
-m state --state NWE,ESTABLISHED -j ACCEPT
multiport:離散的多端口擴展
--source-ports
--destination-ports
--ports
-m multiport --destination-ports 21,22,80 -j ACCEPT 合併端口
條件取反:!, -s ! 172.16.100.6 除了此IP以外都可以作爲原地址
-m iprange IP的範圍
--src-range
--dst-range
-s ,-d: 172.168.100.6 , 172.168.0.0/16 , 172.16.100.3-172.16.100.100
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-m connlimit 連接數限定
! --connlimit-above n 加!表示低於n個,
-m limit
--limit RATE 每分鐘允許多少次連接請求
--limit-burst 7 首先一次性允許連接7個
-m string
--algo {bm|kmp} 指定字符串的匹配算法 2選1
--string "STRING" 匹配的字符串
每分鐘只接受5次ping請求,首先一次性響應6個請求:
iptables -A INPUT -d 172.16.100.6 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.6 -p icmp --icmp-type 0 -j ACCEPT
例如,每個用戶最多隻允許有2個連接數到本機
iptables -A INPUT -d 172.16.100.6 -p tcp --sport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
拒絕用戶訪問172.16.100.7上html裏帶hello的網頁,需要放到80端口規則的前面
-------------------------------
iptables -I OUTPUT -s 172.16.100.7 -m string --algo kmp --string "hello" -j REJECT
-------------------------------
命令:
管理規則
-A:附加一條規則,在鏈的尾部追加一條規則
-I:CHAIN [num]:插入一條規則,插入爲對應CHAIN上的第num條
-D:CHAIN [num]:刪除指定鏈中第num條規則
-R:CHAIN [num]:替換指定的規則
管理鏈
-F [CHAIN]:flush,清空指定規則鏈,如果省略CHAIN則表示清空對應表中的所有鏈。
-P CHAIN: 設定指定鏈的默認策略:
-N:自定義一條新的空鏈
-X:刪除一個自定義的空鏈
-Z:置零指定鏈中所有規則的計數器
-E:重命名一條自定義的鏈
查看類:
-L:顯示指定表中的所有規則;
-n:以數字格式顯示主機地址和端口號
-V:顯示詳細信息
-VV
-X:顯示精確值
--line-numbers:顯示規則號碼
動作 -j(target)
ACCEPT 允許通過
DROP 丟棄
REJECT 拒絕
DNAT 目標地址轉換
SNAT 源地址轉換
REDIRECT 端口重定向
MASQUERADE地址僞裝
LOG 日誌,規則需要放到相應的前面
--log-level 日誌級別
--log-prefix 指定日誌前綴
--log-tcp-sequence 記錄TCP序列號
--log-tcp-options 記錄TCP報文選項
--log-ip-options 記錄IP報文選項
--log-uid 記錄用戶uid
例如,記錄ICMP日誌
iptables -I INPUT 4 -d 172.16.100.6 -p icmp --icmp-type 8 -j LOG --log-prefix "--firewall log for icmp--"
MARK 給一個報文設定標記
iptables -t filter -A INPUT -s 192.168.1.0/24 -j DROP
允許172.16.0.0網段的用戶訪問172.16.100.7,的sshd:22/tcp
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
iptables 不是服務,而是服務腳本;服務腳本的主要作用,在於生效保存的規則
lsmod命了可以檢查iptables的模塊是都裝載
開啓或者停止iptables服務 其實是裝載或移除iptables/netfilter相關內核模塊
iptanles_nat , iptables_filter, iptables_mangle, iptables_raw, iptables_nat
ip_conntrack
yum install mysql-server vsftpd httpd -y
iptables -P INPUT DROP 修改默認鏈爲丟棄
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -L -n 查看修改後的鏈
允許所有主機訪問本機的web服務
iptables -I INPUT -d 192.168.1.51 -p tcp --dport 80 -j ACCEPT
iptables -I OUTPUT -s 192.168.1.51 -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i l0 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
允許自己ping任意主機
iptables -A OUTPUT -s 192.168.1.51 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.1.51 -p icmp --icmp-type 0 -j ACCEPT
DNS服務器:放行別人到服務器來請求
iptables -A INPUT -d 192.168.1.51 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.1.51 -p udp --sport 53 -j ACCEPT
iptables -A INPUT -s 192.168.1.51 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.51 -p udp --dport 53 -j ACCEPT
/proc/net/ip_conntrack 記錄連接信息,追蹤連接,此功能可以使服務器根據追蹤信息 只允許響應回覆出站,從而有效的避免反彈性的病毒。
iptstate
-t 顯示當前所有連接的個數
modprobe ip_conntrack 裝載模塊
modprobe -r ipcontrack移除模塊
[root@localhost ~]# lsmod |grep ip 查看已裝載的模塊
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_conntrack_max 查看ip_conntrack記載的最大條目數
注意:特別繁忙的服務器不要裝載ip_conntrack模塊。否則會出現問題
iptables -t nat -L 查看nat表,也會自動加載此模塊
重啓iptables 會清空表裏的規則
[root@localhost ~]# cat /etc/sysconfig/iptables
service iptables save 保存規則到此文件,後重啓服務規則不會丟失
iptables-save > /etc/sysconfig/iptables.2013041801 可以使用輸出重定向來指明保存到什麼位置
iptables-restore < /etc/sysconfig/iptables.2013041801 使用輸入重定向來指明從什麼位置讀取信息
-------------------------------
server:172.16.100.7
放行sshd,httpd服務
iptables -I OUTPUT -s 172.16.100.7 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 172.16.100.7 -P tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
-------------------------------
修改ip_conntrack最大連接數
sysctl -w net.ipv4.ip_conntrack_max=65536
要永久有效需要修改/etc/sysctl.conf
/proc/sys/net/ipv4/netfilter 此目錄裏的文件定義了一些超時時間
iptables -L -n --line-numbers -v 查看一寫的規則
-------------------------------------------
FTP:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
需要安裝ip_conntrack_ftp和ip_nat_ftp模塊
[root@localhost ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"
iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
----------------------
[root@localhost ~]# vim /etc/sysconfig/iptables 可以直接編輯配置文件寫入防火牆規則
由於匹配規則是從第一條開始匹配,直到匹配到就爲止,所有可以把相同的規則,統一後寫到最前面從而提高性能。
把端口相同的合併:
列如:
iptables -I INPUT 2 -d 172.16.100.7 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
iptables -R 修改
列如:
修改第6條 爲 -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,REDIRECT -j ACCEPT
iptanles -R INPUT 6 -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,REDIRECT -j ACCEPT
iptables -D 刪除
iptables之nat及其過濾功能
自定義規則鏈
iptables -N clean_in
[root@localhost ~]# iptables -L -n 查看最後一條會顯示自定義的規則鏈
Chain clean_in (0 references)
target prot opt source destination
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptalbes -A chean_in -d 172.16.100.7 -j RETURN 如果自定義鏈沒匹配到則跳回原鏈
iptables -I INPUT -j clean_in 首先檢查自定義鏈
刪除自定義鏈 需要先刪除規則,然後iptables -X刪除
利用iptables的recent模塊來抵禦DOS***
ssh:遠程連接
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --stste NEW -m recent --update --seconds 300 --hitcount 3 -name SSH -j DROP
1.利用connlimit模塊將單IP的併發設置爲3:會誤殺使用NAT上網的用戶,可以根據實際情況增大該值:
2.利用recent和state模塊限制單IP在300s內只能與本機建立3個連接,被限制五分鐘後即可恢復訪問
說明:
1.第二句是記錄訪問tcp 22端口的新連接,記錄名稱爲SSH
--set 記錄數據包的來源IP,如果IP已經存在將更新已經存在的條目
2.第三句是指SSH記錄中的IP,300s內發起超過3次連接則拒絕此IP的連接
-update 是指每次建立連接都更新列表:
-seconds 必須與-rcheck或者--update同時使用
--hitcount必須與-rcheck或者--update同時使用
3.iptables 的記錄:/proc/net/ipt_recent/SSH
也可以使用下面的這句記錄日誌:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
NAT:network address tranlation
DNAT
SNAT:源地址轉換
echo 1 > /proc/sys/net/ipv4/ip_forward
vim /etc/sysctl.conf
sysctl -p
主機A通過 B 與主機C通信。報文經過主機B後,在主機B的出口(POSTROUTING)時源地址僞裝成主機B的地址,C收到信息以後,回覆給主機B,
然後主機B通過NAT池將此時的目標地址轉換成主機A
-j SNAT
--to-soure 明確指定修改後的源地址
-j MASQUERADE 一般公網地址爲自動獲取時使用,相當於-j SNAT 自動選擇源地址
-j DNAT 指定修改後的目標地址。必須跟指明協議端口
--to-destination IP [:port]
iptables -t NAT -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-soure 172.16.100.7
iptables -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 state --state NEW -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p icmp -m state --state NEW -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
-----------
iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.2
iptables -t nat -R PREROUTING 1 -d 172.16.100.7 -p tcp -dport 80 -j DNAT --to-destination 192.168.10.22:8080