0%

说明

mysql双主模式下,在任意一台mysql上写数据都会同步到另一台上,本章通过keepalived VIP实现如果一台服务挂了会自动切换到另一台mysql上.

配置

# 安装keepalived,centos默认安装了
yum install keepalived -y

修改双主机/etc/keepalived/keepalived.conf配置.

global_defs {
   router_id mysql
}

vrrp_script chk_mysql {
    script "killall -0 mysqld"      // 检测mysql进程是否存活
    interval 2
    timeout 2
    fall 3
}

vrrp_instance mysql {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100                // 另一台权重可以设置90,防止争抢VIP
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.41.140          // 设置虚拟ip
    }
    track_script {
        chk_mysql
    }
}

测试

# 通过命令可以看到VIP已经在一台机器上了,也可以通过虚拟IP连接上mysql
[root@mysql01 mysql]# ip addr sh ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:50:56:26:c2:7e brd ff:ff:ff:ff:ff:ff
    inet 192.168.41.141/24 brd 192.168.41.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.41.140/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe26:c27e/64 scope link 
       valid_lft forever preferred_lft forever
# 关掉mysql服务,命令可能根据你安装方式有区别
service mysql stop

# 再次在两台机器上执行命令,可以看到VIP转移了,可以继续通过VIP连接mysql
ip addr sh ens33

前提准备

主机 系统 IP mysql
mysql01 centos7 192.168.41.141 已部署5.7.31
mysql02 centod7 192.168.41.142 已部署5.7.31

原理

MySQL中有一种日志叫做 bin日志(二进制日志),这个日志会记录下所有修改了数据库的SQL语句。主从复制的原理其实就是从服务器主服务器请求这个日志文件,主服务器会把这个 bin日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。

