为什么80%的码农都做不了架构师?>>>
一、防火墙-iptables
在早期的Linux系统中,默认使用iptables防火墙管理服务来配置防火墙,在RHEL/CentOS 7.x开始模式使用firewalld防火墙了。6.x版本使用iptables。防火墙分为主机防火墙、网络防火墙。
1、selinux
关闭selinux,修改/etc/selinux/config配置文件
[root@node5 ~]# vim /etc/selinux/config
SELINUX=enforcing
SELINUX=enforcing修改为SELINUX=disabled即可。
临时关闭selinux:
[root@node5 ~]# setenforce 0
查看selinux:
[root@node5 ~]# getenforce
Permissive
[root@node5 ~]#
2、iptables
防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工资并去执行匹配项中定义的行为,具体行为有:
ACCEPT:放行
REJECT:拒绝
DROP:丢弃
LOG:记录日志信息
iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链根据数据包处理位置的不同进行分类,可分成:
PREROUTING:在进行路由选择前处理数据包
INPUT:处理流入的数据包
OUTPUT:处理转发的数据包
FORWARD:处理转发的数据包
POSTROUNTING:在进行路由选择后处理数据包。
2.1 安装iptables
RHEL/Centos 7.x要使用iptables,必须安装iptables-services:
[root@node5 ~]# yum install -y iptables-services
2.2 开启iptables
先关闭firewalld,再开启iptables:
[root@node5 ~]# systemctl stop firewalld
[root@node5 ~]# systemctl start iptables
[root@node5 ~]#
查看规则:
[root@node5 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 45 3256 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.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:220 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT 33 packets, 2988 bytes)pkts bytes target prot opt in out source destination
[root@node5 ~]#
二、netfilter(iptables)-5表5链
5个表:filter、nat、mangle、raw、security,默认是filter表。
5个链:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUNTING
PREROUTING:在进行路由选择前处理数据包
INPUT:处理流入的数据包
OUTPUT:处理流出的数据包
FORWARD:处理转发的数据包
POSTROUNTING:在进行路由选择后处理数据包。
filter表:一般的过滤表,有INPUT、FORWARD、OUTPU三个链
nat表:用于网络地址转换,有PREROUTING、OUTPUT、POSTROUTING三个链
managle表:用于给数据做标记的。很少用
raw表:用于实现追踪某些数据包
security表:用于强制访问控制(MAC)的网络规则
iptables传输数据包的过程
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
三、iptables语法
1、iptables常用的参数介绍
-P:设置默认规则,给某个表设置默认的规则(ACCEPT、REJECT、DROP、LOG等)。
-F:清空规则链
-L:查看规则链
-A:在规则链末尾加入新的规则
-I [num]:在某条规则之前插入新的规则
-D num:删除某一条规则
-t 表名:指定表,如果不指定,则默认是filter表
-s:匹配来源地址
-d:匹配目录地址
-i 网卡名:匹配从这块网卡流入的数据
-o 网卡名:匹配从这块网卡流出的数据
-p:协议,比如tcp、udp、icmp等
-Z:计数器清零
--dport num:匹配目标端口
--sport num:匹配来源端口
2、用法举例
查看规则:iptabels -L或iptables -nvL,使用--line-number则会显示每条规则的序号。
[root@node5 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
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-prohibitedChain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@node5 ~]#
默认规则保存在:/etc/sysconfig/iptables文件中
清空规则:iptables -F
[root@node5 ~]# iptables -F
保存当前的规则:
[root@node5 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@node5 ~]#
在RHEL7.0版本中,有BUG,就算保存了规则,但重启之后失效。
给某个链设置默认规则
例如,把INPUT链设置为DROP,一旦设置了DROP,则会拒绝所有的数据包流入。远程连接会断开。
[root@node5 ~]# iptables -P INPUT DROP
[root@node5 ~]#
计数器清零:
[root@node5 ~]# iptables -Z
例1:禁止ping
root@node5 ~]# iptables -I INPUT -p icmp -j REJECT
设置此规则之后,就不能ping了:
删除刚才设置的禁止ping规则:
先查看一下是哪条规则
[root@node5 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 175 packets, 12625 bytes)pkts bytes target prot opt in out source destination 4 240 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachableChain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 125 packets, 13832 bytes)pkts bytes target prot opt in out source destination
[root@node5 ~]# iptables -D INPUT 1
[root@node5 ~]#
因为INPUT链只有一条规则,这条规则就是禁止ping的规则,所以是:
iptables -D INPUT 1
例2:在INPUT链中,设置只允许192.168.0.0网段的主机访问本机的22端口
[root@node5 ~]# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
[root@node5 ~]#
查看一下:
[root@node5 ~]# iptables -L --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.0.0/24 anywhere tcp dpt:sshChain FORWARD (policy ACCEPT)
num target prot opt source destination Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@node5 ~]#
添加成功。
例3:在INPUT链中,添加拒绝所有人访问本机的80端口策略
[root@node5 ~]# iptables -I INPUT -p tcp --dport 80 -j DROP
[root@node5 ~]# iptables -I INPUT -p udp --dport 80 -j DROP
例4:在INPUT链中,添加拒绝192.168.0.100主机访问本机的80端口策略
[root@node5 ~]# iptables -I INPUT -s 192.168.0.100 -p tcp --dport 80 -j REJECT
例5:在INPUT链中,添加拒绝192.168.0.100主机访问本机的ens33网卡策略
[root@node5 ~]# iptables -I INPUT -s 192.168.0.100 -i ens33 -j DROP
四、filter表小案例
1、对192.168.0.0网段放行22端口,对全部主机放行80,21端口。
#!/bin/bash
#iptables命令的绝对路径
ipt="/usr/sbin/iptables"
#先清空已有的规则
$ipt -F
#设置INPUT链为DROP
$ipt -P INPUT DROP
#设置OUTPUT、FORWARD为ACCEPT
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
#指定状态
$ipt -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
#192.168.0.0网段的主机放行22端口
$ipt -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
#放行80,21端口
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
然后运行脚本:
[root@node5 ~]# sh set-iptables.sh
2、icmp示例:本机可以ping其他主机,其他主机不能ping本机。
[root@node5 ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
五、nat表使用
5.1 nat表应用举例
A机:有两块网卡,ens33(192.168.10.205)连接外网、ens38(10.0.0.100)连接内网
B机:只有一块网卡,ens36(10.0.0.101)连接内网
A、B可以通信。
需求1:可以让B机连接外网
A机设置:
·打开路由转发功能
[root@node5 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
这是临时生效,如要永久生效,则修改配置文件。
[root@node5 ~]# vim /usr/lib/sysctl.d/50-default.conf
net.ipv4.ip_forward = 1
·防火墙设置:
[root@node5 ~]# iptables -F
[root@node5 ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o ens33 -j MASQUERADE
查看一下:
[root@node5 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 3 packets, 215 bytes)pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 3 215 MASQUERADE all -- * ens33 10.0.0.0/24 0.0.0.0/0
[root@node5 ~]#
规则设置成功。
B机设置:网关设为10.0.0.100
[root@node2 network-scripts]# vim ifcfg-ens36
# Generated by dracut initrd
NAME="ens36"
DEVICE="ens36"
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=10.0.0.101
PREFIX=24
GATEWAY=10.0.0.100
[root@node2 network-scripts]# systemctl restart network
设置完成上面之后,B机ping外网:
OK,B机可以连外网了。
但此时,物理机是ping不通10.0.0.100和10.0.0.101的。
需求2:物理机只能和A通信,让物理机机可以直接连B机的22端口。
A机打开路由转发,前面已经设置了
A机防火墙设置:
[root@node5 ~]# iptables -t nat -A PREROUTING -d 192.168.10.205 -p tcp --dport 1122 -j DNAT --to 10.0.0.101:22
[root@node5 ~]# iptables -t nat -A POSTROUTING -s 10.0.0.101 -j SNAT --to 192.168.10.205
[root@node5 ~]#
查看一下设置的规则:
[root@node5 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 22 packets, 1966 bytes)pkts bytes target prot opt in out source destination 1 52 DNAT tcp -- * * 0.0.0.0/0 192.168.10.205 tcp dpt:1122 to:10.0.0.101:22Chain INPUT (policy ACCEPT 4 packets, 621 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 1 packets, 52 bytes)pkts bytes target prot opt in out source destination 35 2611 MASQUERADE all -- * ens33 10.0.0.0/24 0.0.0.0/0 0 0 SNAT all -- * * 10.0.0.101 0.0.0.0/0 to:192.168.10.205
[root@node5 ~]#
B机网关:10.0.0.100
此时,物理机可以通过远程连接A机的1122端口连接到B机,这里使用Xshell演示:
5.2 SNAT、DNAT、MASQUERADE简介
SNAT是source networkaddress translation的缩写,即源地址目标转换。比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip,这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了,所以叫做SNAT,基于源地址的地址转换。
DNAT是destination networkaddress translation的缩写,即目标网络地址转换,典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站,当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换。
MASQUERADE,地址伪装,算是snat中的一种特例,可以实现自动化的snat。
在iptables中有着和SNAT相近的效果,但也有一些区别,但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个。
六、防火墙规则的备份和恢复
防火墙规则保存:service iptables save
[root@node5 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@node5 ~]#
默认保存在/etc/sysconfig/iptables文件中。
如果想自定义保存文件,则可以使用命令iptable-save命令重定向到一个文件:
[root@node5 ~]# iptables-save > myiptables.txt
从已经保存的文件中恢复防火墙规则:
刚才已经把规则保存到myiptables.txt了,现在把规则清空,再恢复看看。
[root@node5 ~]# iptables -t nat -F
[root@node5 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination
OK,规则已清空。下面使用iptables-restore命令恢复规则:
[root@node5 ~]# iptables-restore < myiptables.txt
再查看一下:
[root@node5 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- * * 0.0.0.0/0 192.168.10.205 tcp dpt:1122 to:10.0.0.101:22Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * ens33 10.0.0.0/24 0.0.0.0/0 0 0 SNAT all -- * * 10.0.0.101 0.0.0.0/0 to:192.168.10.205
[root@node5 ~]#
OK,恢复成功。
七、防火墙扩展
1、显式扩展
iptables扩展:显式扩展
2、网络防火墙
网络防火墙:网络防火墙
3、其他
其他内容:https://www.zsythink.net/archives/tag/iptables/page/2/