一 方案与思路
- 0 xshell客户端监测是否能够ping通目标服务器。
- 前提:知晓目标服务器IP地址
- Linux: ifconfig -a
- Windows: ipconfig -a
- 前提:知晓目标服务器IP地址
- 1 利用firewall工具,检查是否已开启ssh的22端口。若无,则:开启22端口
- 2 利用sshd工具,检查是否已开启sshd服务。若无,则:开启sshd服务
- 开(重)启ssh服务: system (re)start sshd
- 3 利用systemctl工具,检查是否已开启sshd、firewalld的开机自启服务。若无,则:开启sshd、firewalld服务的开机自启
- systemctl enable sshd
- systemctl list-unit-files | grep sshd
- systemctl enable firewalld[.service]
- systemctl list-unit-files | grep firewall
二 相关知识及操作命令
关键工具
ssh:客户端,主要进行服务器端的连接
sshd:服务端,作用于服务器端(开闭ssh服务等操作)
ssh————————————>sshd
client serve
firewalld(防火墙)
firwall-cmd(Linux提供的操作firewall的一个工具)
systemctl(服务控制命令)
1 sshd
- 查看服务状态
inactive(不可用),active(可用,活动状态)
systemctl status sshd
- 列出已开启服务当前状态
systemctl list-units | grep <目标服务,例如:ssh>
或
netstat -antulp | grep ssh

- 开启ssh服务
systemctl start sshd
- 设定服务开机启动
systemctl enable sshd
- 查看sshd开机自启服务是否已开启
systemctl list-unit-files | grep sshd
- 关闭ssh服务
systemctl stop sshd
- 设定服务开机不启动
systemctl disable sshd
- 重启ssh服务
systemctl restart sshd
- 重新加载服务配置
systemctl reload sshd
2 防火墙(firewalld/firewall-cmd)
2.1 查看
- 查看firewall服务状态
(centos7)
[centos 7]
systemctl status firewalld
[centos 6/7]
service firewalld status

- 查看防火墙状态
firewall-cmd --state

- 查看防火墙规则
firewall-cmd --list-all


- 查询端口是否开放
firewall-cmd --query-port=8080/tcp
2.2 操纵
1.2.1 firewall端口
- 开放端口
例如,80端口
--permanent:表示设置为持久;
--add-port:标识添加的端口;
firewall-cmd --permanent --add-port=80/tcp
--permanent:表示设置为持久
--add-port:标识添加的端口
- 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
1.2.2 firewall服务
- 开启
(centos7)
service firewalld start
- 重启
(centos7)
service firewalld restart
# 或者↓
firewall-cmd --reload 【重启防火墙(修改配置后,要重启防火墙)】
- 启用/禁用 开机自启
systemctl enable/disable firewalld.service
- 关闭
service firewalld stop
2.3 补充: CentOS6的防火墙iptables操作
# 安装防火墙(iptables)
yum install iptables //CentOS
apt-get install iptables //Debian/Ubuntu
# 查看防火墙状态
service iptables status
# 停止防火墙
service iptables stop
# 启动防火墙
service iptables start
# 重启防火墙
service iptables restart
# 永久关闭防火墙 (停用开机自启)
chkconfig iptables off
# 永久关闭后重启 (启用 开机自启)
chkconfig iptables on
2.4 防火墙进阶篇
- iptables的结构
参见
CentOS iptables防火墙的理解和使用 - 博客园
iptables工具__过滤包—命令... - CSDN
【四张表】:Raw追踪表——mangle修改表——nat地址转换——filter过滤表(默认表,常用)(四张表按优先级从高到低) 使用参数-t 表选择表


