引言

从Cent7以后,iptables服务的启动脚本已被忽略。请使用firewalld来取代iptables服务。

在RHEL7里,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables。
firewalld是iptables的前端控制器,用于实现持久的网络流量规则。它提供命令行和图形界面。

firewalld 与 iptables的比较:

  • firewalld可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接。而iptables,在修改了规则后必须得全部刷新才可以生效;
  • firewalld使用区域和服务而不是链式规则;
  • firewalld默认是拒绝的,需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制;
  • firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现。也就是说,firewalld和iptables一样,它们的作用都用于维护规则,而真正使用规则干活的是内核的netfilter。只不过firewalld和iptables的结果以及使用方法不一样!

firewalld是iptables的一个封装,可以让你更容易地管理iptables规则。它并不是iptables的替代品,虽然iptables命令仍可用于firewalld,但建议firewalld时仅使用firewalld命令。

一、 安装

1.1 关闭 firewalld

systemctr disable firewalld
systemctl stop firewalld

1.2 安装 iptalbes

yum install iptables iptables-services

1.3 启用 iptables

systemctl enable iptables
systemctl start iptables

1.4 备份 iptables

cp /etc/sysconfig/iptables /etc/sysconfig/iptables-backup

二、 相关实例

2.1 查看当前规则

iptables -L -n -v --line-number

2.2 和详细内容(包含流量统计)

iptables -nvL --line-number

2.3 放行某个端口

iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

2.4 允许某网段访问特定端口

iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT

2.5 删除某条规则

iptables -D INPUT 1
iptables -D FORWARD 1

2.6 指定某段ip地址

iptables -I INPUT -p tcp --dport 80 -j DROP
iptables - I INPUT -m iprange --src-range 192.168.1.200-192.168.1-210 -p tcp --dport 80 -j ACCEPT

2.7 修改某条规则

iptables -R INPUT 5 -p tcp --dport 36878 -j ACCEPT

2.8 设置默认策略

iptables -P INPUT DROP
iptables -P NAT REJECT
iptables -P OUTPUT ACCEPT

保存更改

iptables-save

iptables-save > /etc/sysconfig/iptables

iptables-save > /etc/iptables/rule.v4

暂时更新到这….
2022/2/17

三、 nat转发

3.1 端口转发

192.168.1.7:7410 —> 192.168.1.160:9200
iptables -t nat -A PREROUTING -d 192.168.1.7/32 -p tcp --dport 7410 -j DNAT --to-destination 192.168.1.160:9200
iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp --dport 9200 -j SNAT --to-source 192.168.1.7

3.2 删除nat中的规则

iptables -t nat -D POSTROUTING 6
iptables -t nat -D PREROUTING 1

四、 iptables自定义链

4.1 创建一条自定义链

iptables -t filter -N es_white_list

4.2 自定义链的规则

iptables -I es_white_list -j DROP
iptables -I es_white_list -s 172.22.67.31/32 -j ACCEPT
iptables -I es_white_list -s 172.22.67.32/32 -j ACCEPT

4.3 将自定义链的规则应用到某个端口

iptables -I INPUT -p tcp --dport 9200 -j es_white_list
iptables -I INPUT -p tcp --dport 9300 -j es_white_list

4.1 + 4.2 + 4.3 –> 创建白名单es_white_list 只有白名单里的ip地址可以访问该主机的9200和9200端口.

五、 iptables删除自定义链

5.1 清空链white_list里的规则

iptables -t filter -F white_list

5.2 删除链white_list

iptables -t filter -X white_list

报错: iptables: Too many links.
原因: 该链仍在被使用, 删除使用该链的规则
image.png

删除引用DOCKER-USER的规则
iptables -t filter -D FORWARD 1
image.png

六、 重置所有规则

使用这些命令刷新和重置 iptables 到默认状态:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
iptables -t security -F
iptables -t security -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
没有任何参数的 -F 命令在当前表中刷新所有链。同样的, -X 命令删除表中所有非默认链。

七、 初始状态

适用于CentOS 7
# 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

firewalld 转发

注意: 本地转发本地使用ip不要使用127.0.0.1或者localhost

本机 1634–>443 为例

firewall-cmd --permanent --add-forward-port=port=1634:proto=tcp:toport=443:toaddr=10.10.20.155
firewall-cmd --permanent --add-forward-port=port=1634:proto=tcp:toport=443:toaddr=127.0.0.1

Ubuntu/Debian中的iptables

在Debian/Ubuntu中使用iptables添加了规则, 即使使用iptables-save保存了规则也会在系统重启后失效.
或者使用iptables-save保存到文件, 然后系统重启后执行iptables-restore恢复规则.

iptables-persistent 应运而生, 更好的iptables持久化方案.

安装之后其配置文件如下: /etc/iptables/rules.v4 /etc/iptables/rules.v6
区别于CentOS中的 /etc/sysconfig/iptables
Debian/Ubuntu下清空/etc/iptables/rules.v4文件内容, 不会影响已有规则, 甚至systemctl stop iptables也不会影响
CentOS下清空 /etc/sysconfig/iptables 或者systemctl stop iptables相当于关闭防火墙

