iptables
一 iptables的介绍
Redhat6 默认的防火墙是iptables
iptables防火墙的组成 :
防火墙的组成:4张表和5条链
表是iptables防火墙服务功能的分类:
raw :对ip包做状态跟踪
mangle :给到达防火墙的ip数据包打标签
nat :网络地址,端口转换
filter :包过滤表,过滤符合条件的表
链是匹配IP数据包传输的方向:
INPUT 进入防火墙主机的包
OUTPUT 从防火墙主机出去的包
FORWARD 匹配从防火墙主机经过的包
POSTROUTING 路由选路发生之后处理,数据包到达防火墙后,已进行选路之后,
防火墙再告诉这个数据包如何走
PREROUTING 路由选路发生之前处理,数据包到达防火墙后还没有进行选路时,
防火墙再告诉这个数据包如何走。
表中所使用的链:
raw : output,prerouting
mangle :input,output,forward,postrouting,prerouting
nat : input,output,postrouting,prerouting
filter : input output forward
二 iptables的安装与启动
[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 以数字显示地址,端口
目标操作:
ACCEPT: 放行
DROP: 直接丢弃, 不给出任何回应
REJECT: 拒绝通过,必要时给出提示
LOG: 记录日志,然后传给下一条规
防火墙规则的查看
[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表中有
#规则其它表中都是空的
防火墙规则的删除:
#查看规则时,用--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