Iptables
擴展模塊string的用法: 檢查數據報文中應用層出現的字符串,與給定的模式patten中的字符串做匹配。
字符串匹配算法:kmp,bm
常用選項:
--algo {kmp|bm}
--string ‘’STRING”
--hex-string “HEX_STRING”:HEX_STRING爲編碼成16進制格式的字符串。
實例:
一臺Centos7.2主機,一塊網卡,ip=172.16.254.79 ,跑一個網站www.magedu.com,
主頁文件:
Cat /var/www/html/string.html
<h1> magedu m19 </h1>
主機防火牆配置:
Systemctl stop firewalld.service
Systemctl disable firewalld
Yum -y install iptables-services
Iptables -F 或 systemctl stop iptables.service 清除默認防火牆默認規則,以防干擾實驗。
Systemctl enable iptables.service
爲寫防火牆規則前:
elinks -dump http://172.16.254.79/string.html
Magedu m19
訪問站點172.16.254.79 正常
因爲是對響應的網頁報文,做應用層字符串匹配,所以應在OUTPUT鏈上做過濾規則。
Iptables -A OUTPUT-s 172.16.254.79 -p tcp --sport 80 -d 172.16.0.0/16 -m string --string “magedu” --algo kmp -j DROP
在局域網172.16.0.0/16中的任意主機不能訪問string.html網頁了。
Iptables-save > /iptables1.txt
Iptables -F
擴展模塊-m multiport 一次可以匹配多個離散端口和連續端口,大大減少規則數量。
常用選項:
--dports PORT[,PORT,.......] 多個離散和連續的目標端口
--sports PORT[,PORT,........] 多個離散和連續的目標端口
--ports PORT[,PORT,..........] 多個離散和連續的源或目標端口
Yum -y install mariadb-server vsftpd 再安裝ftp,數據庫服務。
只開放tcp的80,3306,21,22端口
Iptables -A INPUT -d 172.16.254.79 -p tcp -m multilport --dports 80,3306,21:22 -j ACCEPT
擴展模塊-m iprange:指定某個網段的連續ip地址範圍的主機,大大減少規則數量。
常用選項:
--src-range ip1-ip2 匹配連續的源ip地址範圍
--dst-range ip1-ip2 匹配連續的目標ip地址範圍
Iptables-save > /iptables2.txt
Iptables -F
只允許172.16.0.0/16網絡的172.16.0.10到172.16.0.20地址範圍的主機訪問172.16.254.79 的80 端口即web服務。
Iptables -A INPUT-d 172.16.254.79 -p tcp --dport 80 -m iprange --src-range 172.16.0.10-172.16.0.20 -j ACCEPT
Iptables-save > /iptables3.txt
Iptables -F
擴展模塊-m connlimit: 基於連接數進行限制,對每個ip發起的併發連接數進行限制。
常用選項:
--connlimit-above #------超過#個併發連接數一般拒絕
--connlimit-upto #------小於#個併發連接數一般允許
只允許任意主機任意流量併發連接172.16.254.79的最大連接數爲2個
Iptables -A INPUT -d 172.16.254.79 -m connlimit --connlimit-above 2 -j DROP
內核自動會裝載如下幾個模塊
[root@www Desktop]# lsmod | grep conntrack
nf_conntrack_ipv4 14862 1
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
nf_conntrack 105745 2 xt_connlimit,nf_conntrack_ipv4
在內核的內存空間會生成一個記錄連接數的文件:
Cat /proc/net/nf_conntrack
擴展模塊-m time :基於時間塊的訪問控制,根據報文到達的時間與指定的時間塊進行匹配。
常用選項:
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --起始日期時間,未指定默認爲1970-01-01 00:00:00
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]--結束日期時間,未指定默認爲2038-01-19 04:17:07
--timestart hh:mm[:ss]--開始時間
--timestop hh:mm[:ss]--結束時間=-
[!] --weekdays day[,day...] ----- 指定時間爲星期幾
[!] --monthdays day[,day...]------指定時間爲幾號
實例:要求周2,4,6的工作時間(09:00:00--18:00:00)能夠訪問httpd服務。
1.如果INPUT鏈上的默認策略是拒絕:
Iptables -A INPUT -p tcp --dport 80 -d 172.16.254.79 -m --timestart 01:00:00 --timestop 10:00:00 --weekdays Tue,Thu,Sat -j ACCEPT
2.如果INPUT鏈上的默認策略是允許:
拒絕掉周2,4,6的非工作時間和周1,3,5,7的所有時間,剩餘的時間就是周2,4,6的工作時間
Iptables -AINPUT -p tcp --dport 80 -d 172.16.254.79 -m time --weekdays Mon,Wed,Fri,Sun -j DROP
Iptables -A INPUT -p tcp --dport 80 -d 172.16.254.79 -m time --weekdays Tue,Thu,Sat --timestart 10:00:01 --timestop 00:59:59 -j DROP (注意:centos7.2 時間是UTC時間)
擴展模塊-m limit:基於收發報文的速率進行匹配
常用選項:
--limit rate[/second|minute|hour|day]----每秒每分鐘每小時每天多少個報文,指平均速率
--limit-burst number 指峯值速率。
實例:
限制ping包的峯值速率10個,平均速率爲12/min
Iptabels -A INPUT-p icmp -m limit --limit 12/min --limit-burst 10 -j ACCEPT
Iptables _A INPUT -p icmp -j DROP ----拒絕掉速度超過12/min的報文
擴展模塊-m status:基於連接狀態追蹤機制進行訪問控制
常見的連接狀態有以下幾種:
1.NEW:新建立連接時(連接追蹤模板中無相應條目的),第一個請求報文請求建立連接
2.ESTABLISHED:連接建立後的通信過程
3.RELATED:與其他已建立的連接,有關聯的連接(如:ftp服務的數據連接)
4.INVALIED:無法識別的狀態,即非法連接
5.UNTRACKED:未追蹤的連接
實例:iptables 開放ftp服務
Iptables -A INPUT -d 172.16.254.79 -t tcp --dport 21 -j ACCEPT
Iptables -A INPUT-m state --state RELATED,ESTABLISHED -j ACCEPT
手動加載內核netfilter的nf_conntrack_ftp擴展模塊:
Modprobe nf_conntrack_ftp
練習題:INPUT和OUTPUT默認策略都爲DROP
1.允許本機PING別的主機,不允許別的主機ping本機。
Iptables -A INPUT-p icmp -m icmp --icmp-type echo-reply -j ACCEPT
Iptables -A OUTPUT -p icmp -m --icmp-type echo-request -j ACCEPT
2.拒絕tcp的標誌位全爲1及全爲0的報文訪問本機
Iptables -A INPUT-p tcp -m tcp --tcp-flags ALL ALL -j DROP
Iptables -A INPUT -p tcp -m tcp --tcp-flags ALL NONE -j DROP
3.開放本機的ssh服務給172.16.x.1-172.16.x.100的主機,x爲你的學號,新請求建立的的速度一分鐘不得超過2個:僅允許響應的報文通過其服務端口離開本機。
Iptables -A INPUT -p tcp -m tcp --dport 22 --syn -m iprange --src-range 172.16.22.1-172.18.22.100 -m recent --name sshpool --rcheck --seconds 60 --hitcount 2 -j DROP
Iptables -A INPUT -p tcp -m tcp --dport 22 --syn -m iprange --src-range 172.16.22.1-172.18.22.100 -m recent --name sshpool --set -j ACCEPT
Iptables -A INPUT -p tcp -m tcp -m state --state ESTABLISHED -j ACCEPT
Iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
4.在工作時間,即週一到週五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載的請求次數每分鐘不得超過5個。
Iptables -A INPUT -p tcp -m tcp --dport 21 -s 172.16.0.0/16 -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 08:30 --timestop 18:00 -j ACCEPT
Iptables -A INPUT -m state --state RELATED -m recent --name ftprequest --rcheck --seconds 60 --hitcount 5 -j DROP
Iptables -A INPUT -m state --state RELATED -m recent --name ftprequest --set -j ACCEPT
Iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
Iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
最後手動加載nf_conntrack_ftp模塊
modprobe nf_conntrack_ftp
5.限制本地主機的Web服務器在週一不許訪問,新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不許訪問;web服務器僅允許響應報文離開本機。
Iptables -A INPUT -p -tcp -m tcp --dport 80 --syn -m time ! --weekdays Mon --m recent --name httpdrequest --rcheck --seconds 1 --hitcount 100 -j DROP
Iptables -A INPUT-p tcp -m tcp --dport 80 --syn -m time ! --weekdays Mon -m recent --name httpdrequest --set -j ACCEPT
Iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
Iptables -A OUTPUT -p tcp -m tcp --sport 80 -m string --string “admin” --algo kpm -m state --state ESTABLISHED -j ACCEPT
SNAT--- 首先出去的報文是源地址轉換,其進來報文是目標地址轉換
實驗環境:vware-workstation
四臺虛擬主機: centos 6.7B,centos7.2A,centos6.7A,centos7.2c
Centos6.7B 一塊網卡eth0 vnet1 ip 10.0.0.10/8
Centos7.2A 一塊網卡 eth0 vnet1 ip 10.0.0.20/8
上述兩臺虛擬主機內網vnet1中
Centos6.7A是一臺網關防火牆 兩塊網卡etho ip 10.0.0.100/8 ,eth1 192.168.0.110/24(wifi自動獲得,網關192.168.0.1) vnet1 eth1橋接到真機網卡,且真機能上網。
Centos7.2C 一塊網卡 eth0 192.168.0.109(wifi自動獲得)
實驗目的:centos7.2C 不配一條到10.0.0.0/8網段的靜態路由,要讓內網的centos6.7B,centos7.2A 通過centos6.7A防火牆的SNAT功能,ping 通centos7.2C,且能上互聯網。
Centos6.7B 的網絡配置:
Vim /etc/sysconfig/network-script/ifcfg-eth0
DEVICE=eth0
ONBOOT=on
BOOTPROTO=static
DNS1=192.168.0.1
IPADDR=10.0.0.10
NETMASK=255.0.0.0
:wq
添加默認路由:route add default gw 10.0.0.100(防火牆的內網網卡地址)
重啓網絡服務:service network restart
Centos7.2A的網絡配置:
nmcli connection modify eno16777728 connection.autoconnect yes ipv4.method manual ipv4.addresses 10.0.0.20/8 ipv4.gateway 10.0.0.1 ipv4.dns 192.168.0.1
重啓網絡服務:systemctl restart network.service
Centos6.7A 防火牆的網絡配置:
eth0 vnet1
Vim /etc/sysconfig/network-script/ifcfg-eth0
DEVICE=eth0
ONBOOT=on
BOOTPROTO=static
IPADDR=10.0.0.100
NETMASK=255.0.0.0
:wq
eth1 橋接,自動獲得ip gateway dns
重啓網絡服務:service network restart
打開防火牆主機的內核轉發功能:
臨時打開:1. echo 1 > /proc/sys/net/ipv4/ip_forward
2. sysctl -w net.ipv4.ip_forward=1
永久打開:vim /etc/sysctl.conf
net.ipv4.ip_forward=1
:wq
先清除iptables 的FORWARD鏈上的規則,以免干擾實驗:
Iptables -F FORWARD
再在FORWARD鏈上添加規則
Iptables -A FORWARD -j ACCEPT ----- 一切流量都轉發,因爲內網主機要上互聯網。
要做SNAT ,必須在POSTROTUING鏈上做
Iptables -A POSTROUTING -j SNAT --to-source 192.168.0.110
DNAT :首先轉換的是目標地址,然後轉換的是源地址,而且只能在PREROUTING鏈上做,否則就晚了。
實驗要求:centos7.2C 通過ssh服務,要管理防火牆主機,內網兩臺主機。
Ssh到防火牆不用配置
在防火牆上映射192.168.0.110:100--------> 10.0.0.10:22
Iptables -t nat -A PREROTUING -p tcp -m tcp --dport 100 -d 192.168.0.110 -i eth1 -j DANT --to-destination 10.0.0.10:22
在防火牆上映射192.168.0.110:200---------> 10.0.0.20:22
Iptables -t nat -A PREROTUING -p tcp -m tcp --dport 200 -d 192.168.0.110 -i eth1 -j DANT --to-destination 10.0.0.20:22
動作:-j REDIRECT 報文目標端口轉換,只能在PRIROUTING,OUTPUT鏈中。
實例:在防火牆上開啓httpd服務,端口爲8080
在centos7.2A 上通過80端口訪問防火牆的httpd的web服務。
Iptables -t nat -A PREROUTING -i eth0 -d 172.16.0.110 -p tcp --dport 80 -j REDIRECT --to-port 8080
如果防火牆本機也能通過80端口,訪問到httpd提供的web服務(8080)
Iptbles -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080