image.png

0、Env

Environment :

  • CentOS Linux release 7.9.2009 (Core)
  • Client: Docker Engine - Community Version: 20.10.5
  • Server: Docker Engine - Community Version: 20.10.5

Installation (text-based installer)

1、Download docker-ce.repo

wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

2、Change sources to TUNA

sed -i 's+https://download.docker.com+https://mirror.nju.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

3、Installating

yum makecache fast
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4、Start service

systemctl start docker

5、Verify

docker --version

6、e.g

docker run hello-world

If you’ve seen such this whitch means the docker have succeed run on you system.
image.png

7、Some improvements

change source
vim /etc/docker/daemon.json
touch it if there was not such file

{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}

名词解释:

高可用: High Availability (HA)
负载均衡: Load Balance (LB)
服务器负载均衡: Server Load Balancing (SLB)

区别: 高可用性:顾名思义,尽可能采取措施减少系统服务中断时间,进而提高业务程序持续对外提供服务的能力。 负载均衡:将高并发的请求数据分发到不同的集群结点,尽量平衡系统所有资源的压力,从而提升整个集群对于请求的处理能力

环境说明:

主机A 192.168.128.8 nginx + keepalived
主机B 192.168.128.9 nginx + keepalived

通过keepalived配置nginx高可用, keepalived配置nginx对外虚拟地址为 192.168.128.10

软件安装

主机A: yum install keepalived nginx
主机B: yum install keepalived nginx

主机A配置

  1. keepalived 配置

/etc/keepalived/keepalived.conf

vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" # 检测nginx状态的脚本路径
interval 2 # 检测时间间隔2s
weight -20 # 如果脚本的条件成立,权重-20
}

vrrp_instance VI_1 {
state MASTER # 服务状态;MASTER(工作状态)BACKUP(备用状态)
interface ens33 # VIP绑定网卡
virtual_router_id 51 # 虚拟路由ID,主、备节点必须一致
mcast_src_ip 192.168.128.8 # 本机IP
nopreempt # 优先级高的设置,解决异常回复后再次抢占的问题
priority 90 # 优先级;取值范围:0~254;MASTER > BACKUP
advert_int 1 # 组播信息发送间隔,主、备节点必须一致,默认1s
authentication { # 验证信息;主、备节点必须一致
auth_type PASS # VRRP验证类型,PASS、AH两种
auth_pass 1111 # VRRP验证密码,在同一个vrrp_instance下,主、从必须使用相同的密码才能正常通信
}
track_script { # 将track_script块加入instance配置块
chk_nginx # 执行Nginx监控的服务
}
virtual_ipaddress { #虚拟IP池,主、备节点必须一致,可以定义多个VIP
192.168.128.10 # 虚拟IP
}
}
  1. nginx 脚本配置

vim /etc/keepalived/nginx_check.sh
chmod +x /etc/keepalived/nginx_check.sh

#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then
#echo 1
systemctl start nginx
sleep 5

if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then
systemctl stop keepalived
#echo 2
fi
fi

主机B配置

  1. keepalived 配置
    和主机A的配置除了本机ip, 优先级不同, 其他均相同配置

/etc/keepalived/keepalived.conf

vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" # 检测nginx状态的脚本路径
interval 2 # 检测时间间隔2s
weight -20 # 如果脚本的条件成立,权重-20
}

vrrp_instance VI_1 {
state MASTER # 服务状态;MASTER(工作状态)BACKUP(备用状态)
interface ens33 # VIP绑定网卡
virtual_router_id 51 # 虚拟路由ID,主、备节点必须一致
mcast_src_ip 192.168.128.9 # 本机IP
nopreempt # 优先级高的设置,解决异常回复后再次抢占的问题
priority 100 # 优先级;取值范围:0~254;MASTER > BACKUP
advert_int 1 # 组播信息发送间隔,主、备节点必须一致,默认1s
authentication { # 验证信息;主、备节点必须一致
auth_type PASS # VRRP验证类型,PASS、AH两种
auth_pass 1111 # VRRP验证密码,在同一个vrrp_instance下,主、从必须使用相同的密码才能正常通信
}
track_script { # 将track_script块加入instance配置块
chk_nginx # 执行Nginx监控的服务
}
virtual_ipaddress { #虚拟IP池,主、备节点必须一致,可以定义多个VIP
192.168.128.10 # 虚拟IP
}
}
  1. nginx 脚本配置
    和主机A的配置一样哦

vim /etc/keepalived/nginx_check.sh
chmod +x /etc/keepalived/nginx_check.sh

#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then
#echo 1
systemctl start nginx
sleep 5

if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ];then
systemctl stop keepalived
#echo 2
fi
fi

配置启动

主机A和主机B配置 keppalived 和 nginx 自启
systemctl enable nginx
systemctl enable keepalived
systemctl start nginx
systemctl start nginx

这个时候A和B的nginx就是一个主从关系. 只要其中一个nginx正常就可以通过keepalived虚拟的192.168.128.10 正常访问到nginx