原理图

  1. 主服务器必须启用二进制日志(log-bin),记录任何修改了数据库数据的事件;
  2. 从服务器开启一个线程(I/O Thread)把自己扮演成 MySQL 的客户端,通过 MySQL 协议,请求主服务器的二进制日志文件中的事件;
  3. 主服务器启动一个线程(Dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主服务器就会从第一个日志文件中的第一个事件一个一个发送给从服务器;
  4. 从服务器接收到主服务器发送过来的数据把它放置到中继日志(relay log)文件中。并记录该次请求到主服务器的具体哪一个二进制日志文件内部的哪一个位置(主服务器中的二进制文件会有多个,其名结尾以6位数递增);
  5. 从服务器启动另外一个线程(SQL Thread),把 relay log 中的事件读取出来,并在本地再执行一次。

双主架构思路

  • 两台mysql都可读写,互为主备
  • 两台主库之间做高可用,可以采用haproxykeepalived等方案

双主配置

主要配置文件/etc/my.cnf

  1. 修改配置
vim /etc/my.cnf

# 添加以下配置
# id 保证唯一
server-id=1
# 开启binlog 日志
log-bin=mysql-bin
# 自增ID保证不冲突, 一主1,3,5 另一主2,4,6
auto-increment-increment=2
auto-increment-offset=1
# 将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
log-slave-updates=true
# 忽略同步的数据库
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=mysql
replicate-ignore-db=sys
# binlog文件大小限制
max_binlog_size=1024M
# binlog格式
binlog-format=ROW

另一台配置

server-id=2
log-bin=mysql-bin
auto-increment-increment=2
auto-increment-offset=2
log-slave-updates=true
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=mysql
replicate-ignore-db=sys
max_binlog_size=1024M
binlog-format=ROW
#binlog_rows_query_log_events=on # 在row 模式的binlog中包含SQL EVENTS(即SQL语句也会保留)
#master-info-repository=TABLE
#relay-log-info-repository=TABLE
#slave-skip-errors=all # 忽略复制产生的错误
#slave-skip-errors=1062,1032,1060 # 跳过已知错误,主键冲突、表已存在等错误代码如1062,1032,1060等
#relay-log-purge = 1    #是否自动清空不再需要中继日志时。默认值为1(启用)
#expire_logs_days = 30  #超过 30 天的 binlog 删除

slave_skip_errors参数说明:

slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors, 默认情况下该参数值是off.
mysql5.6及MySQL Cluster NDB 7.3以及后续版本增加了参数ddl_exist_errors,该参数包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
一些error code代表的错误如下:
    1007:数据库已存在,创建数据库失败
    1008:数据库不存在,删除数据库失败
    1050:数据表已存在,创建数据表失败
    1051:数据表不存在,删除数据表失败
    1054:字段不存在,或程序文件跟数据库有冲突
    1060:字段重复,导致无法插入
    1061:重复键名
    1068:定义了多个主键
    1094:位置线程ID
    1146:数据表缺失,请恢复数据库
    1053:复制过程中主服务器宕机
    1062:主键冲突 Duplicate entry '%s' for key %d
  1. 重启mysql
# 根据安装方式选择
service mysql restart
  1. 添加主从同步账户
-- mysql01
grant replication slave on *.* to 'slave'@'192.168.41.142' identified by '123456';
flush privileges;

-- mysql02
grant replication slave on *.* to 'slave'@'192.168.41.141' identified by '123456';
flush privileges;
  1. 查看主库状态
-- 分别在mysql01,mysql02查看, 这里由于都是新安装的,status完全一样,实际可能不一样
-- 记住file的名字和position的值,因为主从同步,从数据库是通过读取主数据库的日志文件来完成同步的,所以需要文件名字和日志的当前位置
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      604 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  1. 配置同步信息
-- mysql01
change master to master_host='192.168.41.142',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=604;

start slave;

-- mysql02
change master to master_host='192.168.41.141',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=604;

start slave;
  1. 查看同步状态
-- 分别在mysql01,mysql02查看同步状态
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.41.141
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 604
               Relay_Log_File: mysql02-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes      -- 状态正常
            Slave_SQL_Running: Yes      -- 状态正常
  1. 测试
-- 随便在 mysql01 或 mysql02 上创建库、表或者数据都能同步到另一台机器上
create database test;

CREATE TABLE `t_type` (
                            `type_id` INT(2) NOT NULL AUTO_INCREMENT COMMENT '资源类型id',
                            `type_name` VARCHAR(32) NOT NULL COMMENT '资源类型名称',
                            `type_remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
                            `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                            `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                            PRIMARY KEY (`type_id`),
                            UNIQUE KEY (type_name)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into t_type(type_name, type_remark) VALUES ('菜单资源','用于确定页面菜单资源,分多级菜单');
insert into t_type(type_name, type_remark) VALUES ('按钮资源','用于确定页面按钮资源');
insert into t_type(type_name, type_remark) VALUES ('路由资源','用于确定网关路由资源');
  1. 开启MySQL5.6之后引入的GTID复制功能
vim /etc/my.cnf
# 增加以下配置,开启gtid
gtid-mode=on
enforce-gtid-consistency=on
# 修改完my.cnf需要重启mysql才能生效
-- mysql01,mysql02分别执行以下命令
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> change master to MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

GTID又叫全局事务IDGlobal Transaction ID),是一个已提交事务的编号,并且是一个全局唯一的编号。MySQL5.6版本之后在主从复制类型上新增了GTID复制

双主配置之前数据备份

使用mysqldump命令,MySQL操作mysqldump命令详解

-- 导出主数据库的数据
mysqldump -uroot -p --opt --all-databases >/all_databases.sql

-- 导入数据
mysql -u root -p  < /all_databases.sql

-- 或者使用source导入
-- mysql> source /all_databases.sql;

部署说明

Linux上安装软件常见的几种方式:

  • 源码编译
  • 压缩包解压(一般为tar.gz
  • 编译好的安装包(RPMDPKG等)
  • 在线安装(YUMAPT等)

部署方式简单程度:YUM > RPM > tar.gz > 源码,本文介绍RPM方式.

部署步骤

  1. 删除旧包
# 查找
rpm -qa | grep -i mysql
# 删除
rpm -ev mysql-libs-* --nodeps
  1. 下载RPMmysql-5.7.31-1.el7.x86_64.rpm-bundle.tar

    由于国外资源下载缓慢,可以使用华为开源镜像

  2. 解压压缩包

[root@mysql03 ~]# tar -xvf mysql-5.7.31-1.el7.x86_64.rpm-bundle.tar 
mysql-community-embedded-devel-5.7.31-1.el7.x86_64.rpm
mysql-community-libs-5.7.31-1.el7.x86_64.rpm
mysql-community-client-5.7.31-1.el7.x86_64.rpm
mysql-community-server-5.7.31-1.el7.x86_64.rpm
mysql-community-embedded-5.7.31-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.31-1.el7.x86_64.rpm
mysql-community-common-5.7.31-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.31-1.el7.x86_64.rpm
mysql-community-devel-5.7.31-1.el7.x86_64.rpm
mysql-community-test-5.7.31-1.el7.x86_64.rpm
  1. 安装
    只需要安装以下四个
mysql-community-libs-5.7.31-1.el7.x86_64.rpm
mysql-community-client-5.7.31-1.el7.x86_64.rpm
mysql-community-server-5.7.31-1.el7.x86_64.rpm
mysql-community-common-5.7.31-1.el7.x86_64.rpm

四个包有依赖关系。安装有先后顺序要求。

shell> rpm -ivh mysql-community-common-5.7.31-1.el7.x86_64.rpm
shell> rpm -ivh mysql-community-libs-5.7.31-1.el7.x86_64.rpm
shell> rpm -ivh mysql-community-client-5.7.31-1.el7.x86_64.rpm
shell> rpm -ivh mysql-community-server-5.7.31-1.el7.x86_64.rpm

更简单的安装命令

# 这样,包之间会自动处理依赖和先后顺序
yum install mysql-community-{server,client,common,libs}-*

注意上面命令要求在解压后的目录里执行,不然yum找不到包就会到公网下载,速度非常慢.

  1. 启动服务
service mysqld start
service mysqld stop
service mysqld status
  1. 登录修改默认密码
# 获取root用户临时密码
cat /var/log/mysqld.log | more

# mysqld.log 临时密码
2020-07-28T01:23:53.588166Z 1 [Note] A temporary password is generated for root@localhost: dDO>*a4!uA+o

# 登录, 使用初始化生成的临时密码登录
mysql -u root -p

# 修改密码
set password for root@localhost = password('123456');

# 开放远程连接
use mysql;
update user set user.Host='%' where user.User='root';
flush privileges;

修改密码时会报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,意思是密码强度不符合要求.
可以修改/etc/my.cnf, 添加validate_password=OFF, 关闭密码强度校验, 然后重启service mysqld restart.

mysql安装RPM方式比tar.gz方式简单不少.

参考链接

部署说明

Linux上安装软件常见的几种方式:

  • 源码编译
  • 压缩包解压(一般为tar.gz
  • 编译好的安装包(RPMDPKG等)
  • 在线安装(YUMAPT等)

部署方式简单程度:YUM > RPM > tar.gz > 源码,本文介绍tar.gz方式.

部署步骤

  1. 卸载已有
# 通过rpm方式安装的
rpm -qa|grep mysql
# 如果有, 卸载
rpm -e --nodeps xxx

# 查找mysql文件夹
whereis mysql
find / -name mysql
  1. 下载tar.gz文件, mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz

    由于国外资源下载缓慢,可以使用华为开源镜像

  2. 安装依赖包

yum -y install make gcc-c++ cmake bison-devel ncurses-devel numactl libaio
  1. 创建系统用户和组
# 创建组
groupadd mysql
# 创建不需要登录的系统账号,启动MySQL服务时会使用该账号
useradd -s /sbin/nologin -g mysql -M mysql
# useradd -r -g mysql -s /bin/false mysql
# useradd -r -g mysql mysql
  1. 解压到/usr/local/
# 解压
tar -zxvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz

# 重命名
mv mysql-5.7.31-linux-glibc2.12-x86_64 mysql

# 移动到/usr/local/下
mv mysql /usr/local/

# mysql目录下创建data文件夹
cd /usr/local/mysql/
mkdir data

# 设置权限
chown -R mysql:mysql /usr/local/mysql
chmod -R 755 /usr/local/mysql
  1. 初始化
# 注意打印日志最后返回的root用户临时密码,登录时用到
bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

# 初始化日志
2020-07-27T07:13:42.627407Z 1 [Note] A temporary password is generated for root@localhost: 4Mt4Zka<6j)&
  1. 编辑配置文件/etc/my.cnf
# 如果有这个文件,先清空
[root@localhost bin]#  vi /etc/my.cnf

[mysqld]
datadir=/usr/local/mysql/data
port=3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=600
innodb_file_per_table=1
lower_case_table_names=1
  1. 启动
/usr/local/mysql/support-files/mysql.server start
  1. 添加软链接
ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
# 重启mysql: service mysqld start|stop|restart|status
service mysql restart

# 添加环境变量,可选
echo "PATH=$PATH:/usr/local/mysql/bin  " >> /etc/profile  
source /etc/profile
  1. 设置开机启动
# 将服务文件拷贝到init.d下,并重命名为mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# 赋予可执行权限
chmod +x /etc/init.d/mysqld
# 添加服务
chkconfig --add mysqld
# 显示服务列表
chkconfig --list
  1. 登录并修改root密码
-- 使用初始化生成的临时密码登录
mysql -u root -p

-- 修改密码
set password for root@localhost = password('123456');
--  ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

-- 开放远程连接
use mysql;
update user set user.Host='%' where user.User='root';
flush privileges;

参考链接

ladp简介

LDAP轻量目录访问协议,英文全称是LIGHTWEIGHT DIRECTORY ACCESS PROTOCOL,一般都简称为LDAP.

特点

  • 读写效率非常高

对读操作进行优化的一种数据库,在读写比例大于7比1的情况下,LDAP会体现出极高的性能。这个特性正适合了身份认证的需要。

  • 开放的标准协议

不同于SQL数据库,LDAP的客户端是跨平台的,并且对几乎所有的程序语言都有标准的API接口。即使是改变了LDAP数据库产品的提供厂商,开发人员也不用担心需要修改程序才能适应新的数据库产品。这个优势是使用SQL语言进行查询的关系型数据库难以达到的。

  • 强认证方式

可以达到很高的安全级别。在国际化方面,LDAP使用了UTF-8编码来存储各种语言的字符。

  • OpenLDAP开源实现

OpenLDAP是其中最轻便且消耗系统资源最少的一个。OpenLDAP是开源软件,近年国内很多公司开发的LDAP产品都是基于OpenLDAP开发的。

  • 灵活添加数据类型

LDAP是根据schema的内容定义各种属性之间的从属关系及匹配模式的。例如在关系型数据库中如果要为用户增加一个属性,就要在用户表中增加一个字段,在拥有庞大数量用户的情况下是十分困难的,需要改变表结构。但LDAP只需要在schema中加入新的属性,不会由于用户的属性增多而影响查询性能

  • 数据存储是树结构

整棵树的任何一个分支都可以单独放在一个服务器中进行分布式管理,不仅有利于做服务器的负载均衡,还方便了跨地域的服务器部署。这个优势在查询负载大或企业在不同地域都设有分公司的时候体现尤为明显

  • 总结
    • LDAP 是一种网络协议而不是数据库,而且LDAP的目录不是关系型的,没有RDBMS那么复杂,
    • LDAP不支持数据库的Transaction机制,纯粹的无状态、请求-响应的工作模式。
    • LDAP不能存储BLOB,LDAP的读写操作是非对称的,读非常方便,写比较麻烦,
    • LDAP支持复杂的查询过滤器(filter),可以完成很多类似数据库的查询功能。
    • LDAP使用树状结构,接近于公司组织结构、文件目录结构、域名结构等我们耳熟能详的东东。
    • LDAP使用简单、接口标准,并支持SSL访问。

ldap应用场景

  1. 网络服务:DNS服务
  2. 统一认证服务:Linux PAM (ssh, login, cvs. . . )
  3. Apache访问控制
  4. 各种服务登录(ftpd, php based, perl based, python based. . . )
  5. 个人信息类,如地址簿
  6. 服务器信息,如帐号管理、邮件服务等

route命令

route命令用来显示并设置Linux内核中的网络路由表route命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。

在Linux系统中设置路由通常是为了解决以下问题:

  • 该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的ip地址设置为Linux机器的默认路由。
  • 直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了
  • 可以在/etc/rc.local中添加route命令来保证该路由设置永久有效,这个方法只能在重启电脑的时候生效,重启网络不生效;
  • 推荐在/etc/sysconfig/static-routes编写路由,重启网络或服务器都能生效;
# vim /etc/sysconfig/static-routes
# 这个文件默认不存在
any net 192.168.11.0 gw 192.168.21.1 netmask 255.255.255.0 metric 1 dev eth0

注意,如果本机安装了docker,添加路由后重启网络,会导致docker服务启动添加的路由失效,导致docker服务调用失败,创建新的docker服务会报以下错误,重启docker服务可以解决。systemctl restart docker

[root@localhost ~]# docker run -d -p 9000:80 centos:httpd /bin/sh -c /usr/local/bin/start.sh
d5b2bd5a7bc4895a973fe61efd051847047d26385f65c278aaa09e4fa31c4d76
docker: Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen (6bda693d1143657e46bee0300276aa05820da2b21a3d89441e820d1a274c48b6): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9000 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).

route语法

# 设置和查看路由表都可以用 route 命令,设置内核路由表的命令格式是:
route  [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
  1. 方法
方法 说明
add 增加指定的路由记录;
del 删除指定的路由记录;
target 目的网络或目的主机;
gw 设置默认网关;
mss 设置TCP的最大区块长度(MSS),单位MB;
netmask 目的地址的网络掩码
window 指定通过路由表的TCP连接的TCP窗口大小;
dev 路由记录所表示的网络接口。
  1. 选项
选项 说明
-A 设置地址类型;
-C 打印将Linux核心的路由缓存;
-v 详细信息模式;
-n 不执行DNS反向查找,直接显示数字形式的IP地址;
-e netstat格式显示路由表;
-net 到一个网络的路由表;
-host 到一个主机的路由表。
  1. Flags标志说明
flag 说明
U Up表示此路由当前为启动状态。
H Host,表示此网关为一主机。
G Gateway,表示此网关为一路由器。
R Reinstate Route,使用动态路由重新初始化的路由。
D Dynamically,此路由是动态性地写入。
M Modified,此路由是由路由守护程序或导向器动态修改。
! 表示此路由当前为关闭状态。
  1. route命令输出说明
输出列 说明
Destination 目标网段或者主机
Gateway 网关地址,*表示目标是本主机所属的网络,不需要路由
Genmask 网络掩码
Flags 标记。
Metric 路由距离,到达指定网络所需的中转数
Ref 路由项引用次数
Use 此路由项被路由软件查找的次数
Iface 该路由表项对应的输出接口

示例

# 显示当前路由
[root@node1 ~]# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 ens33
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-caa257c6f76d
192.168.41.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@node1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.41.2    0.0.0.0         UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-caa257c6f76d
192.168.41.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
# 增加一条到达244.0.0.0的路由。
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

# 添加到主机的路由
route add -host 192.168.1.2 dev eth0
# 添加到10.20.30.148的网关
route add -host 10.20.30.148 gw 10.20.30.40
# 添加10.20.30.40的网络
route add -net 10.20.30.40 netmask 255.255.255.248 eth0
# 网络掩码 255.255.255.0简写
route add -net 192.168.1.0/24 eth1
# 增加一条屏蔽的路由,目的地址为224.x.x.x将被拒绝。
route add -net 224.0.0.0 netmask 240.0.0.0 reject
# 删除路由记录
route del -net 224.0.0.0 netmask 240.0.0.0
route del -net 224.0.0.0 netmask 240.0.0.0 reject
# 删除和添加设置默认网关
route del default gw 192.168.120.240
route add default gw 192.168.120.240

设置包转发

CentOS 中默认的内核配置已经包含了路由功能,但默认并没有在系统启动时启用此功能。开启 Linux 的路由功能可以通过调整内核的网络参数来实现。要配置和调整内核参数可以使用 sysctl 命令。例如:要开启 Linux 内核的数据包转发功能可以使用如下的命令。

sysctl -w net.ipv4.ip_forward=1

这样设置之后,当前系统就能实现包转发,但下次启动计算机时将失效。为了使在下次启动计算机时仍然有效,需要将下面的行写入配置文件/etc/sysctl.conf

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 或者 使用下面的命令
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
# 使上面配置生效
sysctl -p 

用户还可以使用如下的命令查看当前系统是否支持包转发。

sysctl net.ipv4.ip_forward

# 或者下面命令 输出1 证明已生效
cat /proc/sys/net/ipv4/ip_forward

iptables SNAT/DNAT服务

  • SNAT : source network address translation, 修改网络包源IP
  • DNAT : destination network address translation, 修改网络包目的IP
  • 修改源IP目的是这个包还能返回到自己这里,在iptables中,SNAT是在出口POSTROUTING链中发挥作用
  • 修改目的IP目的是这个包能够发送出去,让包传递下去,在iptables中,DNAT是在入口PREROUTING链中发挥作用,以便让包进入FORWARD表.

iptables SNAT/DNAT服务使用场景

  • 云上虚拟机作为客户端访问外网服务器, SNAT类似于代理的作用, 客户端通过SNAT服务可以访问外网.
  • 云上虚拟机作为服务端为外网提供服务, DNAT类似于反向代理, 外网请求通过DNAT服务可以将包传到内网服务端.

SNAT/DNAT

lsmod|grep ^ip #查看nat模块
# 载入:modprobe iptable-nat
# 开启上网命令
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 192.168.1.202
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 192.168.1.202

# 确认查看
iptables -t nat -nL