跳到主要内容

12 篇博文 含有标签「Linux」

查看所有标签

免密远程执行命令

· 阅读需 1 分钟
ssh-keygen -t rsa # 分别在两台电脑上运行此命令, 生成密匙
scp -p ~/.ssh/id_rsa.pub root@IP:/root/.ssh/authorized_keys # 上传本地公钥到服务器
ssh root@IP "cd /home; ls" # 远程执行命令

Iptables 实践指南

· 阅读需 8 分钟

iptables

1. 表与链

  • iptables是4表伍链
  • 4表:filter表 nat表 raw表 mangle表
  • 伍链:INPUT OUTPUT FORWARD PREROUTING POSTROUTING

2. 表的说明

2.1 filter表
  • 防火墙:屏蔽或准许 端口 ip
filter表强调:主要和主机自身相关,真正负责主机防火墙功能(过滤流入流出主机的数据包)filter表示iptables默认使用的表,这个表定义了三个链(chains)企业工作场景:主机防火墙
INPUT负责过滤所有目标地址是本机地址的数据包,通俗来说:就是过滤进入主机的数据包
FORWARD负责转发刘静主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍LVS NAT模式,net.ipv4.ip_forward=0
OUTPUT处理所有源地址是本机地址的数据包,通俗来讲:就是处理从主机发出的数据包。
2.2 nat表
  • 实现nat功能
    • 实现共享上网(内网服务器上外网)
    • 端口映射和ip映射
nat负责网络地址转换的,即来源与目的IP地址和port的转换。
应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。
工作场景:
1. 用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)
2. 做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING)
3. WEB,单个端口的映射,直接映射80端口(PREOUTING)这个表定义了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似。
OUTPUT和主机放出去的数据包有关,改变主机发出数据包的目的地址。
PREROUTING在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等
例如:把公网IP:XXX.XXX.XXX.XXX映射到局域网的XX.XX.XX.XX服务器上。
如果是web服务,可以将80转换为局域网的服务器9000端口上
POSTROUTING在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。
例如:默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址。
生产应用:局域网共享上网。

3. 环境准备及命令

3.1 iptables 服务安装,环境配置
# 安装服务
yum install -y iptables-servicesR

# 加载防火墙相关模块到内核中
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF

# 关闭系统自带的firewalld防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

# 启动iptables,并添加开机自动启
systemctl start iptables.service
systemctl enable iptables.service
3.2 iptables 相关命令
# 查看iptables规则
iptables -nL

参数含义
-L显示表中的所有规则
-n不要把端口或ip反向解析为服务名或域名
-t指定表 不指定时默认是filter表
-Aappend追加 加入准许类规则 使用-A
-Ddelete 删除 -D INPUT 1
-Iinsert 拒绝类规则放在所有规则最上面 拒绝类 -I

参数含义
-p协议protocal tcp/udp/icmp/all
--dport目标端口 dest destination 指定端口 加上协议-p tcp
--sport源端口 source源
-s--source 源ip
-d--destination 目标ip
-m指定模块 multiport
-iinput 输入的时候 从哪个网卡进来
-ooutput输出的时候 从哪个网卡出去

参数含义
-j满足条件后的动作:DROP/ACCEPT/REJECT
DROP REJECT 拒绝
DROP 把数据丢掉 不会返回信息给 用户
REJECT 拒绝 返回拒绝信息

参数含义
-F清除所有规则,不会处理默认的规则
-X删除用户自定义的链
-Z链的计数器清零 (数据包计数器与数据包字节计数器)

3.3 配置filter表规则
  • 正式配置之前先清空规则
iptables -F
iptables -X
iptables -Z
3.3.1 禁止访问22端口
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
3.3.2 显示规则编号
iptables -nL --lint-number
3.3.3 删除第1编号的规则
iptables -D INPUT 1   # 精确删除规则,可以用此方法
3.3.4 封ip 屏蔽某个ip(属于源ip)
iptables -I INPUT -s 10.0.0.7 -j DROP
3.3.5 禁止网段连入(禁止10.0.0.0/24网段访问 8888 端口)
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP
3.3.6 只允许指定网段连入(允许10.0.0.0网段)
# 方法1:利用 ! 
# 只准许 10.0.0.0/24 访问,除了10.0.0.0/24 都拒绝
iptables -I INPUT ! -s 10.0.0.0/24 -j DROP

