平常我们上网时,传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入,离开,或者经过我们的计算机。所以我们要弄明白,防火墙将怎么对待 这些数据包。这些数据包会经过一些相应的规则链,比如要进入你的计算机的数据包会首先进入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  指源地址 可是单个IP192.168.2.6 也可以是一个网络 192.168.2.0/24 还可以 是一个域名 如163.com 如果你填写的域名系统会自动解析出他的IP并在iptables里 显示

--sport    来源端口

-d         -s相似 只不过他指的是目标地址 也可以是IP 域名 和网络

--dport    目标端口

-j         执行参数 ACCEPT DROP

注意:如果以有参数存在 则说明全部接受

如我要来自己l0接口的数据全部接受,我们可以写成这样:

    iptables -A INPUT -i lo -j ACCEPT

如果我们想接受192.168.40.6这个IP地址传来的数据我们可以这样写

    iptablse -A INPUT -i eth1 -p tcp -s 192.168.40.6 -j ACCEPT

如果我们要拒绝来自己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 参数用来指定规则表,内建的规则表有三个,分别是:natmangle 和 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 以外的其它类型,包含udpicmp ...等。如果要比对所有类型,则可以使用 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

说明 用来比对联机状态,联机状态共有四种:INVALIDESTABLISHEDNEW 和 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相关的实验,希望对大家有所帮助。