【五条链】:prerouting、input(常用)、forward、output、postrouting
在链前使用参数:
-P/--policy:新建链。定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
-L/--list:列出规则
-A/--append:追加规则
-D/--delete:删除规则
-I/--insert:插入规则。插入一条规则,原本该位置(这里是位置1)上的规则将会往后移动一个顺位。
-R/--replace:替换规则 (取代现行规则,规则被取代后并不会改变顺序)
-N/--new-chain: 新增链。定义新的规则链
-F/--flush:删除规则。删除某规则链(这里是INPUT规则链)中的所有规则(Eg: iptables -F INPUT)
-Z/--zero:清零 计数。将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
-X/--delete-chain:删除链
【过滤规则】:源IP -s
、源PORT --sport
/ 目标IP -d
、目标PORT --dport
/ 协议(tcp、udp、icmp)-p
、状态--state
/ 数据流入接口,进网卡 -i
、数据流出接口,出网卡-o
【执行动作】:-j :ACCEPT接受报、DROP丢弃报、REJECT丢弃报并通知对方、REDIRECT重定向包、MASQUERADE (改写源IP为防火墙ip)等
ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。
REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 例如:iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。 例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。例如:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。例如:iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。例如:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。例如:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费......等。
RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
【加载其他过滤模块】 -m (state 状态(NEW、ESTABLISHED、RELATED、INVALID)、multiport 多端口、limit 包流量、mac 网卡地址)
参数 -m multiport --source-port
例如: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。
参数 -m multiport --destination-port
例如: iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明 用来比对不连续的多个目的地埠号,设定方式同上。
参数 -m multiport --port
例如: iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。
注意:在本范例中,如果来源端口号为 80目的地埠号为 110,这种封包并不算符合条件。
参数 --icmp-type
例如: iptables -A INPUT -p icmp --icmp-type 8
说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。
请打 iptables -p icmp --help 来查看有哪些代码可用。
参数 -m limit --limit
例如: iptables -A INPUT -m limit --limit 3/hour
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,
默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。
参数 --limit-burst
范例 iptables -A INPUT -m limit --limit-burst 5
说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。
参数 -m mac --mac-source
范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。
参数 --mark
范例 iptables -t mangle -A INPUT -m mark --mark 1
说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。
参数 -m owner --uid-owner
范例 iptables -A OUTPUT -m owner --uid-owner 500
说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。
参数 -m owner --gid-owner
范例 iptables -A OUTPUT -m owner --gid-owner 0
说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
参数 -m owner --pid-owner
范例 iptables -A OUTPUT -m owner --pid-owner 78
说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
参数 -m owner --sid-owner
范例 iptables -A OUTPUT -m owner --sid-owner 100
说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。
参数 -m state --state
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。
- 查看 已添加的iptables规则
iptables -L -n
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M)
n:只显示IP地址和端口号,不将ip解析为域名
- 屏蔽 MAC
按来源MAC地址匹配,拒绝转发来自该MAC地址的数据包.
iptables -t filter -A FORWARD -m --mac-source 00:02:b2:03:a5:f6 -j DROP
- 屏蔽 IP(网段)
iptables -I INPUT -s 124.115.0.199 -j DROP //屏蔽124.115.0.199这个IP
iptables -I INPUT -s 124.115.0.0/16 -j DROP //屏蔽124.115.*.*这一网段段(124.115开头)的所有IP
iptables -I INPUT -s 61.37.80.0/24 -j DROP //屏蔽61.37.80.*这一网段段(61.37.80开头)的所有IP
iptables -I INPUT -s 124.0.0.0/8 -j DROP //屏蔽124.*.*.*这一网段段(124开头)的所有IP
- 将1分钟内连续超过3次的SSH连接请求拒绝掉
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH_RECENT --rcheck --seconds 60 --hitcount 3 -j DROP
- 保存 规则
service iptables save //也可指定存储文件: iptables-save > /etc/sysconfig/iptables
- 开启/取消屏蔽 IP(网段)
(只要把参数-I
改为-D
就好了)
iptables -D INPUT -s 124.0.0.0/8 -j DROP //取消屏蔽 124.*.*.*这一网段段(124开头)的所有IP 【取消 指定对满足条件包的执行DROP的规则】
iptables -D INPUT -s 124.0.0.0/8 -j REJECT //取消屏蔽 124.*.*.*这一网段段(124开头)的所有IP 【取消 指定对满足条件包的执行REJECT的规则】
- 清除 已有iptables规则
iptables -F //全清掉了
iptables -X
iptables -Z
三 开机自启
3.1 Linux的运行级别
Linux的运行级别有6个,而这6个运行级都有各自的功能,某个程序在一个运行级别里面运行,在另一个级别就不运行。
- 0 - halt (Do NOT set initdefault to this) 系统停止 / 关机模式
- 1 - Single user mode 单用户运行模式
- 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 无网络多用户模式
- 3 - Full multiuser mode 有网络多用户(完整多用户模式)
- 4 - unused 未使用
- 5 - X11 有网络支持,且有X-Window支持的多用户模式 (图形模式)
- 6 - reboot (Do NOT set initdefault to this) 重新引导系统 (即 重启)
一般情况下,我们处于的运行级在3或者5。
这6种模式还有许多功能,比如说:
如果忘记了root密码就可以进入单用户模式,
在启动后的提示符界面下输入init = /bin/sh rw就进入了模式1,
把root文件挂为读写就可以跳过系统认证,
直接用passwd程序来更改root用户口令了,
然后,再启动到正常的运行级去即可。
查看6大运行级别信息 、 修改运行级别(启动模式)
CentOS6/RHEL6 及之前的版本,查看、修改启动模式,都是在 /etc/inittab
文件里直接修改,修改id后面的数字即可。
shell# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
CentOS7/RHEL7 之后版本,查看、修改启动模式,也在 /etc/inittab
里有介绍
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
查看当前的启动模式/运行级别
[CentOS6/RHEL6 及之前的版本]
查看模式,在 /etc/inittab
文件里直接查看末行的id
后面的数字即可。
[centos7]
- runlevel0.target -> poweroff.target
- runlevel1.target -> rescue.target
- runlevel2.target -> multi-user.target
- runlevel3.target -> multi-user.target
multi-user.target
: analogous to runlevel 3
-
runlevel4.target -> multi-user.target
-
runlevel5.target -> graphical.target
graphical.target
: analogous to runlevel 5
- runlevel6.target -> reboot.targe
systemctl get-default
查看指定运行模式下可使用的功能服务
怎么查看在当前模式下可以使用什么功能呢?查看/etc/rc.d/init.d这个文件夹下
ll /etc/rc.d/init.d

