iptables高階規則
iptables高階部分
擴充套件匹配 man iptables /MATCH EXTENSIONS
擴充套件動作 man iptables /TARGET EXTENSIONS
netfilter不只是包過濾防火牆(四層)
netfilter同樣是狀態防火牆
一、擴充套件匹配 MATCH EXTENSIONS
獲得幫助:
[[email protected] ~]# iptables -m icmp -h
[[email protected] ~]# iptables -m iprange -h
[[email protected] ~]# yum -y install vsftpd httpd
[
[[email protected] ~]# iptables -F
[[email protected] ~]# iptables -A INPUT -j REJECT
-m icmp(防止ping宕機)
[[email protected] ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
-m iprange(來自源池192.168.2.20-192.168.2.100的全部禁掉)
[[email protected] ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.2.20-192.168.2.100 -j REJECT
-m multiport(多埠)
[[email protected] ~]# iptables -m multiport -h
[[email protected] ~]# iptables -t filter -I INPUT -p tcp -m multiport --dports 20,21,22,25,80,110 -j ACCEPT
-m state
跟TCP中的狀態沒有關係
NEW 新生態
ESTABLISHED 連線態(客戶端發出請求,服務端迴應後)
RELATED 衍生態 (相關聯的,有資料埠和傳輸埠的都符合)
INVALID 無效態
[[email protected] ~]# iptables -t filter -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
NEW:表示資料包將要或已經開始建立一個新的連結,或者這個包和一個還沒有在兩端都有資料傳送的連結有關。
ESTABLISHED:資料包完全有效,而且屬於一個已建立的連結,這個連結的兩端都已經有資料傳送
RELATED:說明包正在建立一個新的連結,這個連結是和一個已建立的連結有關的
INVALID:說明這個包沒有已知的流或連結與之關聯
[[email protected] ~]# iptables -t filter -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ftp 197,68 —>256*197+68
被動模式 資料埠不固定 伺服器開隨機等客戶端連線
被動模式
tcp控制
new
es
udp資料
data
n
new–>related 狀態跟蹤把new轉為related(允許第一次握手)
establshed
modeprob也可以載入
IPTABLES_MODULES=“nf_conntrack_ftp” 6.0需要載入 7.0無需載入 修改狀態
lab1: 使用狀態防火牆,放行本機FTP服務[被動模式]
[[email protected] ~]# iptables -t filter -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[[email protected] ~]# iptables -t filter -I INPUT -p tcp --dport 20:21 -j ACCEPT
[[email protected] ~]# iptables -t filter -A INPUT -j REJECT
[[email protected] ~]# modprobe nf_conntrack_ftp
[[email protected] ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES=“nf_conntrack_ftp”
小結: 該核心模組的作用是在<連線資料埠時>,將第一次握手的資料包狀態由原來的 NEW 識別成 RELATED
-m tos //ip協議頭部type of service
[[email protected] ~]# iptables -F
[[email protected] ~]# tcpdump -i eth0 -nn port 22 -vvv //抓取遠端主機訪問本機ssh資料包,分別於輸入密碼前和後觀察TOS值
[[email protected] ~]# tcpdump -i eth0 -nn port 22 -vvv //抓取遠端從本機rsync或scp複製檔案,分別於輸入密碼前和後觀察TOS值
小結:都是使用22/tcp,但可以通過IP報文中的TOS值來區分應用
ssh: tos 0x0 0x10
scp: tos 0x0 0x8
rsync: tos 0x0 0x8
[[email protected] ~]# iptables -m tos -h
[[email protected] ~]# iptables -t filter -A INPUT -p tcp --dport 22 -m tos ! --tos 0x10 -j ACCEPT //僅拒絕客戶端ssh到本機
[[email protected] ~]# iptables -t filter -A INPUT -j REJECT
0 常規服務
2 低開銷
4 最大可靠性
8 最大吞吐量
16 最小延遲
如果只放行scp 不允許ssh 先deny tos 0x10 再發行dport 22
拒絕 --放行 —拒絕
iptables -m tcp -h
-m tcp
按TCP標記匹配
Flags are: SYN(同步位,同步請求) ACK(迴應包) FIN() RST(重置位) URG PSH ALL NONE
[[email protected] ~]# iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST SYN --dport 80 -j ACCEPT
[[email protected] ~]# iptables -t filter -A INPUT -p tcp --syn --dport 80 -j ACCEPT
–tcp-flags SYN,ACK,FIN,RST SYN 檢查四個標記位SYN,ACK,FIN,RST 但只有SYN標記位才匹配
則允許三次握手中的第一次握手,等價於 --syn
先放行estalesh 再發行sync
-m limit [要命不要臉]
[[email protected] ~]# iptables -F
實驗:從客戶端ping本機,觀察序列號
[[email protected] ~]# iptables -t filter -A INPUT -p icmp -m limit --limit 20/minute -j ACCEPT
[[email protected] ~]# iptables -t filter -A INPUT -j REJECT
進入本機INPUT鏈的ICMP,如果匹配第一條則放行,不匹配的將被第二條拒絕,預設前5個不限
16/second
16/minute
16/hour
16/day
[[email protected] ~]# iptables -t filter -A INPUT -p tcp --syn --dport 80 -m limit --limit 50/second -j ACCEPT
[[email protected] ~]# iptables -t filter -A INPUT -j REJECT
-m connlimit 限同一IP最大連線數
[[email protected] ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[[email protected] ~]# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit ! --connlimit-above 2 -j ACCEPT
//僅允許每個客戶端有兩個ssh連線
–connlimit-above 2 表示大於兩個
等價於:
[[email protected] ~]# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
//超過兩個連線拒絕
[[email protected] ~]# iptables -A INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 100 -j ACCEPT
//僅允許每個客戶端有100個requests
[[email protected] ~]# iptables -A INPUT -j REJECT
-m time(按時間控制)
[[email protected] ~]# iptables -A INPUT -m time --timestart 12:00 --timestop 13:00 -j ACCEPT
[[email protected] ~]# iptables -A INPUT -p tcp --syn --dport 22 -m time --timestart 12:00 --timestop 13:00 -j ACCEPT
[[email protected] ~]# iptables -A INPUT -j REJECT
-m comment
[[email protected] ~]# iptables -A INPUT -s 172.16.130.7 -m comment --comment “cloud class” -j REJECT
-m mark(把所有進來的資料進行打標,打標的名字叫2)
[[email protected] ~]# iptables -t filter -A INPUT -m mark --mark 2 -j REJECT
匹配標記
二、動作擴充套件 TARGET EXTENSIONS
防火牆處理資料包的四種方式(即匹配後的動作):
ACCEPT 允許資料包通過
DROP 直接丟棄資料包,不給任何迴應資訊
REJECT 拒絕資料包通過,必要時會給資料傳送端一個響應的資訊
LOG 在/var/log/messages 檔案中記錄日誌資訊,然後將資料包傳遞給下個規則
filter:
-j ACCEPT
-j DROP
-j REJECT
-j LOG
nat:
-j SNAT //轉換源地址
-j MASQUERADE (偽裝) //轉換源地址
-j DNAT //轉換目標地址及埠
-j REDIRECT //轉換目標埠(重定向)
mangle:
-j MARK 給資料包打標記
-j LOG 記錄日誌
[[email protected] ~]# grep 'kern.’ /etc/rsyslog.conf
kern. /var/log/kernel.log
[[email protected] ~]# service rsyslog restart
[[email protected] ~]# iptables -j LOG -h
[[email protected] ~]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j LOG --log-prefix "discre_ssh "
–log-prefix 是描述資訊
[[email protected] ~]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j ACCEPT
[[email protected] ~]# iptables -t filter -A INPUT -j REJECT 預設返回一個拒絕訊息
-j REJECT
當訪問一個未開啟的TCP埠時,應該返回一個帶有RST標記的資料包
當訪問一個開啟的TCP埠,但被防火牆REJECT,結果返回port xxx unreachable
[[email protected] ~]# iptables -j REJECT -h
[[email protected] ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT --reject-with tcp-reset //返回一個自定義訊息型別
-j MARK
[[email protected] ~]# iptables -t mangle -L
[[email protected] ~]# iptables -j MARK -h
[[email protected] ~]# iptables -t mangle -A PREROUTING -s 192.168.2.110 -j MARK --set-mark 1
[[email protected] ~]# iptables -t mangle -A PREROUTING -s 192.168.2.25 -j MARK --set-mark 2
[[email protected] ~]# iptables -t filter -A INPUT -m mark --mark 1 -j ACCEPT //按照標記匹配
[[email protected] ~]# iptables -t filter -A INPUT -m mark --mark 2 -j REJECT
NAT表:
POSTROUTING: SNAT, MASQUERADE
PRETROUTING: DNAT, REDIRECT
OUTPUT: DNAT,針對本機
-j REDIRECT //本地埠轉發
[[email protected]_server ~]# iptables -t nat -A PREROUTING -s 172.16.130.0/24 -p tcp --dport 8888 -j REDIRECT --to-ports 22