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
magedu m19
主机防火墙配置:
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
http://172.16.0.110/test.html
如果防火墙本机也能通过80端口,访问到httpd提供的web服务(8080)
Iptbles -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080