第一章:防火墙介绍
1.常见防火墙选用
硬件防火墙
开源软件:iptables(默认规则改为INPUT DROP)
云服务器:安全组(阿里云 白名单,默认是拒绝的)
2.iptables使用 执行过程
3.iptables 4表5链
4.准备iptables环境
5.iptables功能之一防火墙
封IP 封端口
准许某个ip访问 网段访问
6.iptables功能之内网服务器上外网(共享上网)
7.iptables功能之 端口转发
第二章:常见防火墙选用
- 公司网站入口使用的硬件 防火墙 、三次路由带有防火墙功能
- itpables访问量小 C5 C6自带,CentOS 7为Firewalld
SELinux
第三章: 相关名词与单词
名词 | 含义 | 对比 |
---|---|---|
容器 | 存放内容/存放东西 | |
Netfilter/iptables | 是表的容器 | 国家 |
表(table) | 表是用来存放链的容器 | 省 |
链(chain) | 链 存放规则的容器 | 市 |
规则(policy) | 准许/拒绝访问 | 区/县 |
第四章:防火墙执行过程
1. 防火墙是层层过滤的,实际是按照配置**规则**的顺序**从上到下**,**从前到后**进行过滤的。
2. 如果**匹配**上规则,即明确表示是阻止(DROP)还是通过(ACCEPT)数据包就**不再向下匹配新的规则。**
3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配**默认规则**得到明确的阻止还是通过。
4. 防火墙的默认规则是所有规则执行完才执行的。
第五章:四表五链
5.1 四表及作用
表 | 功能 |
---|---|
Filter | 过滤,默认的表,防火墙功能 |
NAT | 实现NAT转化:1.共享上网 2.端口转发 |
mangle | |
raw |
5.2 四表中的5链
####五链:
PREROUTING
FORWARD
INPUT
OUPUT
POSTROUTING
5.3 filter表和nat表
5.3.1 filter表
filter表 | 企业工作场景:主机防火墙 |
---|---|
INPUT | 就是过滤进入主机的数据包 |
FORWARD | 负责转发流经主机的数据包 |
OUTPUT | 就是处理从主机发出去的数据包 |
5.3.2 nat表
nat表 | |
---|---|
PREROUTING | 处理用户请求中的目的地址 目的端口 端口转发 ip映射 |
POSTROUTING | 处理离开服务器的请求 源端口 源ip :共享上网 |
OUTPUT | 和主机放出去的数据包有关,改变主机发出数据包的目的地址 |
补充:
filter表:
INPUT 作用:用于发送到本地套接字的数据包。
FORWARD 作用:对于正在通过该框路由的数据包
OUTPUT 作用:用于本地生成的数据包。
nat表:
PREROUTING 作用:因为他们一进来就改变了包
OUTPUT 作用:用于在路由之前更改本地划分的数据包。
POSTROUTING 作用:改变包,因为它们即将离开
第六章:防火墙之filter表
6.1环境准备
[root@m01 ~]# rpm -qa iptables-services
iptables-1.4.21-28.el7.x86_64
[root@m01 ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables #iptables 配置文件
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service #iptables服务管理配置
启动防火墙
[root@m01 ~]# systemctl stop firewalld #CentOS7关闭firewalld [root@m01 ~]# systemctl restart iptables [root@m01 ~]# systemctl enable iptables
手动加载内核模块
[root@m01 ~]# modprobe ip_tables
[root@m01 ~]# modprobe iptable_filter
[root@m01 ~]# modprobe iptable_nat
[root@m01 ~]# modprobe ip_conntrack
[root@m01 ~]# modprobe ip_conntrack_ftp
[root@m01 ~]# modprobe ip_nat_ftp
[root@m01 ~]# modprobe ipt_state
检查防火墙内核模块是否加载成功:
[root@m01 ~]# lsmod |egrep 'nat|ipt|filter' nf_nat_ftp 12770 0 nf_conntrack_ftp 18638 1 nf_nat_ftp ipt_REJECT 12541 2 nf_reject_ipv4 13373 1 ipt_REJECT ipt_MASQUERADE 12678 1 nf_nat_masquerade_ipv4 13412 1 ipt_MASQUERADE iptable_filter 12810 1 xt_nat 12681 2 iptable_nat 12875 1 nf_nat_ipv4 14115 1 iptable_nat nf_nat 26787 4 nf_nat_ftp,nf_nat_ipv4,xt_nat,nf_nat_masquerade_ipv4 nf_conntrack 133095 8 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4 ip_tables 27126 2 iptable_filter,iptable_nat libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
6.2 配置规则-禁止访问22端口
[root@m01 ~]# iptables -F #清除规则 [root@m01 ~]# iptables -X [root@m01 ~]# iptables -Z [root@m01 ~]# 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 [root@m01 ~]# #添加一条规则,禁止22端口访问 [root@m01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP [root@m01 ~]# Type `help' to learn how to use Xshell prompt. [d:\~]$ #断开了~跑下机房
删除规则,重新连接m01
[root@m01 ~]# iptables -nL --line-number #查看防火墙规则 [root@m01 ~]# iptables -t filter -D INPUT 1 #删除第1条规则 [root@m01 ~]# iptables -nL --line-number #再次查看
重新连接 22端口就可以用了
Type `help' to learn how to use Xshell prompt.
[d:\~]$
Connecting to 10.0.0.61:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Tue Jul 2 17:04:55 2019
[root@m01 ~]#
配置防火墙规则注意事项:
去机房重启系统或者登陆服务器删除刚才的禁止规则。
让机房人员重启服务器或者让机房人员拿用户密码登录进去
通过服务器的远程管理卡管理(推荐)
先写一个定时任务,每5分钟就停止防火墙**5. 测试环境测试好,写成脚本,批量执行
6.3 filter表其他规则配置
6.3.1 只让10.0.0.0/24网段进行访问连接
只要是10.0.0.0/24 局域网的用户 访问m01 都ACCEPT
此例子主要限制:网段或ip地址
[root@m01 ~]# iptables -A INPUT -p tcp ! -s 10.0.0.0/24 -j DROP #"!" 叹号表示取反
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- !10.0.0.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
去另一台服务器上测试一下是否成功:
[root@db01 ~]# ssh 10.0.0.61 #连接10.0.0.61,可以连接 root@10.0.0.61's password: Last login: Tue Jul 2 17:41:01 2019 from 10.0.0.51 [root@m01 ~]# logout #退出 Connection to 10.0.0.61 closed. [root@db01 ~]# ssh 172.16.1.61 #连接172.16.1.61,不可以连接 ....等到死
6.3.2准许或禁止端口
多个端口:表示范围 1-1024范围
[root@m01 ~]# iptables -I INPUT -p tcp ! --dport 1:1024 -j DROP
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:!1:1024
2 DROP tcp -- !10.0.0.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
多个端口 不连续 80,443,52113,22
[root@m01 ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443,22 -j DROP
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports !80,443,22
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
6.4 iptables命令及参数
iptables | |
---|---|
-t | 指定表 filter(默认) nat |
-A | append 把规则追加到末尾 |
-I (大写字母i ) | insert 把规则插入到规则的第1条 (添加拒绝类规则的时候) |
-p | protocal 指定协议:tcp /udp/icmp |
--dport | destination port 目标端口 |
--sport | source port 源端口 |
-d | dest ip address 目标ip地址 |
-s | source ip address 源ip地址 |
-j | jump 方法 DROP (拒绝)、 ACCEPT(准许) 、REJECT(拒绝) |
iptables查看 删除 | ||
---|---|---|
-F | 清除链中所有规则 | |
-X | 清空自定义链的规则 | |
-Z | 清空计数器 | |
-n | 不要把端口解析服务名字 | |
-L | 显示表中的规则 | |
--line-number | 给每个链中的规则加上行号 | |
-D | 删除规则 根据规则的号码进行删除 |
第七章: nc命令
##### nc用法:
**nc -l 指定监听端口**
**nc/telnet 连接**
[root@m01 ~]# nc -l 888 #m01服务器上
晚上好
[root@db01 ~]# nc 10.0.0.61 888 #db01服务器上
晚上好
第八章: 准许或禁止ping
现在是可以ping通的
[root@m01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.038 ms
^C
--- 10.0.0.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.038/0.051/0.064/0.013 ms
[root@m01 ~]# ping 172.16.1.61
PING 172.16.1.61 (172.16.1.61) 56(84) bytes of data.
64 bytes from 172.16.1.61: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 172.16.1.61: icmp_seq=2 ttl=64 time=0.039 ms
^C
--- 172.16.1.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.039/0.059/0.079/0.020 ms
[root@m01 ~]#
添加icmp,禁止ping
[root@m01 ~]# iptables -I INPUT -p icmp --icmp-type any -j DROP #禁止ping
[root@m01 ~]#
[root@m01 ~]# ping 10.0.0.61 #ping不通了
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
^C
--- 10.0.0.61 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms
[root@m01 ~]# ping 172.16.1.61 #ping不通了
PING 172.16.1.61 (172.16.1.61) 56(84) bytes of data.
^C
--- 172.16.1.61 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2001ms
[root@m01 ~]# ping 127.0.0.1 #ping不通了
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
^C
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1003ms
第九章:限制访问频率
iptables -I INPUT -s 10.0.1.0/24 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
第十章:永久保存规则
[root@m01 ~]# cat /etc/sysconfig/iptables #防火墙的默认规则
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@m01 ~]# iptables-save #当前的防火墙规则
# Generated by iptables-save v1.4.21 on Wed Jul 3 09:28:21 2019
*filter
:INPUT ACCEPT [93:6196]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [69:7412]
-A INPUT -s 10.0.1.0/24 -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j DROP
COMMIT
# Completed on Wed Jul 3 09:28:21 2019
# Generated by iptables-save v1.4.21 on Wed Jul 3 09:28:21 2019
*nat
:PREROUTING ACCEPT [39:2360]
:INPUT ACCEPT [2:104]
:OUTPUT ACCEPT [44:3050]
:POSTROUTING ACCEPT [44:3050]
-A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source 10.0.0.61
-A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61
COMMIT
# Completed on Wed Jul 3 09:28:21 2019
[root@m01 ~]# iptables-save >/etc/sysconfig/iptables
[root@m01 ~]#
[root@m01 ~]# iptables-restore < /etc/sysconfig/iptables
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- 10.0.0.0/24 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
ACCEPT icmp -- 10.0.1.0/24 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 255
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@m01 ~]# systemctl restart iptables.service
注意事项:
- iptables-save >/etc/sysconfig/iptables
- iptables 是关闭状态 stop/disable
- 关闭时不要使用iptables -nL查看状态 ,一查看就打开了
- 查看防火墙状态:systemctl is-active iptables
第11章: 生产环境防火墙配置
1.逛公园:防火墙默认的规则 默认规则都是允许(Chain INPUT (policy ACCEPT))
2.电影院:默认规则是拒绝DROP 凭票进入
允许SSH登录端口进入
[root@m01 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许机回环Io接口数据流量流出与流入
[root@m01 ~]# iptables -A OUTPUT -o lo -j ACCEPT
[root@m01 ~]# iptables -A INPUT -i lo -j ACCEPT
-i input 与 INPUT链一起使用
-o output 与 OUTPUT 链一起使用
准许icmp协议通过
[root@m01 ~]# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
准许用户使用的端口通过 80,443
#先把信任网段删掉再进行测试
[root@m01 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#俩台虚拟机上测试
[root@m01 ~]# nc -l 80
你好
[root@db01 ~]# telnet 10.0.0.61 80
Trying 10.0.0.61...
Connected to 10.0.0.61.
Escape character is '^]'.
你好
允许用户与服务器建立连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
开启信任的IP网段
[root@m01 ~]# iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT
[root@m01 ~]# iptables -A INPUT -s 172.16.1.0/24 -p all -j ACCEPT
修改默认规则
[root@m01 ~]# iptables -P INPUT DROP
[root@m01 ~]# iptables -P FORWARD DROP
[root@m01 ~]# iptables -P OUTPUT ACCEPT
查看设置的规则
[root@m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
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 dpt:443
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
第十二章:NAT 表
nat表 | |
---|---|
PREROUTING | 处理用户请求中的目的地址 目的端口 端口转发 ip映射 |
POSTROUTING | 处理离开服务器的请求 源端口 源ip :**共享上网 |
OUTPUT | 和主机放出去的数据包有关,改变主机发出数据包的目的地址 |
保存好之前的规则删除
[root@m01 ~]# iptables-save >/root/iptables.rule [root@m01 ~]# ll iptables.rule -rw-r--r-- 1 root root 969 Jul 3 10:33 iptables.rule
跑机房修改默认规则:
PREROUTING
[root@m01 ~]# #iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 8080 -j DNAT --to-destination 10.0.0.51:22
[root@m01 ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:8080 to:10.0.0.51:22
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
SNAT all -- 10.8.0.0/24 !10.8.0.0/24 to:10.0.0.61
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
[root@m01 ~]# iptables -nL -t nat #查看nat表
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:10.0.0.51:22
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
SNAT all -- 10.8.0.0/24 !10.8.0.0/24 to:10.0.0.61
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
[root@m01 ~]# cat /proc/sys/net/ipv4/ip_forward #查看防火墙是否打开
1
[root@m01 ~]# lsmod |egrep 'nat|ipt|filter' #检查
iptable_filter 12810 1
xt_nat 12681 3
iptable_nat 12875 1
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26787 2 nf_nat_ipv4,xt_nat
nf_conntrack 133095 3 nf_nat,nf_nat_ipv4,nf_conntrack_ipv4
ip_tables 27126 2 iptable_filter,iptable_nat
ipt_REJECT 12541 0
nf_reject_ipv4 13373 1 ipt_REJECT
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
#现在连接应该是不通,此刻需要添加一条内核优化
[root@m01 ~]# #第一种方法:
[root@m01 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@m01 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@m01 ~]# #第二种方法:
[root@m01 ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
#让其生效
[root@m01 ~]# sysctl -p
POSTROUTING
#添加NAT共享上网命令
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61
[root@m01 ~]# iptables -t nat -nL
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
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
去db01上关闭网卡eth0
#关闭eth0网卡
[root@db01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=no #把eth0网卡关闭
IPADDR=10.0.0.51
PREFIX=24
GATEWAY=10.0.0.254
DNS1=10.0.0.254
或者
[root@db01 ~]# ifdown eth0 #暂时将eth0网卡关闭
#可以利用m01进行ssh远程连接db01的内网地址
[root@m01 ~]# ssh 172.16.1.51
Last login: Wed Jul 3 11:12:04 2019 from 10.0.0.1
[root@db01 ~]#
#修改eth1网卡网关
[root@db01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
IPADDR=172.16.1.51
PREFIX=24
NAME=eth1
DEVICE=eth1
ONBOOT=yes
GATEWAY=172.16.1.61 #修改网关为m01的内网地址
DNS1=223.5.5.5 #DNS按原理来说会自动分配,如果不通的话就加入此条DNS解析即可
[root@db01 ~]# systemctl restart network #重启网卡
[root@db01 ~]#
[root@db01 ~]# ping baidu.com #可以上网了
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=127 time=7.74 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=127 time=11.8 ms
^C
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 7.249/9.136/11.833/1.812 ms
[root@db01 ~]#