怎么查看在不同运行模式下,可以使用什么功能呢?
查看/etc/rc.d/init.d
这个文件夹下,就是可以运行的脚本.如下图:
ll /etc/rc.d

或者:
ll /etc/rc[0-6].d
通过下图,可以发现: 在/etc下也有同样的7个文件夹即 /etc/rc[0-6].d
,通过查看发现/etc/rc[0-6].d
其实就是/etc/rc.d/rc[0-6].d
的软连接,只是为了保持和Unix的兼容性

ll /etc/rcN.d
或者 ll /etc/rc.d/rc[0-6].d

↓↓↓
这些文件是按照如下格式命名的 [KS][1-100]servicename ,它表示当系统的运行级别为5时,它会关掉以K开头的所有服务,并启动所有以S开头的服务。
其实,这些服务都是/etc/init.d/中某个服务的软连接,所以真正启动的服务是/etc/init.d目录中的某一个服务,而以K/S开头建立软连接是为了表明在对应级别下应该采取的行为,K/S后面紧跟的数字表示开/关服务的优先级。

因此,如果我们自己写了一个脚本代码 如cleanupd
,需要在开机级别为3的时候自启动的话,那么我们只需要把可执行的cleanupd
脚本文件放到 /etc/init.d目录下,并在对应的运行级别目录下 如/etc/rc.d/rc3.d/ 建立一个以S开头后加数字的软连接到/etc/init.d/cleanupd即可,如
ln -s /etc/init.d/cleanupd /etc/rc.d/rc3.d/S95cleanup
设置、切换启动模式/运行级别
那么如何切换启动模式呢?
[通用方法]
使用"init + 运行级别"回车即可直接进入,比如:输入init 0
电脑就会关机,输入init 6
电脑就会重启


