Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[pull] main from wangdoc:main #21

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
pull wants to merge 7 commits into FreezeSoul:main
base: main
Choose a base branch
Loading
from wangdoc:main
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/wangdoc.yml
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
jobs:
page-generator:
name: Generating pages
runs-on: ubuntu-18.04
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
Expand Down
2 changes: 2 additions & 0 deletions chapters.yml
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
- client.md: SSH 客户端
- key.md: SSH 密钥登录
- server.md: SSH 服务器
- log.md: 日志
- port-forwarding.md: 端口转发
- ca.md: SSH 证书登录
- scp.md: scp 命令
- rsync.md: rsync 命令
- sftp.md: sftp 命令
- fail2ban.md: Fail2ban 教程
27 changes: 18 additions & 9 deletions docs/client.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,16 @@ $ ssh -F /usr/local/ssh/other_config
$ ssh -i my-key server.example.com
```

**-J**

`-J`指定跳转服务器。假定本地无法直接与 SSH 服务器通信,就可以通过`—J`指定跳转服务器。

```bash
$ ssh -J root@J1,root@J2 root@S1
```

上面示例中,本机先通过 J1,再通过 J2,登陆到 S1 服务器。

**-l**

`-l`参数指定远程登录的账户名。
Expand Down Expand Up @@ -463,30 +473,29 @@ SSH 客户端的全局配置文件是`/etc/ssh/ssh_config`,用户个人的配
用户个人的配置文件`~/.ssh/config`,可以按照不同服务器,列出各自的连接参数,从而不必每一次登录都输入重复的参数。下面是一个例子。

```bash
Host *
Port 2222

Host remoteserver
HostName remote.example.com
User neo
Port 2112

Host *
Port 2222
```

上面代码中,`Host *`表示对所有主机生效,后面的`Port 2222`表示所有主机的默认连接端口都是2222,这样就不用在登录时特别指定端口了。这里的缩进并不是必需的,只是为了视觉上,易于识别针对不同主机的设置。
上面代码中,`Host remoteserver`表示,下面的设置只对主机`remoteserver`生效。`remoteserver`只是一个别名,具体的主机由`HostName`命令指定,`User`和`Port`这两项分别表示用户名和端口。`HostName`、`User`、`Port`这三项前面的缩进并不是必需的,只是为了视觉上易于识别针对不同主机的设置。

后面的`Host *`表示对所有主机生效,`*`是一个通配符,比如`Host *.edu`表示只对一级域名为`.edu`的主机生效。这条命令下面的`Port 2222`表示所有主机的默认连接端口都是2222,这样就不用在登录时特别指定端口了。

后面的`Host remoteserver`表示,下面的设置只对主机`remoteserver`生效。`remoteserver`只是一个别名,具体的主机由`HostName`命令指定,`User`和`Port`这两项分别表示用户名和端口。这里的`Port`会覆盖上面`Host *`部分的`Port`设置
注意,当`Host *`与`Host remoteserver`下面有同一项设定时(比如两者都有`Port`设定),第一个出现的值生效。在本例中,连接`remoteserver`时,默认端口将是2112,而不是2222,如果`Host *`放在配置文件的顶部,那么默认端口将是2222

以后,登录`remote.example.com`时,只要执行`ssh remoteserver`命令,就会自动套用 config 文件里面指定的参数。
单个主机的配置格式如下。

```bash
$ ssh remoteserver
# 等同于
$ ssh -p 2112 neo@remote.example.com
```

`Host`命令的值可以使用通配符,比如`Host *`表示对所有主机都有效的设置,`Host *.edu`表示只对一级域名为`.edu`的主机有效的设置。它们的设置都可以被单个主机的设置覆盖。

### 配置命令的语法

ssh 客户端配置文件的每一行,就是一个配置命令。配置命令与对应的值之间,可以使用空格,也可以使用等号。
Expand Down Expand Up @@ -528,7 +537,7 @@ Compression = yes
- `RemoteForward 2001 server:143`:指定远程端口转发。
- `SendEnv COLOR`:SSH 客户端向服务器发送的环境变量名,多个环境变量之间使用空格分隔。环境变量的值从客户端当前环境中拷贝。
- `ServerAliveCountMax 3`:如果没有收到服务器的回应,客户端连续发送多少次`keepalive`信号,才断开连接。该项默认值为3。
- `ServerAliveInterval 300`:客户端建立连接后,如果在给定秒数内,没有收到服务器发来的消息,客户端向服务器发送`keepalive`消息。如果不希望客户端发送,这一项设为`0`。
- `ServerAliveInterval 300`:客户端建立连接后,如果在给定秒数内,没有收到服务器发来的消息,客户端向服务器发送`keepalive`消息。如果不希望客户端发送,这一项设为`0`,即客户端不会主动断开连接
- `StrictHostKeyChecking yes`:`yes`表示严格检查,服务器公钥为未知或发生变化,则拒绝连接。`no`表示如果服务器公钥未知,则加入客户端公钥数据库,如果公钥发生变化,不改变客户端公钥数据库,输出一条警告,依然允许连接继续进行。`ask`(默认值)表示询问用户是否继续进行。
- `TCPKeepAlive yes`:客户端是否定期向服务器发送`keepalive`信息。
- `User userName`:指定远程登录的账户名。
Expand Down
274 changes: 274 additions & 0 deletions docs/fail2ban.md
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
# Fail2Ban 教程

## 简介

Fail2Ban 是一个 Linux 系统的应用软件,用来防止系统入侵,主要是防止暴力破解系统密码。它是用 Python 开发的。

它主要通过监控日志文件(比如`/var/log/auth.log`、`/var/log/apache/access.log`等)来生效。一旦发现恶意攻击的登录请求,它会封锁对方的 IP 地址,使得对方无法再发起请求。

Fail2Ban 可以防止有人反复尝试 SSH 密码登录,但是如果 SSH 采用的是密钥登录,禁止了密码登录,就不需要 Fail2Ban 来保护。

Fail2Ban 的安装命令如下。

```bash
# ubuntu & Debian
$ sudo apt install fail2ban

