Framework:iptables/netfilterhtml
Netfilter組件:擴展各類網絡服務的結構化底層框架,集成在linux內核中linux
內核中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個hook function向用戶開放,用戶能夠經過一個命令工具(iptables或firewall-cmd、frewall-config)向其寫入規則算法
由信息過濾表(table)組成,包含控制IP包處理的規則集(rules),規則被分組放在鏈(chain)上vim
四表:tablecentos
五鏈:chain安全
PREROUTING網絡
POSTROUTING併發
表和鏈對應關係:框架
優先級由高到低的順序爲:raw --> mangle --> nat --> filterssh
規則 rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動做做出處理
匹配條件:默認爲與條件,同時知足
處理動做:target
規則要添加在鏈上,才生效;添加在自定義上不會自動生效
鏈:chain
用來編寫規則,寫好的規則被送往netfilter,告訴內核如何去處理信息包
用法:iptables [-t table] COMMAND chain 匹配條件 -j 處理動做
2.1) 管理規則
2.2)查看規則
2.3)管理鏈
匹配條件分爲通用匹配和擴展匹配,擴展匹配又分爲隱含擴展和顯式擴展
4.1)通用匹配:無需加載模塊,由iptables/netfilter自行提供
[root@centos7 ~]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT [root@centos7 ~]# iptables -A INPUT -j DROP
[root@centos7 ~]# iptables -A OUTPUT -d 192.168.0.0/24 -j ACCEPT [root@centos7 ~]# iptables -A OUTPUT -j DROP
/etc/protocols
[root@centos7 ~]# iptables -A INPUT -p tcp -j ACCEPT
[root@centos7 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@centos7 ~]# iptables -A OUTPUT -o lo -j ACCEPT
4.2) 擴展匹配條件:須要加載擴展模塊/usr/lib64/xtables/*.so
,查看幫助man iptables-extensions
4.2.1)隱式擴展:在使用-p選項指明瞭特定的協議時,無需再用-m選項指明擴展模塊的擴展機制,不須要手動加載擴展模塊
tcp協議的擴展選項:
[root@centos7 ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT [root@centos7 ~]# iptables -A OUTPUT -j DROP
[root@centos7 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT [root@centos7 ~]# iptables -A INPUT -j DROP
[root@centos7 ~]# iptables -I INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT
--tcp-flags SYN,ACK,FIN,RST SYN
[root@centos7 ~]# iptables -I INPUT -p tcp --syn -j ACCEPT
udp協議的擴展選項:
[!] --source-port, --sport port[:port]:匹配報文的源端口;能夠是端口範圍
[!] --destination-port,--dport port[:port]:匹配報文的目標端口;能夠是端口範圍
icmp協議的擴展選項:
[root@centos7 ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP #不接受ping請求 [root@centos7 ~]# iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
4.2.2)顯式擴展:必須使用 -m 選項指明要調用的擴展模塊的擴展機制,要手動加載擴展模塊
使用幫助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
multiport:以離散方式定義多端口匹配,最多指定15個端口
[root@centos7 ~]# iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iprange:指明連續的(但通常不是整個網絡)ip地址範圍
[root@centos7 ~]# iptables -A INPUT -m iprange --src-range 192.168.0.100-192.168.0.200 -j REJECT
mac:指明源MAC地址,適用於:PREROUTING,FORWARD,INPUT
string:對報文中的應用層數據作字符串模式匹配檢測
[root@centos7 ~]# echo "www.baidu.com" > /var/www/html/f1.txt [root@centos7 ~]# echo "www.google.com" > /var/www/html/f2.txt [root@centos7 ~]# systemctl start httpd [root@centos6 ~]# curl 192.168.0.7/f1.txt www.baidu.com [root@centos6 ~]# curl 192.168.0.7/f2.txt #加規則以前正常訪問 www.google.com [root@centos7 ~]# iptables -A OUTPUT -m string --algo bm --string google -j REJECT #在OUTPUT鏈上加字符串匹配規則 [root@centos6 ~]# curl 192.168.0.7/f1.txt #baidu正常訪問 www.baidu.com [root@centos6 ~]# curl 192.168.0.7/f2.txt #google沒法訪問
time:根據將報文到達的時間與指定的時間範圍進行匹配
[root@centos7 ~]# iptables -A INPUT -d 192.168.0.7 -p tcp --dport 80 -m time --timestart 1:00 --timestop 4:00 --weekdays 1,3,5 --kerneltz -j DROP
connlimit:根據每客戶端IP作併發鏈接數數量匹配,一般分別與默認的拒絕或容許策略配合使用
[root@centos7 ~]# iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
limit:基於收發報文的速率作匹配,令牌桶過濾器
[root@centos7 ~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT [root@centos7 ~]# iptables -A INPUT -p icmp -j REJECT
state:根據」鏈接追蹤機制「去檢查鏈接的狀態
conntrack機制:追蹤本機上的請求和響應之間的關係;
modprobe nf_conntrack
狀態有以下幾種:
- NEW:新發出請求;鏈接追蹤信息庫中不存在此鏈接的相關信息條目,所以,將其識別爲第一次發出的請求
- ESTABLISHED:NEW狀態以後,鏈接追蹤信息庫中爲其創建的條目失效以前期間內所進行的通訊狀態
- RELATED:新發起的但與已有鏈接相關聯的鏈接,如:ftp協議中的數據鏈接與命令鏈接之間的關係
- INVALID:無效的鏈接,如flag標記不正確
- UNTRACKED:未進行追蹤的鏈接,如raw表中關閉追蹤
[root@centos7 ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT [root@centos7 ~]# iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m state --state NEW -j ACCEPT[root@centos7 ~]# iptables -A INPUT -j DROP
已經追蹤到的並記錄下來的鏈接信息庫/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
5.1)簡單:
5.2)擴展:
LOG:非中斷target,自己不拒絕和容許,放在拒絕和容許規則前並將日誌記錄在/var/log/messages系統日誌中
[root@centos7 ~]# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "new ssh connections" [root@centos7 ~]# tail -f /var/log/messages
保存規則:iptables-save > /PATH/TO/SOME_RULES_FILE
載入規則:iptables-restore < /PATH/FROM/SOME_RULES_FILE
1)裝載ftp鏈接追蹤的專用模塊:
[root@centos7 ~]# vim /etc/sysconfig/iptables-config IPTABLES_MODULES="nf_conntrack_ftp" [root@centos7 ~]# modprobe nf_conntrack_ftp
2)放行請求/響應報文
命令鏈接:NEW, ESTABLISHED
數據鏈接:RELATED, ESTABLISHED
[root@centos7 ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT [root@centos7 ~]# iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT [root@centos7 ~]# iptables -A INPUT -j DROP [root@centos7 ~]# iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT [root@centos7 ~]# iptables -A OUTPUT -j DROP
請求報文的源地址轉換,讓本地網絡中的主機經過某一特定地址訪問外部網絡,實現地址假裝
route:
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf # sysctl -p # iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j SNAT --to-source 10.0.0.254
動態轉換:
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE
請求報文的目標地址轉換,把本地網絡中的主機上的某服務開放給外部網絡訪問,發佈服務和端口映射,隱藏真實IP
route:
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf # sysctl -p # iptables -t nat -A PREROUTING -d 10.0.0.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.6:80
端口和IP都進行轉換
配置於NAT表的 PREROUTING OUTPUT 鏈,經過改變目標IP和端口,將接受的包轉發至不一樣端口
# iptables -t nat -A PREROUTING -d 192.168.0.6 -p tcp --dport 80 -j REDIRECT --to-ports 8080