Redhat6 默认的防火墙是iptableshtml
iptables防火墙的组成 :
防火墙的组成:4张表和5条链
表是iptables防火墙服务功能的分类:
raw :对ip包作状态跟踪
mangle :给到达防火墙的ip数据包打标签
nat :网络地址,端口转换
filter :包过滤表,过滤符合条件的表
链是匹配IP数据包传输的方向:
INPUT 进入防火墙主机的包
OUTPUT 从防火墙主机出去的包
FORWARD 匹配从防火墙主机通过的包
POSTROUTING 路由选路发生以后处理,数据包到达防火墙后,已进行选路以后,网络
防火墙再告诉这个数据包如何走
PREROUTING 路由选路发生以前处理,数据包到达防火墙后尚未进行选路时,ssh
防火墙再告诉这个数据包如何走。tcp
表中所使用的链:post
raw : output,prerouting
mangle :input,output,forward,postrouting,prerouting
nat : input,output,postrouting,prerouting
filter : input output forward测试
[root@hostB ~]# yum -y install iptables-services [root@hostB ~]# systemctl start iptables [root@hostB ~]# systemctl enable iptables
iptables基本用法
管理程序位置:/sbin/iptables
指令:
iptables [-t 表名] 选项 [链名] [条件] [-j 目标操做]
中括号部分能够省略
表名:raw,mangle,nat,filter,若是不指令默认是filter
链名:INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING若是不指定链默认为对应表的全部链
选项:
-A 在链的末尾追加一条规则;
-L 列出全部的规则条目
-I 在链的开头插入一条
-D 删除链内指定序号的规则
-F 清空全部的规则
-P 为指定的链设置默认,只能是ACCEPT或者DROP
-n 以数字显示地址,端口spa
目标操做:
ACCEPT: 放行
DROP: 直接丢弃, 不给出任何回应
REJECT: 拒绝经过,必要时给出提示
LOG: 记录日志,而后传给下一条规日志
防火墙规则的查看code
[root@HostB ~]# iptables -L #查看filter表中全部规则 Chain INPUT (policy ACCEPT) #INPUT链,默认规则是ACCEPT。数据包通过 #防火墙时,若是与INPUT链中 策略不匹配时, #实施规则为ACCEPT 源地址 目标地址 匹配条件 target prot opt source estination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) #FORWARD链 target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) #OUTPUT链 target prot opt source destination [root@HostB ~]# ------------------------------------------------------------------------------ [root@HostB ~]# iptables -nL #以数字显示地址和端口,查看filter Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@HostB ~]# ---------------------------------------------------------------------------------- [root@HostB ~]# iptables -t raw -nL #查看raw表的默认规则 Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@HostB ~]# ---------------------------------------------------------------------------------- [root@HostB ~]# iptables -t mangle -nL #查看mangle表的默认规则 Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination [root@HostB ~]# ---------------------------------------------------------------------------------- [root@HostB ~]# [root@HostB ~]# iptables -t nat -nL #查看nat表的默认规则 Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination [root@HostB ~]# #经过以上四张表的查看,只有filter表中有 #规则其它表中都是空的
防火墙规则的删除:htm
#查看规则时,用--line-numbers显示行号 [root@HostB ~]# iptables -t filter -nL --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination [root@HostB ~]# #删除filter表中INPUT链的第5条规则 [root@HostB ~]# iptables -t filter -D INPUT 5 #删除filter表中INPUT链的全部规则 [root@HostB ~]# iptables -t filter -F INPUT [root@HostB ~]# iptables -t filter -F #删除filter表中全部链的全部规则 [root@HostB ~]# iptables -t raw -F #删除其它表中的全部规则 [root@HostB ~]# iptables -t mangle -F [root@HostB ~]# iptables -t nat -F #经过以上指令所有清空规则后当即生效,重 #启iptables服务以后,会自动恢复。 #重启iptables时会读取/etc/sysconfig/iptables #文件中保存的策略,因此经过指令清空防火墙规 #则后要保存到文件中,使它永久生效。 [root@HostB ~]# iptables-save > /etc/sysconfig/iptables
主机型防火墙: 写防火墙规则保护本机
使用到的表和链:filter表中的INPUT链
网络理防火墙:写防火墙规则限制数据包的通过
使用到的表和链:filter表中的FORWARD链
条件(规则):
条件的匹配顺序:
顺序比对,匹配即中止(LOG除外)
若无任何匹配,则按该链的默认策略处理
匹配条件:
通用匹配:
协议匹配 -p 协议名
地址匹配 -s 源地址 -d 目标地址
接口匹配 -i 收数据的网卡
隐含匹配:
端口匹配 --sport 源端口 --dport目标端口
ICMP类型匹配 --icmp-type ICMP类型:echo-reply
案例1: 在hostB上配置防火墙规则,只容许其它主机ssh链接同时拒绝其它链接 #在filter表的INPUT中添加一条规则容许tcp协 #议且目标端口是22的数据经过。 [root@HostB ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT #把INPUT链的默认规则设置为DROP [root@HostB ~]# iptables -t filter -P INPUT DROP [root@HostB ~]# iptables -t filter -nL INPUT --line-numbers Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 [root@HostB ~]# 案例2: 在hostB主机上安装httpd服务,同时容许192.168.4.0网段的主机访问httpd服务。 同时要求新添加的指令插入到现有规则的第1行 #yum源若是是ftp的形式,须要先关闭iptables [root@HostB ~]# yum -y install httpd [root@HostB ~]# systemctl start httpd [root@HostB ~]# echo "HostB" >/var/www/html/test.html #在INPUT链中插入一条规则容许192.168.4.0网段 #的数据包访问本机的80端口 #INPUT后面不加数字表示插入到第1行,若是要插 #入到第3行后面,那么INPUT后面加3 [root@HostB ~]#iptables -t filter -I INPUT -p tcp --dport 80 -s 192.168.4.0/24 -j ACCEPT [root@HostB ~]#iptables -t filter -nL INPUT --line-numbers Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:80
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 [root@HostB ~]# [root@HostB ~]# iptables-save >/etc/sysconfig/iptables 案例3: 在hostB主机上开启icmp协议,容许全部主机Ping [root@HostB ~]# iptables -t filter -A INPUT -p icmp -j ACCEPT #查看规则,新规则默认插入到最后 [root@HostB ~]# iptables -t filter -nL INPUT Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 [root@HostB ~]# 容许hostB主机ping其它主机,不容许其它主机ping hostB [root@HostB ~]# #删除第3条规则, [root@HostB ~]# iptables -t filter -D INPUT 3 #在filter表中添加规则,容许ping的回 #包进入即放行icmp协议的echo replay包 [root@HostB ~]# iptables -t filter -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT [root@HostB ~]# [root@HostB ~]# iptables -t filter -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@HostB ~]# #在INPUT链中已容许ping的回包进入 #对于ping的请求包OUTPUT链的默认规则是ACCEPT #因此此时hostB主机已能够ping通hostA,hostC而 #hostA,hostC却ping不通hostB
网络型防火墙:
写防火墙规则限制数据包的通过 (filter -->FORWARD)
拓扑结构:
外网 防火墙 内网
hostA --------------------------> HostB ---------------------------> HostC
eth0: 192.168.4.5/24 eth0:192.168.4.51/24
gw:指向HostB的eth0 eth1:192.168.2.51/24 eth1:192.168.2.52/24
gw:指向HostB的eth1
环境准备 #清除HostB上原有的配置 [root@hostB ~]# iptables -t filter -P INPUT ACCEPT [root@hostB ~]# iptables -t filter -F [root@hostB ~]# iptables-save > /etc/sysconfig/iptables #查看内核路由转发是否开启 [root@hostB ~]# sysctl -a | grep -i net.ipv4.ip_forward #开启方法 [root@hostB ~]# echo 1 >/proc/sys/net/ipv4/ip_forward [root@hostB ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf [root@hostB ~]# sysctl -p net.ipv4.ip_forward = 1 #在主机C上配网关 #添加网关指令以前须要先关闭Network manager #删除网关: #route del default gw 192.168.2.51 [root@hostC ~]# route add default gw 192.168.2.51 [root@hostC ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.2.51 0.0.0.0 UG 0 0 0 eth1 192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1 [root@hostC ~]# #在主机A上配网关 [root@hostA ~]# route add default gw 192.168.4.51 #开启http服务供测试使用 [root@hostA ~]# rpm -q httpd || yum -y install httpd [root@hostA ~]# systemctl start httpd [root@hostA ~]# setenforce 0 测试: 在A主机上ping C主机,在B主机上抓包能够看数据包的通过 [root@hostA ~]# ping 192.168.2.52 PING 192.168.2.52 (192.168.2.52) 56(84) bytes of data. 64 bytes from 192.168.2.52: icmp_seq=1 ttl=254 time=1.49 ms 64 bytes from 192.168.2.52: icmp_seq=2 ttl=254 time=0.864 ms [root@HostB ~]# tcpdump -i eth0 -p icmp #经过抓包能够看出 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes #A主机向B主机的eh1口发送了ping的请求包 15:17:33.483515 IP 192.168.4.5 > 192.168.2.52: ICMP echo request, id 9743,seq1,length 64 #C主机向B主机的eth0发关了ping的回应包 15:17:33.484305 IP 192.168.2.52 > 192.168.4.5: ICMP echo reply, id 9743,seq1,length 64
15:17:34.485872 IP 192.168.4.5 > 192.168.2.52: ICMP echo request, id 9743,seq2,length 64
15:17:34.486311 IP 192.168.2.52 > 192.168.4.5: ICMP echo reply, id 9743,seq2,length 64 #在B主机上对filter表的FORWARD链配置规则, #由于默认是ACCEPT,因此先把默认规则修改 #为DROP而后再配置具体规则, [root@hostB ~]# iptables -t filter -P FORWARD DROP [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination [root@hostB ~]# 案例4: 主同C能够访问主机A的httpd服务 #在filter表的FORWARD链中放行目标端口是80 #的数据包和源端口是80的端口 [root@hostB ~]# iptables -t filter -A FORWARD -p tcp --dport 80 -j ACCEPT [root@hostB ~]# iptables -t filter -A FORWARD -p tcp --sport 80 -j ACCEPT [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 [root@hostB ~]# iptables-save > /etc/sysconfig/iptables 案例5: 在B上配置策略,容许A通ssh访问C主机 [root@hostB ~]# iptables -t filter -A FORWARD -p tcp --dport 22 -j ACCEPT [root@hostB ~]# iptables -t filter -A FORWARD -p tcp --sport 22 -j ACCEPT [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22 [root@hostB ~]#
防御类型及条件
基本匹配条件
通用匹配:
能够直接使用,不依赖于其余条件或者提升
扩展匹配:
前提条件:
有对应的防火墙模块支持,安装iptables时已自动安装
基本用法:
-m 扩展模块 --扩展条件 条件值
扩展条件类型:
MAC地址匹配 -m mac --mac-source MAC地址
多端口匹配:
多端口匹配能够减小防火墙规则指令条数,链接端口用冒号不连续的端口与逗号
-m multiport --sport 源端口列表
-m multiport --dport 目标端口列表
IP范围匹配
-m iprange --src-range IP1-IP2
-m iprange --dst-range IP1-IP2
案例6: 一条规则开放多个端口 [root@hostB ~]# iptables -t filter -F FORWARD [root@hostB ~]# iptables -t filter -A FORWARD -m multiport -p tcp --dport 22,80 -j ACCEPT [root@hostB ~]# iptables -t filter -A FORWARD -m multiport -p tcp --sport 22,80 -j ACCEPT [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22,80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport sports 22,80 [root@hostB ~]# 案例7: 对192.168.2.50-60这个网段的地址禁ping,但hostC修改本身的ip后仍能够ping #先添加一条规则容许ping #再添加一条192.168.2.50-60地址被禁止ping #的规则。注意,这条规则添加时要放到第3条 #规则的上面,即具体规则放前面,模糊规则放后面 [root@hostB ~]# iptables -t filter -A FORWARD -p icmp -j ACCEPT [root@hostB ~]# iptables -t filter -I FORWARD 3 -p icmp -m iprange --src-range 192.168.2.50-192.168.2.60 -j REJECT [root@hostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22,80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport sports 22,80 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.2.50-192.168.2.60 reject-with icmp-port-unreachable ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 [root@hostB ~]# 案例8: 直接对hostC的mac地址进行禁ping, 不管hostC的地址如何修改都不能ping #查看MAC地址的方法: [root@hostC ~]# ifconfig eth1 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.2.52 netmask 255.255.255.0 broadcast 192.168.2.255 ether 52:54:00:26:67:d0 txqueuelen 1000 (Ethernet) [root@HostB ~]# arp -a #在hostC邻居主机上执行arp -a也能够看到 ? (192.168.4.5) at 52:54:00:d0:3a:fa [ether] on eth0 ? (192.168.4.254) at 52:54:00:37:78:11 [ether] on eth0 ? (192.168.2.52) at 52:54:00:26:67:d0 [ether] on eth1 #在HostB上添加规则禁止主机C的MAC [root@HostB ~]# iptables -t filter -I FORWARD 3 -p icmp -m mac --mac-source 52:54:00:26:67:d0 -j DROP [root@HostB ~]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22,80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport sports 22,80 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 MAC 52:54:00:26:67:D0 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.2.50-192.168.2.60 reject-with icmp-port-unreachable ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 [root@HostB ~]#
NAT表的使用
案例9:
使用nat表作数据包中的原地址转换,实现全部主机共享同一个公网ip地址上网
拓扑结构:
外网 防火墙 内网
hostA --------------------------> HostB ------------------------> HostC
eth0: 192.168.4.5/24 eth0:192.168.4.51/24
eth1:192.168.2.51/24 eth1:192.168.2.52/24
gw:指向HostB的eth1
环境准备: #删除主机A上的网关,清空主机B上已有的防火墙策略 [root@hostA ~]# route del default gw 192.168.4.51 [root@hostB ~]# iptables -t filter -P FORWARD ACCEPT [root@hostB ~]# iptables -t filter -F [root@hostB ~]# iptables-save > /etc/sysconfig/iptables #使用nat表的POSTROUTING链 #-s 192.168.2.0/24 -p tcp --dport 80是匹配条件 # -j SNAT 是动做 [root@hostB ~]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.4.51 [root@hostB ~]# iptables -t nat -nL POSTROUTING --line-numbers Chain POSTROUTING (policy ACCEPT) num target prot opt source destination 1 SNAT tcp -- 192.168.2.0/24 0.0.0.0/0 tcp dpt:80 to:192.168.4.51 [root@hostB ~]# iptables-save > /etc/sysconfig/iptables #若是公网地址是服务商动态分配时 #-o eth0 表示数据包从eth0口出去 # -j MASQUERADE 动态捕获eth0的地址 iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -p tcp --dport 80 -o eth0 -j MASQUERADE