# Fedora
$ sudo dnf install epel-release
$ sudo dnf install fail2ban

# Centos & Red hat
$ yum install fail2ban
```

安装后,使用下面的命令查看 Fail2Ban 的状态。

```bash
$ systemctl status fail2ban.service
```

如果没有启动,就启动 Fail2Ban。

```bash
$ sudo systemctl start fail2ban
```

重新启动 Fail2Ban。

```bash
$ sudo systemctl restart fail2ban
```

设置 Fail2Ban 重启后自动运行。

```bash
$ sudo systemctl enable fail2ban
```

## fail2ban-client

Fail2Ban 自带一个客户端 fail2ban-client,用来操作 Fail2Ban。

```bash
$ fail2ban-client
```

上面的命令会输出 fail2ban-client 所有的用法。

下面的命令查看激活的监控目标。

```bash
$ fail2ban-client status

Status
|- Number of jail: 1
`- Jail list: sshd
```

下面的命令查看某个监控目标(这里是 sshd)的运行情况。

```bash
$ sudo fail2ban-client status sshd

Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 9
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 0.0.0.0
```

下面的命令输出一个简要的版本,包括所有监控目标被封的 IP 地址。

```bash
$ sudo fail2ban-client banned
[{'sshd': ['192.168.100.50']}, {'apache-auth': []}]
```

下面的命令可以解封某个 IP 地址。

```bash
$ sudo fail2ban-client set sshd unbanip 192.168.1.69
```

## 配置

### 主配置文件

Fail2Ban 主配置文件是在`/etc/fail2ban/fail2ban.conf`,可以新建一份副本`/etc/fail2ban/fail2ban.local`,修改都针对副本。

```bash
$ sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
```

下面是设置 Fail2Ban 的日志位置。

```bash
[Definition]
logtarget = /var/log/fail2ban/fail2ban.log
```

修改配置以后,需要重新启动`fail2ban.service`,让其生效。

### 封禁配置

Fail2Ban 封禁行为的配置文件是`/etc/fail2ban/jail.conf`。为了便于修改,可以把它复制一份`/etc/fail2ban/jail.local`,后面的修改都针对`jail.local`这个文件。

```bash
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
```

你也可以在目录`/etc/fail2ban/jail.d`里面,新建单独的子配置文件,比如`/etc/fail2ban/jail.d/sshd.local`。

同样地,修改配置以后,需要重新启动`fail2ban.service`,让其生效。

配置文件里面,`[DEFAULT]`标题行表示对于所有封禁目标生效。举例来说,如果封禁时间修改为1天,`/etc/fail2ban/jail.local`里面可以写成:

```bash
[DEFAULT]
bantime = 1d
```

如果某人被封时,对站长发送邮件通知,可以如下设置。

```bash
[DEFAULT]
destemail = yourname@example.com
sender = yourname@example.com

# to ban & send an e-mail with whois report to the destemail.
action = %(action_mw)s

# same as action_mw but also send relevant log lines
#action = %(action_mwl)s
```

如果配置写在其他标题行下,就表示只对该封禁目标生效,比如写在`[sshd]`下面,就表示只对 sshd 生效。

默认情况下,Fail2Ban 对各种服务都是关闭的,如果要针对某一项服务开启,需要在配置文件里面声明。

```bash
[sshd]
enabled = true
```

上面声明表示,Fail2Ban 对 sshd 开启。

### 配置项

下面是配置文件`jail.local`的配置项含义,所有配置项的格式都是`key=value`。

(1)bantime

封禁的时间长度,单位`m`表示分钟,`d`表示天,如果不写单位,则表示秒。Fail2Ban 默认封禁10分钟(10m 或 600)。

```bash
[DEFAULT]
bantime = 10m
```

(2)findtime

登录失败计算的时间长度,单位`m`表示分钟,`d`表示天,如果不写单位,则表示秒。Fail2Ban 默认封禁 10 分钟内登录 5 次失败的客户端。

```bash
[DEFAULT]

findtime = 10m
maxretry = 5
```

(3)maxretry

尝试登录的最大失败次数。

(4)destemail

接受通知的邮件地址。

```bash
[DEFAULT]
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
```

(5)sendername

通知邮件的"发件人"字段的值。

(6)mta

发送邮件的邮件服务,默认是`sendmail`。

(7)action

封禁时采取的动作。

```bash
[DEFAULT]
action = $(action_)s
```

上面的`action_`是默认动作,表示拒绝封禁对象的流量,直到封禁期结束。

下面是 Fail2Ban 提供的一些其他动作。

```bash
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
```

(8)ignoreip

Fail2Ban 可以忽视的可信 IP 地址。多个 IP 地址之间使用空格分隔。

```bash
ignoreip = 127.0.0.1/8 192.168.1.10 192.168.1.20
```

(9)port

指定要监控的端口。可以设为任何端口号或服务名称,比如`ssh`、`22`、`2200`等。

### ssh 配置

下面是 sshd 的设置范例。

```bash
[sshd]
enabled = true
port = ssh
filter = sshd
banaction = iptables
backend = systemd
maxretry = 5
findtime = 1d
bantime = 2w
ignoreip = 127.0.0.1/8
```

首先需要注意,为了让 Fail2Ban 能够完整发挥作用,最好在`/etc/ssh/sshd_config`里面设置`LogLevel VERBOSE`,保证日志有足够的信息。

Loading

AltStyle によって変換されたページ (->オリジナル) /