Firewalld规则介绍及使用方法说明

Firewalld即Dynamic Firewall Manager of Linux systems,linux系统的动态防火墙管理器。Firewalld是一个服务,用于配置网络连接,从而哪些内外部网络的数据包可以允许穿过网络或阻止穿过网络。

区域规则

  • drop(丢弃)
    任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。

  • block(限制)
    任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。

  • public(公共)
    在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。

  • external(外部)
    特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。

  • dmz(非军事区)
    用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。

  • work(工作)
    用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。

  • home(家庭)
    用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。

  • internal(内部)
    用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。

  • trusted(信任)
    可接受所有的网络连接。
    指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时,firewalld 里的默认区域被设定为公共区域。

使用方法

查看当前的区域

firewall-cmd --get-default-zone

查询eth1网卡区域

firewall-cmd --get-zone-of-interface=eth1

查询public中相关服务是否被允许

firewall-cmd --zone=public --query-service=ssh
firewall-cmd --zone=public --query-service=http

列出所有支持的 service

firewall-cmd --get-services

查看当前zone加载的 service

firewall-cmd --list-services

让配置文件立即生效

firewall-cmd --reload

允许https服务流量通过public

firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

允许80端口通过public

firewall-cmd --permanent --zone=public --add-port=80/tcp 
firewall-cmd --reload

修改eth1网卡区域为external

firewall-cmd --permanent --zone=external --change-interface=eth1
firewall-cmd --reload

拒绝172.27.10.0/22网络用户访问ssh

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="172.27.10.0/22" service name="ssh" reject"

重读防火墙

并不中断用户连接,即不丢失状态信息:

firewall-cmd --reload

中断用户连接,丢弃状态信息:

firewall-cmd --complete-reload

注意:通常在防火墙出现严重问题时,这个命令才会被使用。如防火墙规则正确,但态信息不正确和无法建立连接等。

设置默认区域

firewall-cmd --set-default-zone=work

注意:流入默认区域中配置的接口的新访问请求将被置入新的默认区域,当前活动的连接将不受影响。

获取活动的区域

firewall-cmd --get-active-zones

根据接口获取区域

firewall-cmd –get-zone-of-interface=<interface>
firewall-cmd --get-zone-of-interface=eth1

修改接口所属区域

“`firewall-cmd [–zone=] –change-interface=

列举区域中启用的服务

firewall-cmd [ –zone= ] –list-services“`

启用应急模式阻断所有网络连接

firewall-cmd --panic-on

禁用应急模式

firewall-cmd --panic-off

查询应急模式

firewall-cmd --query-panic

启用区域中的一种服务

firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>]

使区域中的 ipp-client 服务生效60秒:

firewall-cmd --zone=home --add-service=ipp-client --timeout=60

图形管理工具firewall-config

图形化配置比较简单,这里就不赘述了。

Linux CentOS7防火墙firewalld使用说明

CentOS7防火墙已经不是iptables了而是有一个新名字了Firewalld。

  • firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念

  • firewalld有图形界面和工具界面,但一般我我都是使用字符界面; 图形界面请参照官方文档

  • firewalld的字符界面管理工具是 firewall-cmd

firewalld配置文件

firewalld默认配置文件有两个:

/usr/lib/firewalld/ (系统配置,尽量不要修改)

/etc/firewalld/ (用户配置地址)

在/etc/firewalld/zones下面只有一个public.xml,如果给另外一个zone做一些改动,并永久保存,那么会自动生成对应的配置文件

比如,给work zone增加一个端口:firewall-cmd –permanent –zone=work –add-port=1000/tcp

此时就会生成一个work.xml的配置文件

修改ftp的端口,默认ftp的端口是21,改为1121 代码如下:

cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/
vim /etc/firewalld/services/ftp.xml   #把21改为1121
vim /etc/firewalld/zones/work.xml     #work为默认zone,所以要编辑这个,增加一行<service name="ftp"/>
firewall-cmd --reload                 #重新加载

firewalld规则

假设自定义的ssh端口号为12222,使用下面的命令来添加新端口的防火墙规则:

firewall-cmd --add-port=12222/tcp --permanent

使用–permanent参数可以将更改保存到配置文件。

  • 防火墙配置文件也可以手动修改,修改后记得重新加载:firewall-cmd –reload

  • 这种情况下重新加载防火墙并不会中断用户连接,也可以彻底加载,这时候会中断用户连接,也会丢弃状态信息:firewall-cmd –complete-reload

  • 还可以添加一个端口范围:firewall-cmd –add-port=2000-4000/tcp

  • 针对指定zone添加端口:firewall-cmd –permanent –zone=home –add-port=443/tcp

  • 启动端口转发,例如把22端口转发到127.0.0.2:firewall-cmd –permanent –zone=home –add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

  • 以下是在CentOS7系统上操作Firewalld的方法。

  • 查看firewalld是否开启

systemctl is-enabled firewalld
  • 启动firewalld
systemctl start  firewalld
  • 停止firewalld
systemctl stop firewalld
  • 查看firewalld状态
systemctl status firewalld
  • 禁止firewall开机启动
systemctl disable firewalld.service
  • 重新加载防火墙
firewall-cmd --reload
  • 查看所有打开的端口
firewall-cmd --zone=public --list-ports
  • 查看具体端口