# 方法2: 修改链默认规则 修改为拒绝 添加准许
# 先配置准许规则,再修改默认规则,不然会将自己屏蔽
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -P INPUT DROP

# 将默认规则改回允许
iptables -P INPUT ACCEPT
3.3.7 指定多个端口拒绝访问(拒绝8888 9999)
iptables -I INPUT -P tcp --dport 8888 -j DROP
iptables -I INPUT -p tco --dport 9999 -j DROP
3.3.8 同时指定多个端口拒绝访问(拒绝80和443)
iptables -I INPUT -p tcp -m multiport 80,443 -j DROP
3.3.9 同时指定连续端口拒绝访问(1到1024)
# 如果是连续端口,可以不加-m multiport
iptables -I INPUT -p tcp --dport 1:1024 -j DROP

4. 匹配ICMP类型

  • ICMP (Internet Control Message Protocol) Internet控制报文协议 ping
  • 整个网站的核心部分可以拒绝ping
4.1 通过防火墙规则,控制禁止被ping
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
4.2 通过内核参数,控制禁止被ping
# 修改为1,禁止被ping;修改为0,允许被ping
[root@m01 ~]# cat /etc/sysctl.conf
#/proc/sys/net/ipv4/icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_all = 1

# sysctl -p 生效
[root@m01 ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
4.3 匹配网络状态(TCP/IP连接状态)
  • -m state --state

    NEW:已经或将启动新的连接

    ESTABLISHED:已建立的连接

    RELATED:正在启动的新连接

    INVALID:非法或无法识别的

    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
4.4 限制并发及速率
  • -m limit 限制模块
# 前5个正常,之后按每6秒的速度生成数据包,--limit-burst后不接数字时默认为5
iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport -j ACCEPT
iptables -P INPUT DROP

5. 防火墙规则的保存与恢复

  • iptables-save 默认输出到屏幕,后接文件可备份规则到文件

  • iptables-restore 后接文件标准输入 可恢复规则

    # 写入到/etc/sysconfig/iptables
    iptables-save >/etc/sysconfig/iptables

    # 从备份文件恢复规则
    iptables-restore </etc/sysconfig/iptables

    # systemctl restart iptables 时将默认从/etc/sysconfig/iptables读取配置,如果手动用iptables-restore恢复可以指定任意备份文件

6. 实际生产用法

# 允许22端口访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许本机回环lo接口数据流量流出与流入
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 放行80 443端口
iptables -A INPUT -m multiport -p tcp --dport 443,80 -j ACCEPT

# 配置默认规则
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许需要的网段访问,包括VPN网段
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT

# 添加网络状态
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 配置完成后保存配置
iptables-save >/root/online.iptables

7. nat

  • 共享上网
  • 端口转发/端口映射
  • ip映射
7.1 查看nat表
iptables -t nat -nL
7.2 共享上网
# 修改的是POSTROUTING链      源ip是172.16.1.0/24  经过防火墙处理  修改为10.0.0.61
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61

# 修改eth0,将ONBOOT=yes改为NOBOOT=no

# 修改eth1,增加GATEWEY=172.16.1.61;增加DNS1=223.5.5.5

#重启网卡

# 修改/etc/sysctl.conf
net.ipv4.ip_forward = 1

# 重新载入sysctl变量
sysctl -p
7.3 端口映射
# 将10.0.0.61的9000 转发为 172.16.1.7:22
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22

# 测试 [d:\~]$ ssh root@10.0.0.61 9000 相当于ssh root@172.16.1.7 22
7.4 ip映射
# 将10.0.0.62 映射为 172.16.1.7
iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7

Tomcat多实例部署及故障排查

· 阅读需 8 分钟

1. 单台虚拟机部署3个tomcat多实例jpress-v3.0.6

1.1 解压tomcat包

[root@tomcat tomcat]# tar xf /app/tools/apache-tomcat-8.5.50.tar.gz 

1.2 复制3个tomcat实例

[root@tomcat tomcat]# cp -r apache-tomcat-8.5.50/ tomcat_8081
[root@tomcat tomcat]# cp -r apache-tomcat-8.5.50/ tomcat_8082
[root@tomcat tomcat]# cp -r apache-tomcat-8.5.50/ tomcat_8083

1.3 修改3个tomcat实例的端口,进行区分

[root@tomcat tomcat]# sed -i.bak 's#8080#8081#g' tomcat_8081/conf/server.xml
[root@tomcat tomcat]# sed -i.bak 's#8005#8006#g' tomcat_8081/conf/server.xml
[root@tomcat tomcat]# sed -i.bak 's#8009#8010#g' tomcat_8081/conf/server.xml
[root@tomcat tomcat]# sed -i.bak 's#8080#8082#g' tomcat_8082/conf/server.xml
[root@tomcat tomcat]# sed -i.bak 's#8005#8007#g' tomcat_8082/conf/server.xml
[root@tomcat tomcat]# sed -i.bak 's#8009#8011#g' tomcat_8082/conf/server.xml
[root@tomcat tomcat]# sed -i.bak 's#8080#8083#g' tomcat_8083/conf/server.xml
[root@tomcat tomcat]# sed -i.bak 's#8005#8008#g' tomcat_8083/conf/server.xml
[root@tomcat tomcat]# sed -i.bak 's#8009#8012#g' tomcat_8083/conf/server.xml

1.4 将3个tomcat实例包移动到/app下

[root@tomcat tomcat]# mv tomcat_808* /app/

1.5 启动3个tomcat实例

[root@tomcat tomcat]# /app/tomcat_8081/bin/startup.sh 
Using CATALINA_BASE: /app/tomcat_8081
Using CATALINA_HOME: /app/tomcat_8081
Using CATALINA_TMPDIR: /app/tomcat_8081/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat_8081/bin/bootstrap.jar:/app/tomcat_8081/bin.jar
Tomcat started.
[root@tomcat tomcat]# /app/tomcat_8082/bin/startup.sh
Using CATALINA_BASE: /app/tomcat_8082
Using CATALINA_HOME: /app/tomcat_8082
Using CATALINA_TMPDIR: /app/tomcat_8082/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat_8082/bin/bootstrap.jar:/app/tomcat_8082/bin.jar
Tomcat started.
[root@tomcat tomcat]# /app/tomcat_8083/bin/startup.sh
Using CATALINA_BASE: /app/tomcat_8083
Using CATALINA_HOME: /app/tomcat_8083
Using CATALINA_TMPDIR: /app/tomcat_8083/temp
Using JRE_HOME: /app/jdk
Using CLASSPATH: /app/tomcat_8083/bin/bootstrap.jar:/app/tomcat_8083/bin.jar
Tomcat started.

1.6 查看3个tomcat实例的端口

[root@tomcat webapps]# ss -lntup | grep java
tcp LISTEN 0 1 ::ffff:127.0.0.1:8007 :::* users:(("java",pid=58100,fd=79))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8008 :::* users:(("java",pid=58157,fd=79))
tcp LISTEN 0 100 :::8010 :::* users:(("java",pid=58041,fd=58))
tcp LISTEN 0 100 :::8011 :::* users:(("java",pid=58100,fd=58))
tcp LISTEN 0 100 :::8012 :::* users:(("java",pid=58157,fd=58))
tcp LISTEN 0 100 :::8081 :::* users:(("java",pid=58041,fd=53))
tcp LISTEN 0 100 :::8082 :::* users:(("java",pid=58100,fd=53))
tcp LISTEN 0 100 :::8083 :::* users:(("java",pid=58157,fd=53))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8006 :::* users:(("java",pid=58041,fd=79))

1.7 分别部署3个tomcat实例的jpress-v3.0.6

软件包存放路径为:/app/tomcat_8081/webapps/

1.8 远程数据库部署

# 创建3个数据库
mysql> create database jpress_8081;
mysql> create database jpress_8082;
mysql> create database jpress_8083;

# 创建用户jpress并授权
mysql> grant all on *.* to jpress@'%' identified by '123456';

2. 故障案例:tomcat负载高排查方法

2.1 找出问题进程

# 利用top命令找到CPU/MEM(根据实际需求选择)找到负载最高的进程,并记录PID号,如下例中则为58100
[root@tomcat ~]# top
top - 19:50:00 up 16:26, 2 users, load average: 0.02, 0.04, 0.05
Tasks: 106 total, 1 running, 105 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2028116 total, 64292 free, 1338380 used, 625444 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 472492 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
58100 root 20 0 3159080 354528 13684 S 0.3 17.5 0:22.81 java
1 root 20 0 125972 4468 2620 S 0.0 0.2 0:17.71 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:01.62 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.29 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:04.11 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain

2.2 通过进程PID找出是哪个java问题线程

# 利用top -Hp  PID 查找负载最高的线程,如下例中的58111
[root@tomcat ~]# top -Hp 58100
top - 19:53:13 up 16:29, 2 users, load average: 0.00, 0.02, 0.05
Threads: 85 total, 0 running, 85 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 0.3 sy, 0.0 ni, 98.3 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 2028116 total, 73444 free, 1345008 used, 609664 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 466180 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
58111 root 20 0 3159080 354588 13684 S 0.7 17.5 0:02.33 java
58100 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.00 java
58101 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.55 java
58102 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.25 java
58103 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.23 java
58104 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.62 java
58105 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.01 java
58106 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.01 java
58107 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.00 java
58108 root 20 0 3159080 354588 13684 S 0.0 17.5 0:06.92 java
58109 root 20 0 3159080 354588 13684 S 0.0 17.5 0:01.58 java
58110 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.00 java
58112 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.20 java
58113 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.00 java
58114 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.13 java
58115 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.13 java
58119 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.37 java
58130 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.16 java
58131 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.13 java
58132 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.07 java
58133 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.12 java
58144 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.15 java
58145 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.14 java
58146 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.00 java
58147 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.13 java
60193 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.00 java
60196 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.00 java
60198 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.00 java
60201 root 20 0 3159080 354588 13684 S 0.0 17.5 0:00.02 java

2.3 将问题线程的pid号转换为16进制

[root@tomcat ~]# echo 'obase=16;58111' | bc
E2FF

2.4 利用jstack配合grep过滤出并显示问题进程的详细信息

# jstack 问题进程PID | grep -i 问题线程PID(16进制数)
[root@tomcat ~]# jstack 58100 | grep -i E2FF
"VM Periodic Task Thread" os_prio=0 tid=0x00007efc3c0c5800 nid=0xe2ff waiting on condition
说明:筛选出的信息可以提供开发人员查看排查问题

2.5 利用jmap显示对应PID的jvm内存使用情况

[root@tomcat ~]# jmap -heap 58100
Attaching to process ID 58100, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.241-b07

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 520093696 (496.0MB)
NewSize = 11010048 (10.5MB)
MaxNewSize = 173015040 (165.0MB)
OldSize = 22544384 (21.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
capacity = 125304832 (119.5MB)
used = 61121864 (58.29035186767578MB)
free = 64182968 (61.20964813232422MB)
48.77853712776216% used
From Space:
capacity = 23068672 (22.0MB)
used = 10506912 (10.020172119140625MB)
free = 12561760 (11.979827880859375MB)
45.54623690518466% used
To Space:
capacity = 22544384 (21.5MB)
used = 0 (0.0MB)
free = 22544384 (21.5MB)
0.0% used
PS Old Generation
capacity = 35651584 (34.0MB)
used = 13678312 (13.044654846191406MB)
free = 21973272 (20.955345153808594MB)
38.36663190056296% used

25267 interned Strings occupying 2605064 bytes.

2.6 导出jvm内存内容

[root@tomcat ~]# jmap -dump:format=b,file=/root/tomcat.bin 58100
Dumping heap to /root/tomcat.bin ...
File exists
[root@tomcat ~]# ll /root/tomcat.bin
-rw------- 1 root root 69961630 Feb 10 17:48 /root/tomcat.bin

2.7 导出的文件可以用MemoryAnalyzer打开进行分析