[centos7]
systemctl set-default <TARGET.target>
修改完成,重启服务器,即生效。
3.2 查看 开机自启
- 查看 开机自启的所有服务
[centos6/7/8/...]
chkconfig --list
[centos7/8/...]
systemctl list-unit-files
或者 systemctl list-unit-files | grep -i xxx

- 查看是否有定时执行任务
参考文献
[查看 定时服务是否已开启]
systemctl status crond
[查看 定时 执行任务列表]
crontab -e
3.3 设置 开机自启
方式1: chkconfig 【推荐】
Linux chkconfig命令用于检查,设置系统的各种服务。用来设置服务的运行级信息,该设置并非立即启动,或者禁用制定服务。
这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。
这个命令是centos7之前版本使用的,但是目前是过渡期,在centos7上依然可以使用,这个命令只列出SysV服务机制的服务,并不包含centos7上systemd服务
注: Linux默认允许任何人按下Ctrl+Alt+Del来重启系统。但是在生产环境中,应该停用按下Ctrl-Alt-Del 重启系统的功能。
- 停用/启用 指定服务的开机自启
chkconfig network off/on | 关闭network
chkconfig iptables off/on | 关闭防火墙
linux有7个运行级别: 0-6
0级别表示:关机状态
1级别表示:单用户模式
2级别表示:没有nfs服务
3级别表示:多用户模式,不带图形界面
4级别表示:保留的级别
5级别表示:多用户模式,带图形界面
6级别表示:重启

- 自定义设置 开机自启服务
/etc/inittab
在centos7之前版本中,可修改此配置文件来定义系统运行级别,只不过在centos7系统中,已经不使用了。
#chkconfig --level 3 network off //关闭3级别的network服务
#chkconfig --level 35 network off //关闭3级别和5级别的network服务
#chkconfig --level 345 network on //开启3、4、5级别的network服务
在/etc/init.d/下创建一个自己的脚本,然后使用命令:
chkconfig --add +脚本名称 //就可以把自己的脚本添加到开机服务列表中
自己添加的脚本中必须要有:chkconfig: 2345 10 90
和 description: Activates/Deactivates all network interfaces configured to \ start at boot time.
这两部分才能被识别,其中必须是shell脚本,2345表示启动级别是2、3、4、5级别,10表示启动顺序是第10位,90是第90位关闭

#chkconfig --del +脚本名称 //删除开机自启动服务
方式2: 修改 /etc/rc.d/rc.local 文件
- step1 赋予脚本可执行权限(/opt/script/autostart.sh是你的脚本路径)
chmod +x /opt/script/autostart.sh
- step2 打开
/etc/rc.d/rc/local
文件,配置、指定具体功能模块的开机自启的shell启动操作
例如: 例如将 apache、MySQL、samba、autostart.sh(自定义的用户启动脚本)等这些服务的开机自启动问题一起搞定:
vi/etc/rc.d/rc.local
/usr/sbin/apachectl start
/etc/rc.d/init.d/mysqld start
/etc/rc.d/init.d/smb start
/opt/script/autostart.sh
- 在centos7中,/etc/rc.d/rc.local的权限被降低了,所以需要执行如下命令赋予其可执行权限
chmod +x /etc/rc.d/rc.local
方式3: 修改 /etc/rc.d/init.d 文件 + chkconfig
- step1 将脚本移动到
/etc/rc.d/init.d
目录下
mv /opt/script/autostart.sh /etc/rc.d/init.d
- step2 增加脚本的可执行权限
chmod +x /etc/rc.d/init.d/autostart.sh
- step3 添加脚本到开机自动启动项目中
cd /etc/rc.d/init.d
chkconfig --add autostart.shchkconfig autostart.sh on
方式4: ln -s 建立软连接
如果我们自己写了一个脚本代码 如 cleanupd,需要在开机级别为3的时候自启动的话.
那么,我们只需要把可执行的cleanupd脚本文件放到 /etc/init.d目录下,并在对应的运行级别目录下 如/etc/rc.d/rc3.d/ 建立一个以S开头后加数字的软连接到/etc/init.d/cleanupd即可,如:
ln -s /etc/init.d/cleanupd /etc/rc.d/rc3.d/S95cleanup