firewall-cmd --zone= public --query-port=80/tcp

firewalld有zone和service的概念,每一个zone的规则不一样,默认有9个zone。centos7默认使用的zone是public。

firewalld的9个zone介绍

  • 丢弃 drop : 任何流入网络的包都被丢弃,不作出任何响应。只允许流出的网络连接。

  • 阻塞 block:任何进入的网络连接都被拒绝,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接。

  • 公开 public:用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。

  • 外部 external:用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入。

  • 隔离区dmz:用以允许隔离区(dmz)中的电脑有限地被外界网络访问。只接受被选中的连接。

  • 工作 work:用在工作网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。

  • 家庭 home:用在家庭网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。

  • 内部 internal:用在内部网络。你信任网络中的大多数计算机不会影响你的计算机。只接受被选中的连接。

  • 受信任的 trusted:允许所有网络连接。

firewalld zone相关命令的用法

  • 设置默认的zone:firewalld-cmd –set-default-zone=work

  • 查看指定网卡所在的zone:firewall-cmd –get-zone-of-interface=eno16777736

  • 设置指定网卡所在的zone:firewall-cmd –zone=public –add-interface=lo

  • 更改指定网卡所在的zone:firewall-cmd –zone=dmz –change-interface=lo

  • 删除指定网卡所在的zone:firewall-cmd –zone=dmz –remove-interface=lo

  • 查看所有网卡所在的zone:firewall-cmd –get-active-zones

firewalld service介绍

  • 在/usr/lib/firewalld/services/目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如ssh服务等。

  • 与之对应的配置文件中记录了各项服务所使用的tcp/udp端口,在最新版的firewalld中默认已经定义了70多种服务供我们使用。

  • zone就是调用了不同的service而实现了不同的效果。

  • 列出所有的service:

firewall-cmd --get-services
  • 列出当前zone下加载的service:
firewall-cmd --list-services
  • 查看指定zone下面的service:
firewal-cmd --zone=public --list-services
  • 给指定zone添加service:
firewall-cmd --zone=public --ad-service=http
  • 这个改动不会保存到配置文件里,要想保存到配置文件里面,需要加上–permanent:
firewall-cmd --zone=public --add-service=http --permanent
  • 既然可以增加,同样也可以删除,下面命令会从配置文件中永久删除public zone中的http服务:
firewall-cmd --zone=public --remove-service=http --permanent

centos7启动过程及systemd详细说明

开机启过程

POST—>BOOT SEQUENCE—> BOOTLOADER—>KERNEL + INITRAMFS(INITRD)—>ROOTFS—>/sbin/init

POST:加电自检

当开机按下电源按钮后,计算机开始加电,主板上的BIOS或UEFI基本输入输出程序开始对硬件进行检查,检查内存,CPU等等吧,当检测到错误的时候机器会中断或者启动不了,这个做过电脑维护的人都知道,内存氧化可导至开不了机,还有的机器如果没插鼠标键盘自检也不会通过卡在那里了,不会继续往下走。

Boot sequence:选择引导顺序

当自检通过后,接着就要选择引导介质或方式,是通过光盘启动,硬盘启动,网络启动,还是U盘启动,这些也是在BIOS中设定的,所以设定的第一启动项是哪个就从那个开始引导,这个装过WINDOWS的都很熟悉了。

Bootloader:引导加载器

确定引导介质后便开始从介质中装载引导程序如grub2,这个是一个微小程序,我们知道MBR引导记录大小为512字节,其中前446个字节就是Bootloader,主要用来引导用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压,展开,而后把系统控制权移交给内核。

grub2就是Linux中Bootloader程序,由于MBR记录限制,所以grub2分为两个部分:

  1. 在MBR引导记录中,大小为446字节,主要功能是引导启动介质的grub主体文件

  2. partition,/boot/grub[2],此为grub的主体。

KERNEL + INITRAMFS(INITRD)—>ROOTFS :加载内核

这时候kernel开始初始化,探测可识别的硬件设备,加载硬件启动程序。以只读方式加载根文件系统

kernel在内存中加载时,为了模拟系统环境,会生成一个ramdisk文件,来进行下一步操作,等到加载到真正的根文件系统时,就会退出ramdisk,切换到真正的根文件系统中去。

  • ramdisk:内存上临时虚拟的系统

  • ramdisk(虚拟磁盘,双缓冲,双缓存)—-> ramfs(虚拟文件系统)

  • centos5:initrd

  • 工具程序:mkinitrd

  • centos6,7:initramfs

  • 工具程序:dracut,mkinitrd

/sbin/init:运行用户空间的第一个应用程序

