学生组织网站建设,wordpress mysql扩展,做网站要买什么服务器,做视频解析网站犯法day05
day05iptables防火墙filter表filter中的三条链环境准备iptables操作验证FORWARD链准备环境配置FORWARD链NAT配置SNAT
iptables
iptables有多种功能#xff0c;每一种功能都用一张表来实现最常用的功能是防火墙和NAT从RHEL7开始#xff0c;默认的防火墙为firewalld每一种功能都用一张表来实现最常用的功能是防火墙和NAT从RHEL7开始默认的防火墙为firewalld但是它的底层仍然调用iptables安装iptables服务
# 关闭firewalld
[rootnode1 ~]# systemctl stop firewalld
[rootnode1 ~]# systemctl disable firewalld # 安装iptables
[rootnode1 ~]# yum install -y iptables-services.x86_64
iptables的表和链。我们只关心nat表和filter表。filter表是默认的表它实现防火墙也就是包过滤的功能。nat表实现网络地址转换。 防火墙filter表
配置iptables时不指定表就是使用filter表配置时不指定规则链则配置所有链可以向规则链中加入很多规则数据包进入该链时从上向下匹配一旦匹配就停止开始应用规则。如果全都不匹配则应用默认规则命令选项、链名、目标操作使用大写字母其他小写
filter中的三条链
INPUT数据包的目标地址是自己则进入INPUT链OUTPUT:数据包的源地址是自己则进入OUTPUT链FORWARD数据包穿过自己则进入FORWARD链 环境准备
client1eth0 - 192.168.88.10/24 网关192.168.88.11node1eth0 - 192.168.88.11/24eth1 - 192.168.99.11/24server1eth1 - 192.168.99.100/24 网关192.168.99.11
iptables操作
常用选项 -A 追加规则--iptables -A INPUT
-D 删除规则--iptables -D INPUT 1(编号)
-R 修改规则--iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则顺序不变(1是位置)
-I 插入规则--iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则原本位置上的规则将会往后移动一个顺位
-L 查看规则--iptables -L INPUT 列出规则链中的所有规则 通用参数
-p 协议 例iptables -A INPUT -p tcp
-s 源地址 例iptables -A INPUT -s 192.168.1.1
-d 目的地址 例iptables -A INPUT -d 192.168.12.1
--sport 源端口 例:iptables -A INPUT -p tcp --sport 22
--dport 目的端口 例:iptables -A INPUT -p tcp --dport 22
-i 指定入口网卡 例:iptables -A INPUT -i eth0
-o 指定出口网卡 例:iptables -A FORWARD -o eth0 -j 指定要进行的处理动作
常用的ACTION
DROP丢弃
REJECT明示拒绝
ACCEPT接受# 查看filter表中的规则。-t指定表名
[rootnode1 ~]# iptables -t filter -L # 所有规则链都是空的
Chain INPUT (policy ACCEPT) # INPUT链默认规则是接受
target prot opt source destination Chain FORWARD (policy ACCEPT) # FORWARD链默认规则是接受
target prot opt source destination Chain OUTPUT (policy ACCEPT) # OUTPUT链默认规则是接受
target prot opt source destination [rootnode1 ~]# iptables -L # 不指定表名默认操作filter表
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 # 起动服务时iptables将会出现一些默认规则
[rootnode1 ~]# systemctl start iptables.service
[rootnode1 ~]# iptables -L # 默认规则往往不合我们的要求可以先将所有的规则清空
[rootnode1 ~]# iptables -F
iptables的语法
iptables [-t 表名] 选项 [链名] [条件] [-j 满足条件的操作] 示例 可以设置默认拒绝然后明确允许也可以设置默认允许然后明确拒绝
# 向INPUT链追加规则192.168.88.254发来的包全部接受
# -A是追加-s是匹配源地址-j为jump采取的行为ACCEPT是接受
[rootnode1 ~]# iptables -A INPUT -s 192.168.88.254 -j ACCEPT # 将INPUT链的默认规则改为DROP丢弃。-P设置默认规则
[rootnode1 ~]# iptables -P INPUT DROP # 查看INPUT链的规则
[rootnode1 ~]# iptables -L INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 192.168.88.254 anywhere # 在192.168.88.10上访问node1将会被拒绝
[rootclient1 ~]# ping -c2 192.168.88.11
[rootclient1 ~]# ssh 192.168.88.11 # 注意数据通信多数是双向的。现在node1也不能与192.168.88.254以外的其他机器通信因为数据回不来。
[rootnode1 ~]# ping -c2 192.168.88.10 # 失败 # 允许192.168.88.0网络的主机ssh连接node1
# -I是插入到INPUT链的第1个位置。-p指定协议--dport指定目标端口号。-j是执行的操作
[rootnode1 ~]# iptables -I INPUT 1 -s 192.168.88.0/24 -p tcp --dport 22 -j ACCEPT # 查看规则
[rootnode1 ~]# iptables -L INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.88.0/24 anywhere tcp dpt:ssh
ACCEPT all -- 192.168.88.254 anywhere
# 查看规则n是指用数字来表示端口号、主机等
[rootnode1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 192.168.88.254 0.0.0.0/0 # 测试192.168.88.10已经可以ssh到node1但是ping不通因为只允许了ssh # 配置任何地址访问node1的80端口即http协议都接受
[rootnode1 ~]# yum install -y httpd
[rootnode1 ~]# systemctl start httpd
# 不指定源就是任何源
[rootnode1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[rootnode1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 192.168.88.254 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 # 拒绝192.168.88.254 ping node1。以下写法不会生效因为插入到了规则尾部在它上面已经存在允许192.168.88.254通信的规则了。
# icmp就是ping命令底层用到的协议叫Internet控制消息协议
[rootnode1 ~]# iptables -A INPUT -s 192.168.88.254 -p icmp -j REJECT
[rootnode1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 192.168.88.254 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
REJECT icmp -- 192.168.88.254 0.0.0.0/0 reject-with icmp-port-unreachable # 查看规则的行号
[rootnode1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
2 ACCEPT all -- 192.168.88.254 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4 REJECT icmp -- 192.168.88.254 0.0.0.0/0 reject-with icmp-port-unreachable # 删除第4条规则
[rootnode1 ~]# iptables -D INPUT 4
[rootnode1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
2 ACCEPT all -- 192.168.88.254 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 # 拒绝192.168.88.254 ping node1。-I不指定位置默认插到最上面
[rootnode1 ~]# iptables -I INPUT -s 192.168.88.254 -p icmp -j REJECT
[rootnode1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 REJECT icmp -- 192.168.88.254 0.0.0.0/0 reject-with icmp-port-unreachable
2 ACCEPT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22
3 ACCEPT all -- 192.168.88.254 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 # DROP是直接丢弃REJECT是明确拒绝。 # 保存规则。不保存规则重启iptables服务自定义规则将消失
[rootnode1 ~]# iptables-save /etc/sysconfig/iptables
此时从其他机器访问node1已放行相关协议但是从node1访问其他机器却无法成功。原因是数据可以发出去但是返回的数据包也会进入INPUT但是INPUT链中没有相关放行规则。从自身发出去返回来的数据包属于某个连接该连接的状态是ESTABLISHED放行该状态的数据包即可。ESTABLISHED表示已经建立的连接即数据包是响应一个已经建立的连接而来的。
[rootnode1 ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT 验证FORWARD链 准备环境 # 为node1的eth1配置ip地址
[rootnode1 ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
[rootnode1 ~]# nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.11/24
[rootnode1 ~]# reboot # 配置server1
[rootlocalhost ~]# hostnamectl set-hostname server1
[rootlocalhost ~]# nmcli connection modify System eth0 ipv4.addresses autoconnect no
[rootlocalhost ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
[rootlocalhost ~]# nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.100/24
[rootlocalhost ~]# reboot
为192.168.88.10和192.168.99.100配置网关
[rootclient1 ~]# nmcli connection modify System eth0 ipv4.gateway 192.168.88.11
[rootclient1 ~]# nmcli connection down System eth0; nmcli connection up System eth0 [rootserver1 ~]# nmcli connection modify eth1 ipv4.gateway 192.168.99.11
[rootserver1 ~]# nmcli connection down eth1; nmcli connection up eth1 # 在中间节点node1上打开路由转发功能
[rootnode1 ~]# sysctl -a | grep ip_forward
[rootnode1 ~]# echo net.ipv4.ip_forward 1 /etc/sysctl.conf
[rootnode1 ~]# sysctl -p # client和server已经可以通信
[rootclient1 ~]# ping -c2 192.168.99.100
在server1上安装httpd服务
[rootserver1 ~]# yum install -y httpd
[rootserver1 ~]# systemctl start httpd # 在客户端访问web服务可以访问
[rootclient1 ~]# curl http://192.168.99.100/
配置FORWARD链 要求在node1上配置防火墙保护server1 默认拒绝所有数据包通过从server1所在网段发往client1所在网段的包全部允许从client1所在网段到server1所在网段允许icmp允许22、80、443端口通过
# 默认拒绝所有数据包通过此时client1和server1完全不通
[rootnode1 ~]# iptables -P FORWARD DROP # 源地址是192.168.99.0/24目标地址是192.168.88.0/24的包放行
[rootnode1 ~]# iptables -A FORWARD -s 192.168.99.0/24 -d 192.168.88.0/24 -j ACCEPT # 从client1到server1允许icmp
[rootnode1 ~]# iptables -A FORWARD -s 192.168.88.0/24 -d 192.168.99.0/24 -p icmp -j ACCEPT # client1和server1已经可以ping通了
[rootclient1 ~]# ping -c2 192.168.99.100 # 允许从client1访问server1的22、80、443100-120端口范围
# -m是引入扩展模块multiport多端口
[rootnode1 ~]# iptables -A FORWARD -p tcp -m multiport --dport 22,80,443,100:120 -s 192.168.88.0/24 -j ACCEPT # 现在从client1到server1的ssh、http都可以放行了
[rootclient1 ~]# ssh 192.168.99.100
[rootclient1 ~]# curl http://192.168.99.100/# 拒绝192.168.88.10-192.168.88.20访问192.168.99.50-192.168.99.150
# -m是引入扩展模块src-range是源地址范围dst-range目标地址范围
[rootnode1 ~]# iptables -I FORWARD -m iprange --src-range 192.168.88.10-192.168.88.20 --dst-range 192.168.99.50-192.168.99.150 -j REJECT
NAT NAT网络地址翻译、网络地址转换 NAT技术产生主要是解决IPV4地址不够用。 NAT一般用于将私有地址转成全球唯一的公有地址。 私有地址 A类10.x.x.xB类172.16.x.x-172.31.x.xC类192.168.x.x 私有地址如果需要访问互联网中的公有地址进行上网可以通过NAT技术将私有地址转成公有地址再访问外界。
配置SNAT
现在的实验环境client1可以访问server1server1看到的是客户端地址是client1的地址。
# 跟踪httpd日志的尾部
[rootserver1 ~]# tail -f /var/log/httpd/access_log # 在client上访问server1的web服务
[rootclient1 ~]# curl http://192.168.99.100/ # 查看服务器终端的日志将会显示client1的地址192.168.88.10访问了它
192.168.88.10 - - [13/Oct/2021:17:31:35 0800] GET / HTTP/1.1 403 4897 - curl/7.29.0
互联网环境下运营商不允许私有地址出现在互联网上发现有这样的数据就直接丢弃。所以私有地址发往互联网时需要用NAT转换成公有地址也叫合法地址。在我们的练习环境下在node1上配置NAT当client1访问server1时将client1的地址转换成server1的192.168.99.x再发给server1。因为数据包的源地址改变了所以叫SNATS即Source。
# 向nat表中的POSTROUTING链添加规则。将源地址192.168.88.0/24转换成它外网卡地址。
[rootnode1 ~]# iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE
[rootnode1 ~]# iptables -t nat -nL # client1再次访问server1时server1上的日志将会显示node1的192.168.99.11访问
[rootserver1 ~]# tail -f /var/log/httpd/access_log
192.168.99.11 - - [13/Oct/2021:17:45:07 0800] GET / HTTP/1.1 403 4897 - curl/7.29.0