[Linux]Xshell连接Centos7能Ping通但无法连接问题[ssh(d)+firewalld/iptables+chkconfig]


一 方案与思路

  • 0 xshell客户端监测是否能够ping通目标服务器。
    • 前提:知晓目标服务器IP地址
      • Linux: ifconfig -a
      • Windows: ipconfig -a
  • 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

X 参考文档


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM