平常我们上网时,传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入,离开,或者经过我们的计算机。所以我们要弄明白,防火墙将怎么对待 这些数据包。这些数据包会经过一些相应的规则链,比如要进入你的计算机的数据包会首先进入INPUT链,从我们的计算机发出的数据包会经过 OUTPUT链,如果一台计算机做一个网络的网关(处于内网和外网两个网络连接的两台计算机,这两台计算机之间相互通讯的数据包会经过这台计算机,这台计算机即相当于一个路由器),可能 会有很多数据经过这台计算机,那么这些数据包必经FORWARD链,FORWARD链即数据转发链。明白了这些“链”的概念我们才能进一步学习使用iptables。
现在我们再来分析一下iptables规则是如何工作的,假如我们要访问网站www.baidu.com,我们要对www.baidu.com发出请 求,这些数据包要经过OUTPUT链,在请求发出前,Linux的内核会在OUTPUT链中检查有没有相应的规则适合这个数据包,如果没有相应的规 则,OUTPUT链还会有默认的规则,或者允许,或者不允许(事实上,不允许有两种,一种是把请求拒绝,告诉发出请示的程序被拒绝;还有一种是丢弃,让请 求发出者傻等,直到超时)。如果得到允许,请求就发出了,而www.baidu.com服务器返回的数据包会经过INPUT链,当然,INPUT链中也会 有相应的规则等着它。
一、下面我们介绍几个iptable的命令
iptables -L [-t filter]
这条命令是显示当前有什么已经设置好的防火墙规则,iptables 有三个链分别是 INPUT OUTPUT 和FORWARD
iptables的默认设置为 三条链都是ACCEPT 如下:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
以上信息你可以用 iptables -L看到
总体来说iptables可以有二种设置
1.默认允许,拒绝特别的
2.默认拒绝,允许特别的
二者都有自己有特点,从安全角度看 个人偏向于第二种,就是默认拒绝,允许特别的.但iptalbes 默认是第一种 默认允许,拒绝特别的
二、先来谈炎几个参数XZFL
-F 清除规则
-X 清除链
-Z 将链的记数的流量清零
一般来说 再创建访问规则时 都会将原有的规则清零 这是一个比较好的习惯,因为某些规则的存在会影响你建的规则.
基本语法:
iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD] [-io interface]
[-p tcp,udp.icmp,all] [-s ip/nerwork] [--sport ports]
[-d ip/netword] [--dport ports] [-j ACCEPT DROP]
以上是iptables的基本语法
A 是添加的意思
I 是播入的意思
io 指的是数据要进入或出去所要经过的端口 如eth1 eth0 pppoe等
p 你所要指定的协议
-s 指源地址 可是单个IP如192.168.2.6 也可以是一个网络 192.168.2.0/24 还可以 是一个域名 如163.com 如果你填写的域名系统会自动解析出他的IP并在iptables里 显示
--sport 来源端口
-d 同-s相似 只不过他指的是目标地址 也可以是IP 域名 和网络
--dport 目标端口
-j 执行参数 ACCEPT DROP
注意:如果以有参数存在 则说明全部接受
1 如我要来自己l0接口的数据全部接受,我们可以写成这样:
iptables -A INPUT -i lo -j ACCEPT
2 如果我们想接受192.168.40.6这个IP地址传来的数据我们可以这样写
iptablse -A INPUT -i eth1 -p tcp -s 192.168.40.6 -j ACCEPT
3 如果我们要拒绝来自己192.168.40.0/24这个网的telnet连接
iptablse -A INPUT -i eth1 -p udp -s 192.168.40.0/24 --sport 23 -j DROP
三、iptables 指令
语法:
iptables [-t table] command [match] [-j target/jump]
-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter
常用命令列表:
命令 -A, --append
范例 iptables -A INPUT ...
说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。
命令 -D, --delete
范例 iptables -D INPUT --dport 80 -j DROP
说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
命令 -R, --replace
范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明 取代现行规则,规则被取代后并不会改变顺序。
命令 -I, --insert
范例 iptables -I INPUT 1 --dport 80 -j ACCEPT
说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。
命令 -L, --list
范例 iptables -L INPUT
说明 列出某规则链中的所有规则。
命令 -F, --flush
范例 iptables -F INPUT
说明 删除某规则链中的所有规则。
命令 -Z, --zero
范例 iptables -Z INPUT
说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式***不可或缺的工具。
命令 -N, --new-chain
范例 iptables -N allowed
说明 定义新的规则链。
命令 -X, --delete-chain
范例 iptables -X allowed
说明 删除某个规则链。
命令 -P, --policy
范例 iptables -P INPUT DROP
说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
命令 -E, --rename-chain
范例 iptables -E allowed disallowed
说明 修改某自订规则链的名称。
常用封包比对参数:
参数 -p, --protocol
范例 iptables -A INPUT -p tcp
说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。
参数 -s, --src, --source
范例 iptables -A INPUT -s 192.168.40.1
说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.40.0/24。
参数 -d, --dst, --destination
范例 iptables -A INPUT -d 192.168.40.1
说明 用来比对封包的目的地 IP,设定方式同上。
参数 -i, --in-interface
范例 iptables -A INPUT -i eth0
说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也以使用 ! 运算子进行反向比对,例如:-i ! eth0。
参数 -o, --out-interface
范例 iptables -A FORWARD -o eth0
说明 用来比对封包要从哪片网卡送出,设定方式同上
参数 --sport, --source-port
范例 iptables -A INPUT -p tcp --sport 22
参数 --dport, --destination-port
范例 iptables -A INPUT -p tcp --dport 22
参数 -m state --state
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。
四、扩展匹配条件
隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;
-p tcp:隐含了-m tcp;
[!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
[!] --tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔;
comp:必须为1的标志位列表,余下的出现在mask列表中的标志位则必须为0;
[!] --syn:
相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隐含了-m udp:
[!] --source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!] --destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
-p icmp:隐含了-m icmp:
[!] --icmp-type {type[/code]|typename}
8:echo-request
0:echo-reply
[root@inside ~]# iptables -A INPUT -p icmp -j REJECT [root@inside ~]# iptables -A OUTPUT -p icmp -j REJECT [root@inside ~]# iptables -I OUTPUT 1 -p icmp --icmp-type 8 -j ACCEPT //仅加这一条只能出去,不能进来 [root@inside ~]# ping 10.10.10.101 PING 10.10.10.101 (10.10.10.101) 56(84) bytes of data. ^C --- 10.10.10.101 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 3005ms [root@inside ~]# iptables -I INPUT 1 -p icmp --icmp-type 0 -j ACCEPT //响应报文 [root@inside ~]# ping 10.10.10.101 PING 10.10.10.101 (10.10.10.101) 56(84) bytes of data. 64 bytes from 10.10.10.101: icmp_seq=1 ttl=63 time=1.32 ms 64 bytes from 10.10.10.101: icmp_seq=2 ttl=63 time=1.50 ms ^C --- 10.10.10.101 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 1.321/1.412/1.504/0.098 ms
显式扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;
获取帮助:
CentOS 7:man iptables-extensions
CentOS 6:man iptables
1、multiport扩展
以离散或连续的方式定义多端口匹配条件;
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指定多个端口
范例:
[root@inside ~]# iptables -A INPUT -p icmp -j REJECT [root@inside ~]# iptables -A OUTPUT -p icmp -j REJECT [root@inside ~]# iptables -I INPUT -p tcp -m multiport --dport 21:23,80,53 -j ACCEPT [root@inside ~]# systemctl restart httpd [root@firewall ~]# curl 192.168.40.101 i miss you
2、iprange扩展
以连续的ip地址范围指明连续的多地址匹配条件;
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目标IP地址;
范例:
[root@inside ~]# iptables -I INPUT 1 -p tcp --dport 22 -m iprange --src-range 192.168.40.6-192.168.40.8 -j ACCEPT [root@firewall ~]# ssh 192.168.40.101 Warning: Permanently added '192.168.40.101' (ECDSA) to the list of known hosts. root@192.168.40.101's password: Last login: Mon Oct 29 09:36:33 2018 from 192.168.40.1 [root@outside ~]# ssh 192.168.40.101 ssh: connect to host 192.168.40.101 port 22: Connection refused
3、set扩展
依赖于ipset命令行工具;
范例:
[root@inside ~]# iptables -A INPUT -p icmp -j REJECT [root@inside ~]# iptables -A OUTPUT -p icmp -j REJECT [root@inside ~]# iptables -I INPUT 1 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT [root@inside ~]# iptables -I OUTPUT 1 -p tcp --sport 80 -m set --match-set httplist dst -j ACCEPT [root@inside ~]# curl 192.168.40.101 i miss you
4、string扩展
对报文中的应用层数据做字符串匹配检测;
[!] --string pattern:要检测字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制编码;
--algo {bm|kmp}
范例:
[root@outside html]# iptables -A INPUT -m string --algo bm --string "google" -j REJECT [root@outside html]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere STRING match "google" ALGO name bm TO 65535 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@inside html]# curl 172.18.254.202/google.com ^C [root@inside html]# curl 172.18.254.202/baidu.com baibu
5、time扩展
根据报文到达的时间与指定的时间范围进行匹配度检测;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
--kerneltz:使用内核中配置的时区
范例:
[root@outside ~]# date -u Mon Oct 29 05:59:12 UTC 2018 [root@outside ~]# iptables -R INPUT 1 -m time --timestart 5:00 --timestop 8:55 --weekdays Mon,Thu -m string --algo bm --string "baidu" -j REJECT [root@firewall ~]# curl 172.18.254.202/baidu.com ^C [root@firewall ~]# curl 172.18.254.202/google.com gooooole
6、connlimit扩展
根据每客户端IP做并发连接数匹配;
--connlimit-upto n:连接数数量小于等于n,此时应该允许;
--connlimit-above n:连接数数量大于n,此时应该拒绝;
范例:
[root@outside ~]# iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 1 -j REJECT [root@inside ~]# ab -c 1 -n 10 http://172.18.254.202/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 172.18.254.202 (be patient).....done Server Software: Apache/2.4.6 Server Hostname: 172.18.254.202 Server Port: 80 Document Path: / Document Length: 6 bytes Concurrency Level: 1 Time taken for tests: 0.017 seconds Complete requests: 10 Failed requests: 0 Write errors: 0 Total transferred: 2640 bytes HTML transferred: 60 bytes Requests per second: 581.50 [#/sec] (mean) Time per request: 1.720 [ms] (mean) Time per request: 1.720 [ms] (mean, across all concurrent requests) Transfer rate: 149.92 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 0.2 1 1 Processing: 1 1 0.3 1 1 Waiting: 0 1 0.2 1 1 Total: 1 1 0.4 2 2 ERROR: The median and mean for the total time are more than twice the standard deviation apart. These results are NOT reliable. Percentage of the requests served within a certain time (ms) 50% 2 66% 2 75% 2 80% 2 90% 2 95% 2 98% 2 99% 2 100% 2 (longest request) [root@inside ~]# ab -c 2 -n 10 http://172.18.254.202/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 172.18.254.202 (be patient)...apr_socket_recv: Connection refused (111) Total of 1 requests completed
7、limit扩展
基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number:峰值速率
范例:
[root@outside ~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 8 -j ACCEPT [root@outside ~]# iptables -A INPUT -p icmp --icmp-type 8 -j REJECT [root@inside ~]# ping 172.18.254.202 PING 172.18.254.202 (172.18.254.202) 56(84) bytes of data. 64 bytes from 172.18.254.202: icmp_seq=1 ttl=64 time=0.462 ms 64 bytes from 172.18.254.202: icmp_seq=2 ttl=64 time=0.364 ms 64 bytes from 172.18.254.202: icmp_seq=3 ttl=64 time=0.314 ms 64 bytes from 172.18.254.202: icmp_seq=4 ttl=64 time=0.357 ms 64 bytes from 172.18.254.202: icmp_seq=5 ttl=64 time=0.579 ms 64 bytes from 172.18.254.202: icmp_seq=6 ttl=64 time=0.355 ms 64 bytes from 172.18.254.202: icmp_seq=7 ttl=64 time=0.600 ms 64 bytes from 172.18.254.202: icmp_seq=8 ttl=64 time=0.500 ms 64 bytes from 172.18.254.202: icmp_seq=9 ttl=64 time=0.599 ms From 172.18.254.202 icmp_seq=10 Destination Port Unreachable From 172.18.254.202 icmp_seq=11 Destination Port Unreachable From 172.18.254.202 icmp_seq=12 Destination Port Unreachable 64 bytes from 172.18.254.202: icmp_seq=13 ttl=64 time=0.574 ms From 172.18.254.202 icmp_seq=14 Destination Port Unreachable From 172.18.254.202 icmp_seq=15 Destination Port Unreachable From 172.18.254.202 icmp_seq=16 Destination Port Unreachable From 172.18.254.202 icmp_seq=17 Destination Port Unreachable From 172.18.254.202 icmp_seq=18 Destination Port Unreachable 64 bytes from 172.18.254.202: icmp_seq=19 ttl=64 time=1.63 ms From 172.18.254.202 icmp_seq=20 Destination Port Unreachable From 172.18.254.202 icmp_seq=21 Destination Port Unreachable From 172.18.254.202 icmp_seq=22 Destination Port Unreachable From 172.18.254.202 icmp_seq=23 Destination Port Unreachable From 172.18.254.202 icmp_seq=24 Destination Port Unreachable 64 bytes from 172.18.254.202: icmp_seq=25 ttl=64 time=0.562 ms
五、总结
以上简单介绍了IPtables的基础知识,链、规则、匹配条件等等,让我们对防火墙有了基本的认识,接下来讲一些关于状态追踪、以及NAT相关的实验,希望对大家有所帮助。