目录
2.让10.0.0.7和SSH客户端(10.0.0.1)服务器可以Ping,其它的不能Ping
[4.单向访问控制(A可以访问B, 但B不能访问A)](#4.单向访问控制(A可以访问B, 但B不能访问A))
一、IPtables是什么?
IPtables是开源的基于数据包过滤的防火墙工具,是CentOS7服务器之前版本的默认防火墙工具。从CentOS7开始默认防火墙工具由Firewalld取代,仍挡不住广大使用者对IPtables的一往情深。
二、IPtables企业应用场景
- 主机防火墙(filter表的INPUT链)。
- 局域网共享上网(nat表的POSTROUTING链)。半个路由器,NAT功能。
- 端口及IP映射(nat表的PREROUTING链),硬防的NAT功能。
- IP一对一映射。
三、IPtables工作流程
IPtables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
1.防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2.如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。
3.如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,则向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4.防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。
四、IPtables环境准备
1.安装IPtables管理命令
bash
[root@base ~]# yum install iptables-services -y
2.加载防火墙的内核模块
bash
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
3.查看已加载的模块
bash
[root@base ~]# lsmod |egrep 'filter|nat|ipt'
4.启动防火墙
bash
#首先停止firewalld,从CentOS7开始默认防火墙已经变成了firewalld
[root@base ~]# systemctl stop firewalld
[root@base ~]# systemctl disable firewalld
#开启iptables
[root@base ~]# systemctl start iptables.service
[root@base ~]# systemctl enable iptables.service
五、IPtables基本操作命令
1.查看防火墙规则
bash
[root@base ~]# iptables -nL
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
2.清除防火墙规则
bash
iptables -F <- 清除所有规则,不会处理默认的规则
iptables -X <- 删除用户自定义的链
iptables -Z <- 链的计数器清零(数据包计数器与数据包字节计数器)
3.添加防火墙规则
bash
iptables -t <-指定表d(efault: `filter')
iptables -A <-把规则添加到指定的链上,默认添加到最后一行。
iptables -I <-插入规则,默认插入到第一行(封IP)。
iptables -D <-删除链上的规则
4.网络连接状态
bash
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的
5.删除某个规则
bash
iptables -nL --line-numbers 查看规则号码
iptables -D INPUT 1 删除指定链上的指定序号
iptables A INPUT -p tcp -m state --dport 22 -j DROP
iptables -nL
iptables -nL --line-numbers
iptables -D INPUT 1
六、IPtables实践
1.禁止某个端口访问
bash
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
规则解释:
-p #<==指定过滤的协议-p(tcp,udp,icmp,all)
--dport #<==指定目标端口(用户请求的端口)。
-j #<==对规则的具体处理方法(ACCEPT,DROP,REJECT,SNAT/DNAT)
--sport #<==指定源端口。
2.禁止某个IP访问
bash
iptables -I INPUT -p tcp -s 10.0.0.253 -i eth0 -j DROP
iptables -A INPUT -p tcp ! -s 10.0.0.1 -i eth0 -j DROP
iptables -A INPUT -p tcp ! -s 10.0.0.0/24 -i eth0 -j DROP
规则解释:
-s #<==指定源地址或网段(192.168.1.0/24)。 ! 取反。
-d #<==指定目的地址(nat表prerouting)。
-i #<==进入的网络接口(eth0,eth1)。
-o #<==出去的网络接口(eth0,eth1)。
3.禁止除跳板机以外的IP访问
bash
iptables -I INPUT -p tcp ! -s 10.0.0.1 -j DROP
4.匹配端口范围
bash
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP #<==最佳
5.匹配ICMP类型
bash
iptables -A INPUT -p icmp --icmp-type 8
例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
七、简单练习
1.封掉10.0.0.7
bash
iptables -I INPUT -s 10.0.0.7 -j DROP
2.让10.0.0.7和SSH客户端(10.0.0.1)服务器可以Ping,其它的不能Ping
bash
iptables -I INPUT -p icmp --icmp-type 8 -s 10.0.0.7 -j ACCEPT
iptables -I INPUT 2 -p icmp ! -s 10.0.0.1 --icmp-type 8 -j DROP
3.封掉3306端口
bash
iptables -I INPUT -p tcp --dport 3306 -j DROP
4.单向访问控制(A可以访问B, 但B不能访问A)
bash
iptables -I INPUT -m iprange --src-range 192.168.8.200-192.168.8.254 -m state --state NEW -j DROP -m comment --comment "IDC网络策略隔离"
iptables -I INPUT -m iprange --src-range 192.168.60.200-192.168.60.254 -m state --state NEW -j DROP -m comment --comment "IDC网络策略隔离"
八、IPtables注意事项
1、从上往下依次匹配
2、一但匹配上,就不在往下匹配了
3、默认规则,默认的情况,默认规则是放行所有
bash
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT :把这条规则添加到INPUT链的最后一行
-p tcp :指定协议为tcp
-m state --state NEW :匹配TCP的连接状态
-m tcp --dport 22 :匹配TCP协议的目标端口
-j ACCEPT :执行动作 放行
bash
iptables A INPUT -p tcp -m state --dport 22 -j DROP
禁止一个数据包:
tcp协议
访问的端口是22
bash
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -nL
iptables -nL --line-numbers
iptables -D INPUT 1
禁止源地址是10.0.0.7的主机访问22端口
iptables -A INPUT -p tcp -s 10.0.0.7 --dport 22 -j DROP
禁止源地址是10.0.0.7的主机访问任何端口
iptables -A INPUT -p tcp -s 10.0.0.7 -j DROP
禁止源地址是10.0.0.8的主机访问80端口
iptables -A INPUT -p tcp -s 10.0.0.8 --dport 80 -j DROP
禁止除了10.0.0.7以外的地址访问80端口
iptables -A INPUT -p tcp ! -s 10.0.0.7 --dport 80 -j DROP
2条规则冲突,会以谁先谁为准
iptables -I INPUT -p tcp -s 10.0.0.7 --dport 22 -j ACCEPT
iptables -I INPUT -p tcp -s 10.0.0.7 --dport 22 -j DROP
禁止10.0.0.7访问22和80端口
iptables -I INPUT -p tcp -s 10.0.0.7 -m multiport --dport 22,80 -j DROP
禁止10.0.0.7访问22到100之间的所有端口
iptables -A INPUT -p tcp -s 10.0.0.7 --dport 22:100 -j DROP
禁止所有主机ping
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
放行10.0.0.7可以ping
iptables -I INPUT 2 -p icmp --icmp-type 8 -s 10.0.0.7 -j ACCEPT
只允许10.0.0.7可以ping
ACCEPT icmp -- 10.0.0.7 0.0.0.0/0 icmptype 8
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
等同于上一条,优化版,只要不是10.0.0.7就不允许ping
iptables -I INPUT -p icmp --icmp-type 8 ! -s 10.0.0.7 -j DROP
优先级:
匹配频次最高的条件放前面
100次
80 90
22 10
安全策略:
一种是广场上巡逻的人,默认认为大家都是安全的,只有通缉令上的人需要关注
一种是火车进站安检,默认所有人都是不安全的,只有有票的人才放行
bash
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -nL
共享上网
bash
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
-t nat :NAT表
-A POSTROUTING :POSTROUTING链
-s 172.16.1.0/24 :源地址172.16.1.0/24
-j SNAT :SNAT 改写源地址
--to-source 10.0.0.61 :将源地址改写成10.0.0.61
172.16.1.7发给百度的数据包格式
源端口: 80
目的端口: 80
源IP: 172.16.1.7
目的IP: 百度的IP
网关: 172.16.1.61
如果172.16.1.7想上网,需要改成如下的包格式
10.0.0.61访问百度
源端口: 80
目的端口: 80
源IP: 10.0.0.61
目的IP: 百度的IP
网关: 10.0.0.2
注意:
如果你的默认规则设置了拒绝所有,又执行了清除规则的语句-F,那就意味着,所有的请求全部都拒绝了,原因是-F不会改变默认规则。
bash
[root@base ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
解决:
1、如果是托管的物理机,那就有的玩了,只能去机房自己清空或者让机房的人重启服务器,前提条件是规则没有写入配置里
2、云服务器则直接通过控制台恢复。
如何避免:
1、测试规则之前,先写个定时任务,每隔5分钟重启一次iptables
FORWARD链默认为DROP的时候共享上网失效
解决方法:
第一种,添加2条规则
bash
iptables -A FORWARD -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -d 172.16.1.0/24 -j ACCEPT
第二种:修改FORWARD链默认规则为ACCEPT
bash
iptables -P FORWARD ACCEPT
端口映射:
访问10.0.0.61的9000端口,跳转到172.16.1.7的22端口
访问10.0.0.61的9000端口的数据包格式
源端口: 9000
目的端口: 9000
源IP: 10.0.0.1
目的IP: 10.0.0.61
源端口: 22
目的端口: 22
源IP: 10.0.0.1
目的IP: 172.16.1.7:22
bash
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
注意:
改写数据包的目标IP和端口
用到的是PREROUTING链
IP映射:
bash
ip a add 10.0.1.62/24 dev eth0 label eth0:0
iptables -t nat -A PREROUTING -d 10.0.1.62 -j DNAT --to-destination 172.16.1.7
保存命令:
bash
iptables-save
iptables-save > iptables_m01
iptables-restore < iptables_m01
iptables-save > /etc/sysconfig/iptables