目录html
使用firewalld
对防火墙进行管理。firewalld
是Red Hat Enterprise Linux 7
用于管理主机级别防火墙的默认方法。bash
注:firewalld.service
与 iptables.service
、ip6tables.service
、ebtables.service
服务彼此冲突,因此为了防止意外启动其中一个,能够把他们mask
掉服务器
systemctl mask iptables
markdown
systemctl mask ip6tables
网络
systemctl mask ebtables
负载均衡
firewalld
区域zone
firewalld
将传入的流量划分红不一样的区域zone
,不一样的zone能够配置不一样的规则。ssh
zone
的规则在起做用?`按照以下的规则匹配,优先级依次下降` 1. 若是传入包的原地址与区域中某个原规则设置相匹配,该包将经过该`zone`路由 2. 若是包的传入的接口与`zone`的过滤器设置匹配,该包将经过该`zone`路由 3. 若是都没匹配的话会使用默认的`zone`,默认安装时的默认`zone`是`public`能够更改
firewalld
区域的默认配置# trusted 容许全部流量传入 # home 除非与传出流量相关,或与ssh\mdns\ipp-client\samba-client\dhcpv6-client预约义服务匹配不然拒绝传入流量 # internal 开始时与`home`配置相同 # work 除非与传出流量相关,或与ssh\ipp-client\dhcpv6-client预约义服务匹配不然拒绝传入流量 # public 除非与传出流量相关,或与ssh\dhcpv6-client预约义服务匹配不然拒绝传入流量
firewalld
1. 使用命令行工具`firewalld-cmd`。须要安装推行界面 2. 使用图形工具`firewall-config` 3. 直接更改`/etc/firewalld`配置文件。不建议。
firewall-cmd
命令介绍命令 | 说明 |
---|---|
--get-default-zone | 查询当前默认区域 |
--set-default-zone= | 设置默认区域 |
--get-zones | 列出全部可用区域 |
--get-services | 列出全部预约义服务 |
--get-active-zones | 列出当前正在使用的全部区域 |
--add-source=
|
未来自IP地址或网络、子网掩码的全部流量指定到区域 |
--remove-source | 删除 |
--add-interface | 未来自
|
--change-interface | 修改 |
--list-all --zone=
|
列出全部配置默认zone 可指定 |
--list-all-zones | 列出全部的zone的配置 |
--add-service | 容许某个service的流量 |
--remove-service | 删除 |
--add-port | 增长端口。格式[222/tcp] |
--remove-port | 删除 |
--reload | 从新加载防御墙配置 |
--permanent | 永久修改防御墙配置 |
修改防火墙配置必定要有两步临时修改
与永久修改
curl
1. 永久修改一次临时修改一次 firewall-cmd --set-default-zone firewall-cmd --set-default-zone trusted --permanent 2. 永久修改一次,reload一下 firewall-cmd --set-fefault-zone trusted --permanent
富规则为管理员提供了一种表达性的语言,来定义防火墙自身带有以外的规则。例如:容许单IP地址
。富规则能够表达容许、拒绝
规则,也能够配置记录
、端口转发
、假装
、速率限制
等。tcp
firewalld
操做富规则的命令1. --add-rich-rule 2. --remove-rich-rule 3. --query-rich-rul 4. --list-rich-rules
可查看 man 5 firewalld.richlanguage
工具
General rule structure rule [source] [destination] service|port|protocol|icmp-block|masquerade|forward-port [log] [audit] [accept|reject|drop]
1. rule: rule [family="ipv4|ipv6"] 2. [source] 可选,连接的来源ip source address="ip/mask" 3. [Destination]可选,目的 destination address="ip/mask" 4. service|port|protocol|icmp-block|masquerade|forward-port 必选服务、端口、协议、假装、端口转发 5. [log] 可选, 记录进来的连接[prefix=前缀[level=级别limit value=rate/duration频次每duration最多rate次 6. [audit] 7. [accept|reject|drop] 接受、拒绝、丢弃
httpd
,并输出logfirewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.143.11/24 service name="http" log level=notice prefix="Test log" limit value="1/s" accept' firewall-cmd --reload # 在服务器192.168.143.11上 curl 192.168.143.10 [root@rhel2 ~]# curl 192.168.143.10 # 检测192.168.143.10 /var/log/messages [root@rhel1 Desktop]# grep "Test log" /var/log/messages Nov 25 19:22:20 rhel1 kernel: Test logIN=eno16777736 OUT= MAC=00:0c:29:fb:7d:19:00:0c:29:10:6a:95:08:00 SRC=192.168.143.11 DST=192.168.143.10 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28126 DF PROTO=TCP SPT=35439 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0
ip
访问10的http服务# 删除刚才的富规则,添加以下规则、 firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.143.11/24 service name="http" reject' firewall-cmd --reload # 再经过11服务器访问 [root@rhel2 ~]# curl 192.168.143.10 curl: (7) Failed connect to 192.168.143.10:80; Connection refused
IP
假装,将内部IP假装成某个IP发送出去# 将局域网中的 IP `192.168.143.10[RHEL1]` 假装成`192.168.245.11[RHEL2]`发送出去 firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=192.168.143.12/24 masquerade" firewall-cmd --reload # 咱们在rhel1上 ssh到 192.168.245.10[RHEL3]这个ip上 # 咱们在RHEL3上对 ssh服务作了log [root@rhel3 ~]# grep "SSH" /var/log/messages Nov 25 19:05:05 rhel3 kernel: SSH LOG:IN=eno50332216 OUT= MAC=00:0c:29:07:88:32:00:0c:29:10:6a:a9:08:00 SRC=192.168.245.11 DST=192.168.245.10 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=63405 DF PROTO=TCP SPT=46855 DPT=22 WINDOW=14600 RES=0x00 SYN URGP=0 # 能够看到SRC是 192.168.245.11
# 在RHEL2上提供httpd服务 ## 别忘了防火墙放行 [root@rhel2 html]# curl localhost rhel2 # 在RHEL3 上一样提供httpd服务 ## 别忘了防火墙放行 [root@rhel3 html]# curl localhost rhel3 # 在RHEL2上 开启端口转发 [root@rhel2 ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.245.10 success # 在RHEL1上访问 [root@rhel1 Desktop]# curl 192.168.140.11 rhel3
经过网络合做,以一种逻辑方式将两块网卡绑在一块儿对外服务,实现故障转移与更高的吞吐量。这个逻辑方式就是网络组
RHEL1
上再准备两块网卡[root@rhel1 Desktop]# nmcli device show GENERAL.DEVICE: eno67109440 GENERAL.TYPE: ethernet GENERAL.HWADDR: 00:0C:29:FB:7D:37 GENERAL.MTU: 1500 GENERAL.STATE: 30 (disconnected) GENERAL.CONNECTION: -- GENERAL.CON-PATH: -- WIRED-PROPERTIES.CARRIER: on GENERAL.DEVICE: eno83886664 GENERAL.TYPE: ethernet GENERAL.HWADDR: 00:0C:29:FB:7D:41 GENERAL.MTU: 1500 GENERAL.STATE: 30 (disconnected) GENERAL.CONNECTION: -- GENERAL.CON-PATH: -- WIRED-PROPERTIES.CARRIER: on
team0
# 建立组接口时经过`config`指定 ## 语法 config '{"runner":{"name":"METHOD"}}' ## 类型 broadcast:广播模式,只有冗余机制,有点浪费资源 roundrobin:轮询调度,把请求轮流费赔给内部服务器 activebackup:主备,只有一个内部服务器保持工做,故障转移 loadbalance:负载均衡,监控流量尝试在选择传输端口的时候达到完美均衡 lacp:利用LACP协议进行聚合
# 建立一个主备模式的 网络组 nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}' # 分配IP地址 # ip随便配一个 nmcli connection modify team0 ipv4.addresses "192.168.200.100/24" ipv4.method manual
接口
添加到team0
上nmcli connect add type team-slave con-name team0-port1 ifname eno67109440 master team0 nmcli connect add type team-slave con-name team0-port2 ifname eno83886664 master team0 # 查看当前网络组的状态,能够看到当前工做的是 eno67109440 [root@rhel1 Desktop]# teamdctl team0 state setup: runner: activebackup ports: eno67109440 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up eno83886664 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up runner: active port: eno67109440
# 经过team0 ping本地网关 ping -I team0 0.0.0.0 [root@rhel1 Desktop]# nmcli device disconnect eno67109440 [root@rhel1 Desktop]# teamdctl team0 state setup: runner: activebackup ports: eno83886664 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up runner: active port: eno83886664 # 而另外一边的ping命令没有断
[root@rhel1 .ssh]# cat /etc/sysconfig/network-scripts/ifcfg-team0 DEVICE=team0 TEAM_CONFIG="{\"runner\":{\"name\":\"activebackup\"}}" DEVICETYPE=Team BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no NAME=team0 UUID=5d30ce30-7c39-44ea-b170-04dd21d2a3fd ONBOOT=yes IPADDR0=192.168.200.100 PREFIX0=24 GATEWAY0=192.168.200.1 IPV6_PEERDNS=yes IPV6_PEERROUTES=yes
teamnl teamdctl
网桥是一个链路层设备,可基于MAC地址在网络之间转发流量。
# 再次添加一个网卡 nmcli device show GENERAL.DEVICE: eno100663888 GENERAL.TYPE: ethernet GENERAL.HWADDR: 00:0C:29:FB:7D:4B GENERAL.MTU: 1500 GENERAL.STATE: 30 (disconnected) GENERAL.CONNECTION: -- GENERAL.CON-PATH: -- WIRED-PROPERTIES.CARRIER: on # 增长一个网桥 ## 在建立的时候就指定好 ipv4 后来modify不起做用 nmcli connection add type bridge con-name br0 ifname br0 ip4 192.168.150.100/24 gw4 192.168.150.1 # 添加接口 nmcli connection add type bridge-slave con-name br0-port0 ifname eno100663888 master br0 # 检查是否能ping通本地网关 [root@rhel1 Desktop]# ping -I br0 0.0.0.0