Rootop 服务器运维与web架构

2024-06-18
发表者 Venus
非对称路由已关闭评论

非对称路由

ubuntu双网卡,网卡1为一个网段(192.168.1.10),网卡2为另一个网段(192.168.2.10),网卡2不配置网关,通过网卡2的ip连接服务器ssh服务,为什么可以连接?

在 Ubuntu 系统中,如果有两个网卡 (NICs),每个网卡连接到不同的网络,并且只有一个网卡配置了网关,那么通过未配置网关的网卡进行连接时,数据包的返回路径可能会通过配置了网关的网卡返回。
这通常被称为 “异路由” 或 “非对称路由”。

# 解释

网卡1 (eth0): IP 192.168.1.10/24, 网关 192.168.1.1
网卡2 (eth1): IP 192.168.2.10/24, 没有配置网关

# 连接过程
从外部网络的某个主机 (IP 192.168.6.20) 尝试通过 eth1 (192.168.2.10) 连接到服务器的 SSH 服务。
外部主机发送一个 SSH 请求到 192.168.2.10。这个数据包到达 eth1 并被处理。
服务器收到数据包并生成响应。

# 数据包的返回路径
由于 eth1 没有配置网关,默认情况下,服务器会根据其路由表决定如何返回数据包。
路由表中通常有一个默认网关指向 eth0 的网关 192.168.1.1。
如果没有特定路由指向 192.168.6.20,服务器会通过 eth0 上的默认网关将响应包发回。

可以使用 ip route show 查看路由表:
输出如下:

default via 192.168.1.1 dev eth0 proto static metric 100 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 metric 100 
192.168.2.0/24 dev eth1 proto kernel scope link src 192.168.2.10 metric 100 

在这种配置中,没有明确的路由指向 192.168.6.20,默认路由通过 192.168.1.1。

# 解决办法,策略路由
将从192.168.2.10发出的数据从192.168.2.1网关发送出去。

ip rule add from 192.168.2.10/32 table 100
ip route add default via 192.168.2.1 dev eth1 table 100

这样配置后两个网卡都可以用,并且实现了源进源出。

注意:
在linux发行版中要注意rp_filter内核参数,像centos默认会设置为1,严格模式,禁止进出路径不一致,而ubuntu默认为2,宽松模式,即数据包只要能回即可。

此问题对应华为usg防火墙中的源进源出。

2024-06-18
发表者 Venus
反向路径检查rp_filter已关闭评论

反向路径检查rp_filter

# ip为自动获取时的路由表
[root@localhost ~]# ip route show
default via 192.168.11.1 dev ens33 proto dhcp src 192.168.11.68 metric 100 
default via 192.168.12.1 dev ens36 proto dhcp src 192.168.12.28 metric 101 
192.168.11.0/24 dev ens33 proto kernel scope link src 192.168.11.68 metric 100 
192.168.12.0/24 dev ens36 proto kernel scope link src 192.168.12.28 metric 101 

# ip为固定时的路由表
[root@localhost ~]# nmcli connection modify Wired\ connection\ 1 ipv4.method manual ipv4.addresses 192.168.11.68/24 ipv4.gateway 192.168.11.1 ipv4.dns 114.114.114.114 connection.autoconnect yes
[root@localhost ~]# nmcli connection modify Wired\ connection\ 2 ipv4.method manual ipv4.addresses 192.168.12.28/24 ipv4.gateway 192.168.12.1 ipv4.dns 114.114.114.114 connection.autoconnect yes
把网卡down再up查看
[root@localhost ~]# ip route show
default via 192.168.11.1 dev ens33 proto static metric 100 
default via 192.168.12.1 dev ens36 proto static metric 101 
192.168.11.0/24 dev ens33 proto kernel scope link src 192.168.11.68 metric 100 
192.168.12.0/24 dev ens36 proto kernel scope link src 192.168.12.28 metric 101 

可以看到不管自动还是手动指定ip默认路由是从192.168.11.1网关走。

本机电脑ip为 192.168.6.100,本机和目标机器通过三层交换机连接。

本机ping 192.168.11.68是通的,但是ping 192.168.12.28不通。
原因就是因为almalinux(ID_LIKE=”rhel centos fedora”)默认开启反向路径检查 – Reverse Path Filtering(rp_filter)

# 查看内核参数
[root@localhost ~]# sysctl -a |grep -w rp_filter
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.ens33.rp_filter = 1
net.ipv4.conf.ens36.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1

rp_filter是Linux Kernel以及众多网络设备采用的一种保护机制,以用来检查收到的数据包的原地址是否可路由。
开启rp_filter功能时,当服务器收到一个数据包之后,将此数据包的源地址和目的地址对调后也就是构建的响应数据包,
通过查找路由表之后发现响应包依然从收到数据包的网卡发送回去,则表示此消息通过了rp_filter的检测。