init:

    Centos 5: SysV init       配置文件:/etc/inittab

    Centos 6: Upstart         配置文件:/etc/inittab;/etc/init/*.conf(主要)

    Centos 7: systemd        配置文件:/etc/systemd/system;/usr/lib/systemd/system

至此,内核空间就已经启动完毕,内核启动完成接着开始启动用户态启动过程。systemd是个守护进程,pid号为1,后面所有启动的服务或进程都是systemd的子进程及子进程的子进程。

那么用户态的启动顺序又是什么样的呢?

设置默认允许级别—>初始化脚本,完成系统初始化—>关闭及启动对应级别下的服务—–>设置登录终端—–>[启动图形终端]

Systemd新特性

  • 系统引导时实现服务并行启动,没有顺序之分
  • 按需激活进程
  • 支持系统状态快照
  • 基于依赖关系定义服务控制逻辑

关键特性

  • 基于socket的激活机制:socket与服务程序分离;按需激活程序或服务,可并行启动

  • 基于bus的激活机制:

  • 基于device的激活机制:当某个硬件设备变得可用时就可激活某设备

  • 基于path的激活机制

  • 系统快照:保存各unit的当前状态信息于持久存储设备中

  • 向后兼容sysv init脚本

不兼容:

systemctl命令固定不变,非由systemd启动的服务,systemctl无法与之通信

核心概念:unit

配置文件进行标识和配置,文件中主要包含了系统服务,监听socket,保存的系统快照以及其它与init相关的信息,保存至:

/usr/lib/systemd/system

/run/systemd/system

/etc/systemd/system

unit的类型

  • Service unit:文件扩展名为.service 无需执行权限,用于定义系统服务

  • Target unit:文件扩展名为.target,用于模拟实现“运行级别”

  • Device unit:文件扩展名为.device,用于定义内核识别的设备

  • Mount unit:文件扩展名为.mount,定义文件系统挂载点

  • Socket unit:文件扩展名为.socket,用于标识进程间通信用的socket文件

  • Snapshot unit:文件扩展名为.snapshot,管理系统快照

  • Swap unit:文件扩展名为.swap,用于标识swap设备

  • Automount unit:文件扩展名为.automount,文件系统的自动挂载点

  • Path unit:文件扩展名为.path,用于定义文件系统中的一个文件或目录

管理系统服务

  • 启动:systemctl start name.service

  • 停止:systemctl stop name .service

  • 重启:systemctl restart name.service

  • 重载:systemctl reload name.service

  • 条件式重启:systemctl try-restart name.service

  • 查看某服务当前是否运行:systemctl is-active name.service

  • 查看所有已经激活的服务:systemctl list-units –type service systemctl list-units –type service –-all

  • 开机自启动:systemctl enable name.service

  • 开机不启动:systemctl disable name.service

  • 查看所有服务开机自启动状态:systemctl list-unit-files –-type service

  • 查看服务是否开机自启:systemctl is-enabled name.service

  • 查看服务的依赖关系:systemctl list-dependencies name.service

  • 禁止设定为开机自启:systemctl mask name.service

  • 取消禁止设定为开机自启:systemctl unmask name.service

Target units:(模拟运行级别)

  • unit配置文件,以.target后辍名结尾

  • 关机:runlevel0.target,poweroff.target

  • 救援:runlevel1.target,rescue.target

  • 多用户:multi-user.target

  • 图形:graphical.target

  • 重启:reboot.target

  • 级别切换:systemctl isolate name.target

  • 查看级别:systemctl list-units –-type target systemctl get-default

  • 设置级别:systemctl set-default name.target

  • 切换至紧急救援模式:systemctl rescue

  • 切换至emergency模式:systemctl emergency(服务不加载不启动,驱动不加载,更彻底)

其它常用命令

  • 关机:systemctl halt,systemctl poweroff

  • 重启:systemctl reboot

  • 挂起:systemctl suspend

  • 快照:systemctl hibernate

  • 快照并挂起:systemctl hybrid-sleep

mysql管理工具percona-toolkit-3使用介绍

安装percona-toolkit-3

# yum localinstall percona-toolkit-3.0.3-1.el6.x86_64.rpm perl-TermReadKey.x86_64 0:2.30-13.el6 -y

1. pt-summary #显示和系统相关的基本信息:

[root@master ~]# pt-summary 
# Percona Toolkit System Summary Report ######################
Date | 2017-06-08 07:44:12 UTC (local TZ: CST +0800)
Hostname | master
Uptime | 1 day, 23:42, 1 user, load average: 0.00, 0.00, 0.00
System | VMware, Inc.; VMware Virtual Platform; vNone (Other)
Service Tag | VMware-56 4d c6 90 e2 74 18 85-89 15 70 77 f4 f3 33 f8
Platform | Linux
Release | CentOS release 6.5 (Final)
Kernel | 2.6.32-431.el6.x86_64
Architecture | CPU = 64-bit, OS = 64-bit
Threading | NPTL 2.12
SELinux | Disabled
Virtualized | VMWare
# Processor ##################################################
Processors | physical = 2, cores = 0, virtual = 2, hyperthreading = no
Speeds | 2x2592.006
Models | 2xIntel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
Caches | 2x6144 KB
# Memory #####################################################
Total | 1.8G
Free | 123.4M
Used | physical = 1.7G, swap allocated = 3.9G, swap used = 5.8M, virtual = 1.7G
Shared | 0.0
Buffers | 40.6M
Caches | 905.3M
Dirty | 412 kB
UsedRSS | 882.9M
Swappiness | 60
DirtyPolicy | 20, 10
DirtyStatus | 0, 0
...

2. pt-MySQL-summary #查看mysql的各个统计信息:

[root@master ~]# pt-mysql-summary -S /data/mysql/mysql.sock --user=root --host=localhost --port=3306 --password=123456
Warning: Using a password on the command line interface can be insecure.
# Percona Toolkit MySQL Summary Report #######################
System time | 2017-06-08 07:47:23 UTC (local TZ: CST +0800)
# Instances ##################################################
Port Data Directory Nice OOM Socket
===== ========================== ==== === ======
3306 /data/mysql/data 0 0 /data/mysql/mysql.sock
# MySQL Executable ###########################################
Path to executable | /usr/sbin/mysqld
Has symbols | No
# Report On Port 3306 ########################################
User | 
Time | (CST)
Hostname | master
Version | 5.7.18-15-57 Percona XtraDB Cluster (GPL), Release rel15, Revision 7693d6e, WSREP version 29.20, wsrep_29.20
Built On | Linux x86_64
Started | (up 1+05:25:54)
Databases | 5
Datadir | /data/mysql/data/
Processes | 1 connected, 1 running
Replication | Is not a slave, has 0 slaves connected
Pidfile | /data/mysql/logs/mysql.pid (exists)
# Processlist ################################################

Command COUNT(*) Working SUM(Time) MAX(Time)
------------------------------ -------- ------- --------- ---------
Query 1 1 0 0
Sleep 9 0 900000 100000

User COUNT(*) Working SUM(Time) MAX(Time)
------------------------------ -------- ------- --------- ---------
root 1 1 0 0
system user 9 0 0 0

Host COUNT(*) Working SUM(Time) MAX(Time)
------------------------------ -------- ------- --------- ---------
9 0 0 0
localhost 1 1 0 0

db COUNT(*) Working SUM(Time) MAX(Time)
------------------------------ -------- ------- --------- ---------
NULL 10 1 0 0

State COUNT(*) Working SUM(Time) MAX(Time)
------------------------------ -------- ------- --------- ---------
starting 1 1 0 0
wsrep 9 0 0 0
...
# Configuration File #########################################
Config File | /etc/my.cnf

[mysqld]
user = mysql
innodb_buffer_pool_size = 1024M
datadir = /data/mysql/data
port = 3306
server_id = 12
socket = /data/mysql/mysql.sock
pid-file = /data/mysql/logs/mysql.pid
log-error = /data/mysql/logs/error.log
log_warnings = 2
slow_query_log_file = /data/mysql/logs/slow.log
long_query_time = 0.1
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
wsrep_provider = /usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address = gcomm://192.168.3.12,192.168.3.13,192.168.3.198
binlog_format = ROW
default_storage_engine = InnoDB
wsrep_slave_threads = 8
wsrep_log_conflicts
innodb_autoinc_lock_mode = 2
wsrep_node_address = 192.168.3.12
wsrep_cluster_name = my-pxc-cluster
wsrep_node_name = pxc01
pxc_strict_mode = ENFORCING
wsrep_sst_method = xtrabackup-v2
wsrep_sst_auth = "sstuser:sstuser"
# Memory management library ##################################
jemalloc enabled in MySQL config for process with ID 28347
Using jemalloc from /usr/lib64/libjemalloc.so.1
# The End ####################################################

3. pt-slave-find #查找和显示指定的Master 有多少个Slave:

# pt-slave-find --host=10.10.76.96 --port=3306 --user=root --password=123456
10.10.76.96
Version 5.5.24-ucloudrel1-log
Server ID 168447072
Uptime 646+02:02:20 (started 2015-09-01T14:09:56)
Replication Is not a slave, has 0 slaves connected, is not read_only
Filters 
Binary logging MIXED
Slave status 
Slave mode STRICT
Auto-increment increment 1, offset 1
InnoDB version 1.1.8

4. pt-query-digest 慢日志查询:

# pt-query-digest /data/mysql/master-log.000007

5. pt-online-schema-change

#在线DDL操作改变表结构并且不阻塞,正常情况下在线ALTER一个表增加一个字段、一个索引的话MySQL会锁表,正常的流程如下:

  • 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_table)
  • 在原表上加write lock,阻塞所有更新操作(insert、delete、update等)
  • 执行insert into tmp_table select * from original_table
  • rename original_table和tmp_table,最后drop original_table
  • 释放 write lock

但是在线上直接操作的话会导致大量的写入阻塞,临时表可能会导致磁盘空间占满等问题,因此要使用pt-online-schema-change更新表结果的过程如下:

创建一个和原表相同表结构的表,比如table_tmp
执行表结构修改,并从原表copy数据到修改后的表
在原表上创建触发器,将copy过程中产生的数据更新到新表
copy完成,将新表rename成当前使用的表,删除旧表

使用pt-online-schema-change在线更新表,注意是在线、在线、在线更新表结构不停止业务使用的在线更新表结构:

# pt-online-schema-change --user=root --host=localhost --port=3306 --password=123456 --execute --alter "ADD COLUMN Job VARCHAR(20)" D=testdatabase,t=testtable2

6. 修改表结构并保留原表

pt-online-schema-change, test111库的tbl_app_table新增app_status字段默认为0

[root@test7_chat_api_im ~]# pt-online-schema-change --host=10.10.191.89 --user=root --password=123456 --port=3306 --no-drop-old-table --execute --alter "add column app_status char(1) default 0" D=test111,t=tbl_app_table

No slaves found. See --recursion-method if host qas01 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, 10, 1
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering `test111`.`tbl_app_table`...
Creating new table...
Created new table test111._tbl_app_table_new OK.
Altering new table...
Altered `test111`.`_tbl_app_table_new` OK.
2017-06-08T17:31:51 Creating triggers...
2017-06-08T17:31:51 Created triggers OK.
2017-06-08T17:31:51 Copying approximately 847 rows...
2017-06-08T17:31:51 Copied rows OK.
2017-06-08T17:31:51 Analyzing new table...
2017-06-08T17:31:51 Swapping tables...
2017-06-08T17:31:51 Swapped original and new tables OK.
Not dropping old table because --no-drop-old-table was specified.
2017-06-08T17:31:51 Dropping triggers...
2017-06-08T17:31:51 Dropped triggers OK.
Successfully altered `test111`.`tbl_app_table`.

配置haproxy在http请求头添加后端用户真实IP

在haproxy的配置文件中的前端bind下添加如下配置:

http-request set-header ZXTMIP %[src]

ps:其中ZXTMIP是自定义的字段 %[src]是取得IP

测试结果:

spacer.gif在浏览器中打开测试域名后的输出如下:

Array ( [TEMP] => /var/tmp [TMPDIR] => /var/tmp [TMP] => /var/tmp [PATH] => /usr/local/bin:/usr/bin:/bin [HOSTNAME] => mptest.okooo.com [USER] => web [HOME] => /var/webroot [FCGI_ROLE] => RESPONDER [SCRIPT_FILENAME] => /home/oae/web/wwwroot/public/index.php [QUERY_STRING] => [REQUEST_METHOD] => GET [CONTENT_TYPE] => [CONTENT_LENGTH] => [SCRIPT_NAME] => /index.php [REQUEST_URI] => / [DOCUMENT_URI] => /index.php [DOCUMENT_ROOT] => /home/oae/web/wwwroot/public [SERVER_PROTOCOL] => HTTP/1.1 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_SOFTWARE] => nginx/1.6.2 [REMOTE_ADDR] => 192.168.1.231 [REMOTE_PORT] => 6824 [SERVER_ADDR] => 192.168.1.235 [SERVER_PORT] => 80 [SERVER_NAME] => mptest.okooo.com [REDIRECT_STATUS] => 200 [HTTP_HOST] => mptest.okooo.com [HTTP_UPGRADE_INSECURE_REQUESTS] => 1 [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36 [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 [HTTP_ACCEPT_ENCODING] => gzip, deflate [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8 [HTTP_COOKIE] => LastUrl=; __utma=56961525.524112254.1501123742.1501123742.1501123742.1; __utmz=56961525.1501123742.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) [HTTP_ZXTMIP] => 111.200.213.110 [HTTP_X_FORWARDED_FOR] => 111.200.213.110 [HTTP_CONNECTION] => close [PHP_SELF] => /index.php [REQUEST_TIME_FLOAT] => 1501644453.5864 [REQUEST_TIME] => 1501644453 )

saltstack自动安装配置HAproxy

下载haproxy1.6.2.tar.gz

下载地址:http://www.haproxy.org/download/1.6/src/

1、编写功能模块

1.1 首先编写依赖安装模块

# mkdir -p /srv/salt/prod/pkg /srv/salt/prod/haproxy /srv/salt/prod/haproxy/files 
# cd /srv/salt/prod/pkg

# cat pkg-init.sls 
pkg-init:
pkg.installed:
- names:
- gcc
- gcc-c++
- glibc
- make
- autoconf
- openssl
- openssl-devel

1.2 编写HAproxy状态模块

如何写状态模块?
安装一遍,记录安装步骤

手动安装步骤:

安装依赖

# yum install gcc gcc-c++ glibc make autoconf openssl openssl-devel
cd /usr/local/
tar -zxf haproxy-1.6.2.tar.gz
cd /usr/local/haproxy-1.6.2

2、将配置文件,启动文件等拷贝到/srv/salt/prod/haproxy/files下

2.1 获取启动脚本,并copy到/srv/salt/prod/haproxy/files/

# mv haproxy-1.6.2.tar.gz /srv/salt/prod/haproxy/files/
# cd /srv/salt/prod/haproxy/files/
# tar zxf haproxy-1.6.2.tar.gz
# cd haproxy-1.6.2/examples/
# vim haproxy.init
BIN=/usr/local/haporxy/sbin/$BASENAME

# cp haproxy.init /srv/salt/prod/haproxy/files/

# cd /srv/salt/prod/haproxy/files
# rm -rf haproxy-1.6.2

2.1 编写install.sls

不在这里写配置文件,是为了解耦。因为安装和启动时原子操作,在哪都必须,但是配置文件,在不同环境下是不一样的

# cd /srv/salt/prod/haproxy/
# vim install.sls

include:
- pkg.pkg-init
haproxy-install: 
file.managed: 
- name: /usr/local/src/haproxy-1.6.2.tar.gz
- source: salt://haproxy/files/haproxy-1.6.2.tar.gz
- user: root
- group: root
- mode: 755
cmd.run:
- name: cd /usr/local/src && tar zxf haproxy-1.6.2.tar.gz && cd haproxy-1.6.2 && make TARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
- unless: test -d /usr/local/haproxy
- require:
- pkg: pkg-init
- file: haproxy-install
haproxy-init:
file.managed:
- name: /etc/init.d/haproxy
- source: salt://haproxy/files/haproxy.init
- user: root
- group: root
- mode: 755
- require:
- cmd: haproxy-install
cmd.run:
- name: chkconfig --add haproxy
- unless: chkconfig --list | grep haproxy
- require:
- file: /etc/init.d/haproxy
net.ipv4.ip_nonlocal_bind:
sysctl.present:
- value: 1
haproxy-config-dir:
file.directory:
- name: /etc/haproxy
- user: root
- group: root
- mode: 755

# salt '*' state.sls haproxy.install env=prod

注:
直接拷贝上面的配置文件执行可能会出错,建议进入vim状态后,使用set list命令,确保$符号和配置之间没有空格
并且层级关系是2、4、6个空格
建议先执行测试然后再实际配置修改

# salt '*' state.sls haproxy.install env=prod test=True

3、编写业务引用

3.1 HAproxy配置文件

# mkdir -p /srv/salt/prod/cluster/files
# cd /srv/salt/prod/cluster/files/ 
# vim /srv/salt/prod/cluster/files/haproxy-outside.cfg
global
maxconn 100000
chroot /usr/local/haproxy
uid 99 
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
maxconn 100000
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen stats
mode http
bind 0.0.0.0:8888
stats enable
stats uri /haproxy-status
stats auth haproxy:saltstack
frontend frontend_www_example_com
bind 192.168.3.11:80
mode http
option httplog
log global
default_backend backend_www_example_com
backend backend_www_example_com
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP/1.0
balance source
server web-node1 192.168.3.12:8080 check inter 2000 rise 30 fall 15
server web-node2 192.168.3.19:8080 check inter 2000 rise 30 fall 15

# cd ..
# vim /srv/salt/prod/cluster/haproxy-outside.sls
include:
- haproxy.install
haproxy-service:
file.managed:
- name: /etc/haproxy/haproxy.cfg
- source: salt://cluster/files/haproxy-outside.cfg
- user: root
- group: root
- mode: 644
service.running:
- name: haproxy
- enable: True
- reload: True
- require:
- cmd: haproxy-init
- watch:
- file: haproxy-service

# cd /srv/salt/base/
# vim top.sls
base:
'*':
- init.env_init
prod:
'*':
- cluster.haproxy-outside

执行安装配置

# salt '*' state.highstate

4、Web查看服务状态

从web登陆192.168.3.12:8888/haproxy-status
用户名和密码在/srv/salt/prod/cluster/files/haproxy-outside.cfg中

# grep 'auth' /srv/salt/prod/cluster/files/haproxy-outside.cfg
stats auth haproxy:saltstack

至此haproxy的配置完成

未分类

haproxy配置https负载均衡

本实验全部在haproxy1.5.19版本进行测试通过,经过测试1.7.X及haproxy1.3版本以下haproxy配置参数可能不适用,需要注意版本号。

一、业务要求

现在根据业务的实际需要,有以下几种不同的需求。如下:

1.1 http跳转https

把所有请求http://www.chinasoft.com的地址全部跳转为https//:www.chinasoft.com这个地址

1.2 http与https并存

服务器同时开放http://www.chinasoft.com和https://www.chinasoft.com的访问形式

1.3 服务器环境准备

未分类

node1即haproxy所在服务器的处理

安装依赖

yum install -y openssl openssl-devel readline-devel pcre-devel libssl-dev libpcre3

# 下载安装包,
tar zxf haproxy-1.5.19.tar.gz
cd haproxy-1.5.19
# 加入支持ssl的编译参数

make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1
cp /usr/local/sbin/haproxy /usr/sbin/
make install PREFIX=/usr/local/haproxy
cp /usr/local/sbin/haproxy /usr/sbin/
cp examples/haproxy.init /etc/init.d/haproxy

# 修改启动脚本(可能会报错)为如下
vim /etc/init.d/haproxy
26 [[ ${NETWORKING} = "no" ]] && exit 0

后端web01(192.168.3.200)服务器apache配置,需要配置虚拟主机域名为:www.chinasoft.com否则无法正常处理

[root@node2 ~]# egrep -v '#|^$' /etc/httpd/conf/httpd.conf 
ServerRoot "/etc/httpd"
Listen 8080
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
<Directory />
Options FollowSymLinks
AllowOverride none
Allow from all
</Directory>
DocumentRoot "/var/www/html/chinasoft"
<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
<Directory "/var/www/html/chinasoft">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf

[root@node2 ~]# cat /etc/httpd/conf.d/vhost.conf 
NameVirtualHost *:8080
<VirtualHost *:8080>
DocumentRoot /var/www/html/
ServerName 192.168.3.200:8080
</VirtualHost>

<Directory "/var/www/html/chinasoft/">
php_admin_value open_basedir "/var/www/html/chinasoft/:/tmp/"
Options Includes ExecCGI FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:8080>
DocumentRoot /var/www/html/chinasoft/
ServerName www.chinasoft.com:8080
</VirtualHost>

1.4 证书的处理,需要将网站的根证书和key简单的合并在一起:

cat chinasoft.com.pem chinasoft.com.key | tee chinasoft.pem

否则会报错

'bind *:443' : unable to load SSL private key from PEM file

1.5 域名的指向及处理

将www.chinasoft.com指向haproxy负载均衡器所在的服务器IP地址,此处是192.168.3.198

二、配置haproxy并测试业务需求

现在我们根据业务的需求,我们来配置haproxy一一达到其需求。

2.1 http跳转https配置

http跳转https的haproxy配置文件内容,如下:

[root@node1 haproxy]# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local3 info
chroot /var/lib/haproxy
maxconn 4096
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
stats timeout 2m
tune.ssl.default-dh-param 2048

defaults
log global
mode http
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.1
option redispatch
retries 3
option redispatch
maxconn 2000
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s

listen admin_stats
bind 0.0.0.0:1080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /haproxy?stats
stats auth admin:admin
stats hide-version

frontend weblb
bind *:80
acl is_http hdr_beg(host) www.chinasoft.com
redirect scheme https if !{ ssl_fc }
bind *:443 ssl crt /etc/haproxy/chinasoft.pem
use_backend httpserver if is_http

backend httpserver
balance source
server web1 192.168.3.200:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3



# 配置好之后先检查语法是否正确
[root@node1 haproxy]# /etc/init.d/haproxy check
Configuration file is valid

在以上配置文件中,需要注意的选项如下:

tune.ssl.default-dh-param 2048因为我们的SSL密钥使用的是2048bit加密,所以在此进行声明。

acl is_http hdr_beg(host) www.chinasoft.com
redirect scheme https if !{ ssl_fc }
bind *:443 ssl crt /etc/haproxy/chinasoft.pem

这三行表示把所有访问www.chinasoft.com这个域名的请求,全部转发到https://www.chinasoft.com这个连接

管理页面

未分类

2.2 测试http跳转https

http跳转https配置完毕后,我们选择来测试其跳转。如下:

未分类

你会发现在浏览器中,无论你输入的是www.chinasoft.com,还是http://www.chinasoft.com亦或是https://www.chinasoft.com,都会自动跳转到https://www.chinasoft.com。

这样就达到了,把所有的http请求跳转到https的目的。

2.3 http与https并存配置

haproxy要实现http和https并存的话,配置也很简单,只需要把haproxy分别监控不同的端口就行,配置文件如下:

[root@node1 haproxy]# cat haproxy.cfg
global
log 127.0.0.1 local3 info
chroot /var/lib/haproxy
maxconn 4096
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
stats timeout 2m
tune.ssl.default-dh-param 2048

defaults
log global
mode http
option httplog
option dontlognull
option redispatch
retries 3
option redispatch
maxconn 2000
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s

listen admin_stats
bind 0.0.0.0:1080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /haproxy?stats
stats auth admin:admin
stats hide-version

frontend weblb
bind *:80
acl is_http hdr_beg(host) www.chinasoft.com
use_backend httpserver if is_http

backend httpserver
balance source
server web1 192.168.3.200:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3

frontend weblb443
bind *:443 ssl crt /etc/haproxy/chinasoft.pem
acl is_443 hdr_beg(host) www.chinasoft.com
use_backend httpserver443 if is_443

backend httpserver443
balance source
server web1 192.168.3.200:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3

在以上配置文件中,我们定义了两个前端,一个前端用于监听80端口,也就是http协议。另外一个前端监听443端口,也就是https协议。

此时haproxy会根据客户端请求的协议进行分发,如果发现客户端请求的是http协议,则把该请求分发到监听80端口的前端。如果发现客户端请求的是https协议,则把该请求分发到监听443端口的前端。如此就达到了haproxy让http和https并存的要求。

2.4 测试http与https并存

http与https并存配置完毕后,我们选择来测试其跳转。如下:

未分类

未分类

通过测试你会发现,在浏览器中如果你输入的是http://www.chinasoft.com或者是www.chinasoft.com都会直接跳转到http://www.chinasoft.com,而输入的是https://www.chinasoft.com,则只会跳转到https://www.chinasoft.com。

如此就到达了,我们业务的要求实现http和https并存。

解决升级Debian软件包导致不能联网的问题

作为linux新手,在vps上遇到系统性的问题就束手无策了,今天使用apt upgrade升级了大量软件包(本来是准备升级系统的,听说debian9.1出了稳定版更新),导致不能联网,折腾良久才解决,记录一下。

先记一个upgrade中遇到的问题,输入命令后出现大量不懂的字符,最后有个冒号:,输入什么都不对,没法继续,无意中输入q(当时准备输入quit退出),竟然过去了。

升级完成后重启,不能联网搜索到的解决办法。

通过自带的html5 vnc连接(也只有这个办法了),输入

dmesg | grep eth

显示出一行代码中有个 ens3,打开/etc/network/interfaces,找到

iface ensxxx inet static

address 192.168.1.138

netmask 255.255.255.0

gateway 192.168.1.1

将其中的ens或是eth0改成之前看到的ens3,上面一行auto eth0也改成ens3,成功。

Ubuntu 16.04 apt安装Nginx PHP5.6 MySQL5.6

在Ubuntu 16.04中使用源安装Nginx+PHP5.6+MySQL5.6的方法。

安装Nginx

1、首先添加nginx_signing.key(必须,否则出错)

$ wget http://nginx.org/keys/nginx_signing.key

$ sudo apt-key add nginx_signing.key

2、添加]Nginx](http://nginx.org/)官方提供的源

$ echo "deb http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list

$ echo "deb-src http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list

3、更新源并安装Nginx

$ sudo apt-get update

$ sudo apt-get install nginx

4、安装Nginx完成后可查看版本号,输入

$ /usr/sbin/nginx -v

安装PHP5.6

1、添加PPA

$ sudo apt-get install python-software-properties software-properties-common

$ sudo add-apt-repository ppa:ondrej/php

$ sudo apt-get update

2、安装PHP5.6以及所需的一些扩展

$ sudo apt-get install php5.6-fpm php5.6-mysql php5.6-common php5.6-curl php5.6-cli php5.6-mcrypt php5.6-mbstring php5.6-dom

3、配置PHP5.6

打开php.ini配置文件:

$ sudo vim /etc/php/5.6/fpm/php.ini

找到cgi.fix_pathinfo选项,去掉注释;,然后将值设置为0:

cgi.fix_pathinfo = 0;
display_errors  =  On

location ~ .php$ {
          # include snippets/fastcgi-php.conf;
        #
          # # With php7.0-cgi alone:
        # fastcgi_pass 127.0.0.1:9000;
        # # With php7.0-fpm:
                fastcgi_param SCRIPT_FILENAME     documentroot fastcgi_script_name;
                  fastcgi_pass unix:/run/php/php5.6-fpm.sock;
                  fastcgi_index index.php;
                  include fastcgi_params;
}

安装MySQL

$ sudo apt-get install mysql-server-5.6 mysql-client-5.6

途中会提示设置MySQL的密码,安装好后:

$ mysql -uroot -p

然后输入刚刚设置的密码,能成功进入即成功安装。

升级Ubuntu内核开启BBR加速

BBR是啥,有什么用我不知道,我只知道谷歌出品,必属精品;星宿老仙,法力无边。linux内核版本要高于4.9,才支持BBR,所以今天讲一讲Ubuntu内核版本的升级操作。

首先查看当前内核版本:

root@HuangQiDi:~# uname -r
4.4.0-83-generic

得到两个信息,版本号4.4明显不够,还有后面一个generic,下文要用到。顺便看一下系统位数:

root@HuangQiDi:~# arch
x86_64

升级Ubuntu内核

Ubuntu的最新内核可以在http://kernel.ubuntu.com/~kernel-ppa/mainline/ 找到,打开网页后,按End键,跳到最下面,找一个版本最大,不带rc字样的链接点击进去,

未分类

这里我们选择4.12.4,点击进去后,一大堆内核的链接,我们下载哪一个呢?文本开始,我们通过uname -r拿到一个generic,通过arch确定系统为64位,现在这两个东西就有用了,此时我们在浏览器窗口按下F3执行搜索,由于这个搜索框不支持正则,我们只能搜amd64字样,然后目测generic,这里顺便说一句,为什么64位架构要叫amd64呢,虽然现在amd被牙膏厂吊打,但世界上第一枚64位的处理器确是AMD发布的。

未分类

下载内核:

root@HuangQiDi:~# wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.12.4/linux-image-4.12.4-041204-generic_4.12.4-041204.201707271932_amd64.deb

安装内核:

root@HuangQiDi:~# dpkg -i linux-image-4.12.4-041204-generic_4.12.4-041204.201707271932_amd64.deb 

未分类

最后,执行命令update-grub,更新grub引导使用新的内核。

root@HuangQiDi:~# update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.12.4-041204-generic
Found initrd image: /boot/initrd.img-4.12.4-041204-generic
Found linux image: /boot/vmlinuz-4.4.0-83-generic
Found initrd image: /boot/initrd.img-4.4.0-83-generic
done

这里很多有洁癖的人喜欢删除旧内核,我特别不建议这么做,一个内核才多大啊,万一新内核无法正常启动,那不是自找麻烦吗。
重启系统后检查内核是否成功升级:

root@HuangQiDi:~# uname -r
4.12.4-041204-generic

启用BBR

root@HuangQiDi:~# echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
root@HuangQiDi:~# echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
root@HuangQiDi:~# sysctl -p
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

net.core.default_qdisc的值真有意思fq,番茄番茄。
此时执行sysctl net.ipv4.tcp_available_congestion_control,若返回结果为“net.ipv4.tcp_available_congestion_control = bbr cubic reno”,表示BBR模块开启成功。

最后来稍微看下这个BBR模块

root@HuangQiDi:~# lsmod | sed -n '1p;/bbr/p'
Module                  Size  Used by
tcp_bbr                20480  0

Used by下面的0,表示该模块可以随时卸载。卸载命令为modprobe -r tcp_bbr

查看模块详细信息:

root@HuangQiDi:~# modinfo tcp_bbr
filename:       /lib/modules/4.12.4-041204-generic/kernel/net/ipv4/tcp_bbr.ko
description:    TCP BBR (Bottleneck Bandwidth and RTT)
license:        Dual BSD/GPL
author:         Soheil Hassas Yeganeh 
author:         Yuchung Cheng <[email protected]>
author:         Neal Cardwell 
author:         Van Jacobson 
srcversion:     3D237D080AC188DD9000A9A
depends:        
intree:         Y
vermagic:       4.12.4-041204-generic SMP mod_unload