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,数据库服务。

只开放tcp80,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.10172.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

手动加载内核netfilternf_conntrack_ftp扩展模块:

  Modprobe nf_conntrack_ftp

练习题:INPUTOUTPUT默认策略都为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 报文目标端口转换,只能在PRIROUTINGOUTPUT链中。

实例:在防火墙上开启httpd服务,端口为8080

centos7.2A 上通过80端口访问防火墙的httpdweb服务。

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