本文介绍iptables这个Linux下最强大的防火墙工具,包括配置iptables三个链条的默认规则、添加iptables规则、修改规则、删除规则等。
1. iptable基础命令说明
1 |
iptables -A INPUT -s 192.168.109.10 -j DROP:拒绝192.168.109.10主机访问本服务器; |
- -A:添加一条规则,默认是加在最后。
- "拒绝给192.168.109.10主机提供服务",最好使用INPUT链。使用PREROUTING,也可以满足要求,但是如果用户的要求是让服务器提供转发功能,添加到PREROUTING链中,"转发"功能也将被拒绝掉。
- 链名要大写;
- -s:指定源地址,可以是IP地址,也可以是网段"192.168.109.10/24";"-s 为空",表示拒绝所有;
- -j:指定所需要的操作;
- 拒绝有两种方式,一种是"REJECT",还有一种是"DROP";DROP是不回应,REJECT是拒绝;
- iptables -A INPUT -j DROP,表示拒绝所有。不过加规则的时候,不要将自己的ssh给拒绝掉。
2. 查看规则集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
iptables --list -n # 加一个-n以数字形式显示IP和端口,看起来更舒服 iptables -nvL -t mangle # 查看mangle表中的防火墙规则; # -t:指定表名,默认情况下是"fliter"表; # -v:查看详细信息; # pkts:被本机报文所匹配的个数; # prot:放行哪种协议; # opt:额外的选项,--表示没有; # target:处理机制; # 选项中"v"和"L"的顺序(V只能在L的前面); iptables -nvL --line-numbers # 查看fliter表中规则的顺序; #--line-numbers:查看指定表中的规则的顺序; #不指定表,默认情况下就是"fliter"表; #表中的规则是有执行顺序的,编号(num)越小,越先执行。只要匹配到结果,就不会往下执行了; |
3. 配置默认规则
1 2 3 |
iptables -P INPUT DROP # 不允许进 iptables -P FORWARD DROP # 不允许转发 iptables -P OUTPUT ACCEPT # 允许出 |
4. 增加规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # 允许源IP地址为192.168.0.0/24网段的包流进(包括所有的协议,这里也可以指定单个IP) iptables -A INPUT -d 192.168.0.22 -j ACCEPT # 允许所有的IP到目的为192.168.0.22的访问 iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开放本机80端口 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 开放本机的ICMP协议 iptables -A INPUT -s 192.168.109.10 -d 192.168.109.4,192.168.109.5 -j REJECT # 拒绝来自192.168.109.10的主机访问192.168.109.4的ip地址; -d:指定目标地址,使规则更加详细; # 一条命令添加两条规则;源地址也可以使用这种方式,快速添加规则; # 该命令在规则中的语义的含义,-s、-d属于并且的关系,即:拒绝源是192.168.109.10的ip,且源是192.168.109.4的访问;而192.168.109.4和192.168.109.5在逻辑上属于或者的关系。 iptables -I INPUT -s 1.1.1.1 -j DROP #在"fliter"表中的INPUT链中,链首插入一条规则;-I:表示在指定的链中插入一条规则,可以指定编号 iptables -R INPUT 1 -s 2.2.2.2 -j REJECT # 表示替换第一条规则; # -R,replace,替换指定的规则; iptables -A INPUT -s 192.168.109.10 -i eth0 -j REJECT #拒绝192.168.109.10主机访问我的eth0网卡。 #-i:加上网卡名,表示报文流入的接口; #-o:加上网卡名,表示报文流出的接口; iptables -A INPUT ! -s 192.168.109.4 -p tcp --dport 80 -j REJECT # 除了192.168.109.4的主机可以访问我的tcp的80端口,其他的主机全部拒绝; # !:表示"非";一般情况下,很少使用该方式。 iptables -A INPUT -s 192.168.109.4 -p icmp --icmp-type 8 -j REJECT # 拒绝来自192.168.109.10主机发送来的icmp的请求包。即192.168.109.10主机无法ping通我,我可以ping通它。 iptables -A INPUT -s 192.168.109.4 -p icmp --icmp-type 8 -j REJECT # 拒绝来自192.168.109.10主机发送来的icmp的请求包。即192.168.109.10主机无法ping通我,我可以ping通它。 # icmp协议中,ping通需要满足两个条件,首先源主机向目标主机发送一个请求包(8),目标主机收到之后,便会返回一个回应包(0)。 # -p:指定协议; # --icmp-type:指定ping包的类型。(code可以省略;) iptables -A INPUT -s 192.168.109.10 -p tcp -m multiport --dports 20:22,80 -j REJECT # 拒绝来自192.168.109.10主机发送来的访问我的20-22,80端口的包。 # -m:后面跟模块名,multiport:以离散形式表示的多端口(最多可以跟15个端口); # --dports:目标端口是多个端口; # 使用samba服务测试多端口的话,可能存在问题。想要抓包测试的话,可以使用"tcpdump -i eth0 -nn host 192.168.109.4"; iptables -A INPUT -m iprange --src-range 192.168.109.1-192.168.109.10 -j REJECT # 拒绝192.168.109.1~192.168.109.10范围内的所有主机的访问。 # iprange:ip范围的模块; # --src-range:源地址范围; # --dsc-range:目标地址的范围; iptables -A INPUT -m mac --mac-source 00:0c:29:2f:b1:d6 -j REJECT # 拒绝该mac地址的主机访问本主机的资源。 # mac:mac地址模块; # --mac-source:源主机的mac地址; iptables -A OUTPUT -p tcp -m string --algo bm --string "han" -j REJECT # 拒绝所有主机访问访问我的有"han"字符串的报文。 # string:字符串模块; # --algo:指定匹配算法,bm、kmp算法,两个随便选一个; # --string:指定要匹配的字符串; # --from offset:开始偏移,--to offset:结束偏移; # 添加的是OUTPUT链; |
5. 删除规则
1 2 |
iptables -D INPUT -s 192.168.0.21 -j ACCEPT # 删除刚才建立的第一条规则 |
6. 保存和清空规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
iptables -F # -F 清空规则缓冲区(这个操作会将上面的增加操作全部清空,若须保留建议先执行一下句:保存) iptables -F OUTPUT #清空OUTPUT链中的规则; iptables -S #以iptables-save命令格式显示fliter链上的规则; iptables -A INPUT -m time --weekdays 1,2,3,4,5 --timestart 9:00 --timestop 10:00 -j REJECT # 拒绝所有的主机在周一到周五的九点~十点之间,访问本主机的所有资源; # 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...] 星期几 # 注意:centos7中,使用的是UTC时间(北京时间转化成UTC时间是减8);centos6中使用的是本地时间; service iptables save # 将规则保存在/etc/sysconfig/iptables文件里 service iptables restart # 重启Iptables服务 |
7. 总结
最后说明一下,iptables防火墙的配置文件存放于:/etc/sysconfig/iptables
8. 参考
赞赏微信赞赏
支付宝赞赏