此内核参数有3个值:
0 关闭反向路由校验
1 严格模式,对每一个进来的数据包,如果反向路由不是通过收到数据的包接口,校验失败后收到的数据包丢弃
2 宽松模式,对每个进来的数据包,校验源地址是否可达,如果反向路由可以通过任何接口到达,那么校验成功,否则校验失败后数据包丢失

# 测试开关脚本
[root@localhost ~]# cat rp.sh
if [ "$1" == "stop" ]; then
	sysctl -w net.ipv4.conf.all.rp_filter=0
	sysctl -w net.ipv4.conf.default.rp_filter=0
	sysctl -w net.ipv4.conf.ens33.rp_filter=0
	sysctl -w net.ipv4.conf.ens36.rp_filter=0
	sysctl -w net.ipv4.conf.lo.rp_filter=0
else
	sysctl -w net.ipv4.conf.all.rp_filter=1
	sysctl -w net.ipv4.conf.default.rp_filter=1
	sysctl -w net.ipv4.conf.ens33.rp_filter=1
	sysctl -w net.ipv4.conf.ens36.rp_filter=1
	sysctl -w net.ipv4.conf.lo.rp_filter=1
fi
[root@localhost ~]# bash rp.sh stop

当关闭检查时(设置为0),2个ip都可以ping通了,也可以通过这2个ip连接ssh服务。

在不同的linux发行版中,此值可能不同。在ubuntu系统中,此值默认为2,即宽松模式。

https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
目前RFC3704推荐启用严格模式以防止DDos攻击对IP欺骗的攻击。
如果使用非对称路由或其他复杂的路由,则推荐使用宽松模式。

非对称路由
非对称路由是指发送和接收数据包时,分别使用了主机和目的地设备之间两条不同的路径。
参考:https://blog.csdn.net/chiyuwei1766/article/details/50706306

2024-06-12
发表者 Venus
sftp非交互式自动上传文件已关闭评论

sftp非交互式自动上传文件

通过秘钥认证,上传文件到sftp服务器。
比如sftp登录后有4个根目录 nj on pa wv,把同一个文件传到4个目录中可以用如下命令:

echo "put /data/rsi/mi/void.2024-06-11.csv /NJ/" | sftp -P 3322 -i /root/.ssh/rsi-sftp-pri upload_user@18.210.x.x
echo "put /data/rsi/mi/void.2024-06-11.csv /ON/" | sftp -P 3322 -i /root/.ssh/rsi-sftp-pri upload_user@18.210.x.x
echo "put /data/rsi/mi/void.2024-06-11.csv /PA/" | sftp -P 3322 -i /root/.ssh/rsi-sftp-pri upload_user@18.210.x.x
echo "put /data/rsi/mi/void.2024-06-11.csv /WV/" | sftp -P 3322 -i /root/.ssh/rsi-sftp-pri upload_user@18.210.x.x

/data/rsi/mi 为本地路径
/NJ/ 为sftp中的路径
通过echo后避免了交互式,达到自动上传目的。

2024-05-29
发表者 Venus
zabbix6.4配置执行远程命令已关闭评论

zabbix6.4配置执行远程命令

在zabbix6.4版本中(其它版本未测),动作中的操作默认是 “发送消息” ,没有以前版本中执行”远程命令”的选项。


此版本的配置方式发生变化,需要先在 “告警” – “脚本” 中创建脚本。
名称:脚本名,可以中文。
范围:动作操作
类型:脚本
执行在:zabbix客户端
命令:即要执行的命令,比如:

sudo date > /tmp/stat.txt
sudo netstat -tnlp >> /tmp/stat.txt
whoami >> /tmp/stat.txt
sudo docker start rgs

某些命令可能需要sudo权限,需要提前在agent机器上配置好sudoers,这里测试直接给最高。

[root@localhost etc]# cat /etc/sudoers | grep zabbix
zabbix ALL=(ALL) NOPASSWD:ALL

当添加完脚本后,在动作中,操作 里就有了下拉列表,可以选择刚添加的脚本。

# agent配置
在zabbix_agentd.conf中添加配置,允许执行命令。

AllowKey=system.run[*]

重启zabbix agent。

如果不配置,在执行远程命令时会提示 Unsupported item key

正常执行:

2024-05-09
发表者 Venus
rsyslog通过发送者来源ip区分日志路径已关闭评论

rsyslog通过发送者来源ip区分日志路径

[root@localhost ~]# cat /etc/rsyslog.conf | grep -Ev "^#|^$"
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

# 定义一个模版
$template IpTemplate,"/var/log/usg/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log"
:fromhost-ip, !isequal, "127.0.0.1" ?IpTemplate
& ~  # &符号表示已经匹配处理的内容,~符号表示再也不进行其余处理

这样客户端发送过来的日志,rsyslog会根据源ip创建一个文件夹来保存日志。

测试:
通过logger命令测试发送日志
机器1:
logger -n 192.168.6.205 -p user.info "from server 1"

机器2:
logger -n 192.168.6.205 -p user.info "from server 2"

适合多个网络设备集中收集日志。