你总嫌有些人懒,说得好像你勤快了就真能干出什么大事儿一样。
介绍
iptables是Linux中重要的访问控制手段,是俗称的 Linux 防火墙系统的重要组成部分。这里记录了iptables 防火墙规则的一些常用的操作指令。
iptables的基本语法:
1 | iptables [-t filter/nat] [-A/I] [INPUT/OUTPUT/FORWARD] [-i/o interface] [-p tcp/udp/icmp/all] [-s ip/network] [--sport ports] [-d ip/network] [--dport ports] [-j ACCEPT/DROP] |
1 | 参数说明: |
如果配置的是INPUT(进入),则来源ip是运程ip,目标端口就是本机;OUTPUT相反
流程
当数据包到达目标主机时,经过PREROUTING链,经路由之后决定是否转发,不转发则进入INPUT链,到达用户空间。进程对外通信时,经由OUTPUT链出去,路由之后到达POSTROUTING链,经网卡出去。当一数据包经过PREROUTING链发现其不是到达本主机,那么数据包经过FORWARD链,到达 POSTROUTING链转发出去。本机进程对发送数据时,经由OUTPUT链路由之后进入POSTROUTING链出去。
iptables匹配规则时,是自上而下匹配的,匹配到第一条规则时既跳出,否则一直往下匹配,没有则使用默认规则。
iptables规则建立时,首先需要确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件。
尽量遵循以下规则:尽量减少规则条目,彼此间无关联,访问条目大放上面,有关联(同一功能),规则更严格的放上面
五个hook函数分别是PREROUTING
,INPUT
,OUTPUT
,POSTROUTING
,FORWARD
,我们把这五个钩子函数称为链,Netfilter实现了几功能,raw
,mangle
,nat
,filter
。我们一般把这几个功能称为表,表之间有优先级关系,从低到高为filter—-nat—-mangle—-raw
,表与链之间有对应关系,具体见图表。
表
- raw表: 对报文设置一个标志,决定数据包是否被状态跟踪机制处理
- mangle表: 主要用于修改数据包
- nat表: 主要用处是网络地址转换、端口映射
- fileter表: 主要用于过滤包
一般情况我们对filter表做配置的更多。
链
- INPUT: 作用于进入本机的包
- OUTPUT: 作用于本机送出的包
- FORWARD: 匹配穿过本机的数据包(转发)
- PREROUTING: 用于修改目的地址(DNAT)
- POSTROUTING:用于修改源地址 (SNAT)
基本操作
1 | 启动指令:service iptables start |
三种状态
- ACCEPT 允许
- DROP 丢弃
- REJECT 拒绝
ROP和REJECT的区别:DROP是直接不让进入,而REJECT是先让进入然后再拒绝,LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则.
DROP更安全,所以一般拒绝都用DROP
-A默认是插入到尾部的,可以-I来插入到指定位置
iptables的两种配置思路:
- 默认允许,拒绝特别
- 默认拒绝,允许特别
二者都有自己的特点,看情况而定。但是注意:如果要选择第二种配置思路,配置前切记先把ssh设置为ACCEPT,因为一般机器不在我们身边,一旦配置默认拒绝,那我们的远程登录就会断开连接,那问题就大了。
配置默认拒绝前设置:
1 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
还有一种方法:做一个计划任务,让iptables定期停止,即执行service iptables stop,这样的话即使配置默认拒绝前没有允许ssh也没关系,等到计划任务生效的时间iptables就会自动清除所有的配置,包括默认规则。
iptables的执行优先级:
- iptables的执行顺序是自上而下,当有配置产生冲突时,前面执行的生效。
删除iptables规则
1 | iptables -D INPUT 3 //删除input的第3条规则 |
删除规则
第一种方法:修改配置文件
1 | vim /etc/sysconfig/iptables |
注意:
修改完配置文件不能先save,一定要先restart才能save,要不然就白做了。因为save会在iptables服务启动时重新加载,要是在重启之前直接先调用了service iptables save 那么你的/etc/sysconfig/iptables 配置就回滚到上次启动服务的配置了。
第二种方法:直接用命令删除
如果你记得配置时的写法,那么可以直接iptables -D
后跟上配置时的写法。如:
1 | iptables -D INPUT -s 10.72.11.12 -p tcp --sport 1234 -d 10.10.2.58 --dport 80 -j DROP |
或者查看每条iptables的序号
1 | iptables -L INPUT --line-numbers |
防火墙常用的策略
拒绝进入防火墙的所有ICMP协议数据包
1 | iptables -I INPUT -p icmp -j REJECT |
允许防火墙转发除ICMP协议以外的所有数据包
1 | iptables -A FORWARD -p ! icmp -j ACCEPT |
拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据
1 | iptables -A FORWARD -s 192.168.1.11 -j REJECT |
丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包
1 | iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP |
封堵网段(192.168.1.0/24),两小时后解封。
1 | iptables -I INPUT -s 10.20.30.0/24 -j DROP |
只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。
1 | iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT |
允许本机开放从TCP端口20-1024提供的应用服务
1 | iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT |
允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包
1 | iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT |
禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机
1 | iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP |
禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包
1 | iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP |
允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280
1 | iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT |
禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包
1 | iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP |
禁止转发与正常TCP连接无关的非—syn请求数据包
1 | iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP |
拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
1 | iptables -A INPUT -p tcp -m state --state NEW -j DROP |
说明:“ESTABLISHED”表示已经响应请求或者已经建立连接的数据包,“RELATED”表示与已建立的连接有相关性的,比如FTP数据连接等。
只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发住服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理。
1 | iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT |
下面两句话可以定义默认全部丢弃数据包:
1 | iptables -P INPUT DROP |
-P参数的意思是policy,翻译成策略~那么这两句话就好理解了。
第一句的意思是:
输入(INPUT)的数据包默认的策略(-P)是丢弃(DROP)的
第二句的意思是:
输出(OUTPUT)的数据包默认的策略(-P)是丢弃(DROP)的
其实到这里已经是一个有用的防火墙了,只不过,没有什么意义,和拔掉网线的概念没有什么不同
首先写下这6句话
1 | iptables -A INPUT -p icmp --icmp-type any -j ACCEPT |
说明一下,这6句基本上都是要的
查看nat表
1 | iptables -t nat -vnL POSTROUTING --line-number |
查看filter表
1 | iptables -L -n --line-number |grep 21 //--line-number可以显示规则序号,在删除的时候比较方便 |
总结
附最经典的iptables脚本
1 |
|