date 查看当前系统的时间
w查看系统负载
第一行,从左面开始显示的信息依次为:时间,系统运行时间,登录用户数,平均负载。
第二行,开始以及下面所有的行,告诉我们的信息是,当前登录的都有哪些用户,以及他们是从哪里登录的等等。我们最应该关注的应该是第一行中的 ‘load average:’ 后面的三个数值。
第一个数值表示1分钟内系统的平均负载值;第二个数值表示5分钟内系统的平均负载值;第三个数值表示15分钟系统的平均负载值。
这个值的意义是,单位时间段内CPU活动进程数。当然这个值越大就说明你的服务器压力越大。
一般情况下这个值只要不超过服务器的cpu数量就没有关系,如果服务器cpu数量为1,那么这个值若小于1,就说明当前服务器没有压力,否则就要关注一下了。
查看逻辑cpu命令:cat /proc/cpuinfo 看第一行processor 如果是0就证明他有1个cpu 是2就证明他有3个cpu 逻辑cpu不是物理cpu
vmstat命令
vmstat:监控系统的状态
w查看的是系统整体上的负载,通过看那个数值可以知道当前系统有没有压力,但是具体是哪里(CPU, 内存,磁盘等)有压力就无法判断了。通过 vmstat 就可以知道具体是哪里有压力。
命令:vmstat 1 每1秒以动态的形式显示一次 按ctrl+c结束。也可以后边跟一个数字,代表只显示的次数,例如:vmstat 1 5 这个就是每一秒显示1次只让他显示5次,如下图:
每一列分别表示什么意思:重点关注:r、b、swpd、si、so、bi、bo、us、wa。
1.procs 显示进程相关信息
r :表示运行和等待cpu时间片的进程数,如果长期大于服务器cpu的个数,则说明cpu不够用了;
b :表示等待资源的进程数,比如等待I/O, 内存等,这列的值如果长时间大于1,则需要关注一下了;
2.memory 内存相关信息
swpd :表示切换到交换分区中的内存数量 ;如果他的数值一直在变化那证明他的内存不够了
free :当前空闲的内存数量;
buff :缓冲大小,(即将写入磁盘的);
cache :缓存大小,(从磁盘中读取的);
3.swap 内存交换情况
si :由交换区swap写入到内存的数据量;单位kb
so :由内存写入到交换区的数据量;从内存里出来的
4.io 磁盘使用情况
这两个频繁的变证明他们在频繁的读写
bi :从块设备读取数据的量(读磁盘);从磁盘里出来进入到内存里边去
bo: 从块设备写入数据的量(写磁盘);
5.system 显示采集间隔内发生的中断次数
in :表示在某一时间间隔中观测到的每秒设备中断数;
cs :表示每秒产生的上下文切换次数;
6.CPU 显示cpu的使用状态
us :显示了用户下所花费 cpu 时间的百分比;长时间大于50%说明资源不够了
sy :显示系统本身花费cpu时间百分比;
id :表示cpu处于空闲状态的时间百分比;
wa :表示I/O等待所占用cpu时间百分比;
st :表示被偷走的cpu所占百分比(一般都为0,不用关注);
us+sy+id=100%
top命令
显示进程所占系统资源 q退出来
top命令打印出了很多信息,包括系统负载(loadaverage)、进程数(Tasks)、cpu使用情况、内存使用情况以及交换分区使用情况。
top:这个命令用于动态监控进程所占系统资源,每隔3秒变一次。这个命令的特点是把占用系统资源(CPU,内存,磁盘IO等)最高的进程放到最前面。
第一行:跟w命令查看的一样表示:时间,系统运行时间,几个用户登录,系统负载
第二行:进程状态。total进程总数,running进程运行数,sleeping休眠的进程,stopped停止的进程,zombie僵尸进程
第三行:cpu百分比。
第四行:物理内存。total总内存数值,free剩余内存,used使用大小,
第五行:交换分区。
你关注的也就是几项:%CPU, %MEM, COMMAND
%CPU:为CPU使用情况,默认情况下按cpu使用情排序
RES:物理内存大小(单位:KiB)
COMMAND:进程名字
%MEM:为使用内存百分比。在 top 状态下,按 “shift + m”, 可以按照内存使用大小排序。shift+p换回来。
按数字 ‘1’ 可以列出所有cpu的使用状态。%Cpu(s)证明是一颗cpu
命令:top -c 查看具体的命令全局路径以及使用情况
命令:top -bn1 静态的显示全局的系统资源使用情况。一般在写脚本的时候使用。
sar监控系统状态
安装sar命令: yum install -y sysstat
生成的历史文件所在的目录
ls /var/log/sa sar的特性是每10分钟他会把系统的状态过滤一遍保存在历史文件里,这个历史文件正好在/var/log/sa目录里,这个文件下的历史记录只能保持一个月 还有一个ls /var/log/sar 他们的区别是/var/log/sa是个二进制文件你不能用cat来查看它的内容,而/var/log/sar能查看内容,第二天才会生成前一天的sar
命令:sar -n DEV 查看网卡流量
加上参数:sar -n DEV 1 3 每1秒钟显示一次,一共显示3次
IFACE这列表示设备名称
rxpck/s 表示每秒接收到的包的数量,几千是正常的,上万不正常
txpck/s 表示每秒发送出去的包的数量,
rxbyt/s 表示每秒收取的数据量(单位Byte),
txbyt/s表示每秒发送的数据量。
命令:-f 指定查看看指定某一天网卡流量历史。
例如:sar -n DEV -f /var/log/sa/sa07 查看7号的流量,后边sa07指的是那一天的,sar会以日期号为结尾保存,最多保存一个月的。
命令:sar -q 查看历史负载 sar -q -f /var/log/sa07查看指定某天的负载
命令:sar -b 查看磁盘的(读写)
[root@aaa-01 ~]# sar -b 1 3 Linux 3.10.0-693.el7.x86_64 (aaa-01) 2018年06月07日 _x86_64_ (1 CPU) 21时05分59秒 tps rtps wtps bread/s bwrtn/s 21时06分00秒 0.00 0.00 0.00 0.00 0.00 21时06分01秒 0.00 0.00 0.00 0.00 0.00 21时06分02秒 0.00 0.00 0.00 0.00 0.00 平均时间: 0.00 0.00 0.00 0.00 0.00
nload命令
nload动态的显示网卡的页面
先安装:两个包,yum install -y epel-release yum install -y nload
直接敲命令:nload
第一行,网卡的数量,按左右方向键可以切换网卡,按 q 退出。
第二行,一次是,当前值、平均值、最小值、最大值。
通常我们买带宽都是买出去的带宽
监控io性能
命令:iostat -x 磁盘使用 主要查看%util 这个是显示你等待磁盘io的百分比
[root@aaa-01 ~]# iostat -x Linux 3.10.0-693.el7.x86_64 (aaa-01) 2018年06月08日 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.05 0.00 0.13 0.03 0.00 99.79 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.01 0.21 0.12 5.52 3.37 53.41 0.01 16.08 7.57 30.30 2.26 0.08 sdb 0.00 0.00 0.00 0.00 0.06 0.00 45.16 0.00 2.25 2.25 0.00 2.06 0.00 scd0 0.00 0.00 0.00 0.00 0.03 0.00 114.22 0.00 25.22 25.22 0.00 23.89 0.00
命令:iotop 动态排序显示进程使用io的情况,安装yum install -y iotop
free 查看内存使用情况
命令:free 直接回车,可以显示当前系统的总内存大小以及使用内存的情况
数据的流向不一样,内存使用的角色也不一样,因为磁盘与cpu互相传数据会很慢,所以先把数据放到内存里,然后再从内存里读取数据 cache:磁盘(000:数据)→内存(cache)→CPU buff:CPU(000数据)→内存(buffer)→磁盘
命令:free -m 指定它显示的单位为兆
[root@aaa-01 ~]# free -m total used free shared buff/cache available Mem: 984 126 528 6 329 674 Swap: 2047 0 2047
命令:free -h 在具体的数字后边加上单位
[root@aaa-01 ~]# free -h total used free shared buff/cache available Mem: 984M 126M 528M 6.8M 329M 674M Swap: 2.0G 0B 2.0G
公式:total=used+free+buff/cache 总用量=已用量+剩余+缓冲/缓存
avaliable包含free和buff/cache没用完剩余部分
ps 查看系统进程
命令:ps aux 把你系统里边所有的进程列出来
命令:ps aux |grep 检查系统中一个进程有没有运行。例如:ps aux |grep nginx、ps aux |grep mysql
命令:ps aux |grep -c 查看一个进程的数量。
命令:ps -elf 结果跟ps aux相似
PID :进程的id,这个id很有用,在linux中内核管理进程就得靠pid来识别和管理某一个程,比如我想终止某一个进程,则用 ‘kill进程的pid 有时并不能杀掉,则需要加一个-9选项了 kill -9 进程pid
STAT :表示进程的状态,进程状态分为以下几种(不要求记住,但要了解)
D:不能中断的进程(通常为IO)
R:run正在运行中的进程
S:sleep已经中断的进程,通常情况下,系统中大部分进程都是这个状态
T:已经停止或者暂停的进程,如果我们正在运行一个命令,比如说 sleep 10 如果我们按一下ctrl -z 让他暂停,那么我们用ps查看就会显示T这个状态
W:这个好像是说,从内核2.6xx 以后,表示为没有足够的内存页分配
X:已经死掉的进程(这个好像从来不会出现)
Z:僵尸进程,杀不掉,打不死的垃圾进程,占系统一小点资源,不过没有关系。如果太多,就有问题了。一般不会出现。
<:高优先级进程
N:低优先级进程
L:在内存中被锁了内存分页
s:主进程
l:多线程进程。有一个进程有多个线程。
+:代表在前台运行的进程
线程由一个大的进程组成的,一个进程里边有多个线程
netstat 监控系统状态
netstat:查看网络状态,查看tcpip的一个状态
命令:netstat -lnp 显示当前系统监听着哪些端口
[root@aaa-01 ~]# netstat -nlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 893/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 998/master tcp6 0 0 :::22 :::* LISTEN 893/sshd tcp6 0 0 ::1:25 :::* LISTEN 998/master udp 0 0 127.0.0.1:323 0.0.0.0:* 546/chronyd udp6 0 0 ::1:323 :::* 546/chronyd raw6 0 0 :::58 :::* 7 590/NetworkManager
命令:netstat -an 查看系统所有网络连接状况
命令:netstat -lntp 只看tcp的,不包含socket
[root@aaa-01 ~]# netstat -ltnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 893/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 998/master tcp6 0 0 :::22 :::* LISTEN 893/sshd tcp6 0 0 ::1:25 :::* LISTEN 998/master
命令:netstat -lunp只查看udp的
[root@aaa-01 ~]# netstat -lunp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 127.0.0.1:323 0.0.0.0:* 546/chronyd udp6 0 0 ::1:323 :::* 546/chronyd
命令:ss -an 跟netstat异曲同工,缺点是不能显示进程的名字。
状态:TIME_WAIT 客户端与服务端两台机器,相互通信完之后,他们的链接还没断开,处于一种相互等待的状态,等待这两个机器再一次连接传输数据
命令:netstat -an |awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}' 查看所有状态用数字列出来
如果ESTABLISHED很大,证明你的系统很忙,这个数据表示有多少个客户端在和服务端进行通信
tcptump 抓包工具
安装:yum install -y tcpdump
在你判断你的服务器上有流量***时,使用抓包工具来抓一下包,就知道那些IP在***你了。
命令:tcpdump -nn 两个n表示IP地址和端口号,不加-nn的话它显示的是名字,你分不清是哪个。
命令:tcpdump -nn -i ens33 加上网卡的名字
命令:tcpdump -nn port 指定端口,例如ens33网卡的22端口,tcpdump -nn -i ens33 port 22
命令:tcpdump -nn not port 不要某个端口,例如ens33网卡的22端口,tcpdump -nn -i ens33 not port 22
命令:tcpdump -nn -i ens33 not port 22 and host 192.168.0.100 不要某个端口并且只要一个指定IP的。
命令:tcpdump -nn -c 指定抓包的个数。比如只要100个:tcpdump -nn -i ens33 -c 100
命令:tcpdump -nn -w 把抓到的包存到一个文件里去(文件名字可以自己取)。例如:tcpdump -nn -i ens33 -c 10 -w /tmp/1.cap
[root@aaa-01 ~]# tcpdump -nn -i ens33 -c 10 -w /tmp/1.cap tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes 10 packets captured 10 packets received by filter 0 packets dropped by kernel
可以用file命令查看它的信息,但是不能查看内容:file /tmp/1.cap
[root@aaa-01 ~]# file /tmp/1.cap /tmp/1.cap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 262144)
tcpdump -r /etc/1.cop,可以查看文件内容,因为他是一个数据包,所以它显示的只是一些数据的流向
[root@aaa-01 ~]# tcpdump -r /tmp/1.cap reading from file /tmp/1.cap, link-type EN10MB (Ethernet) 19:08:27.654122 IP aaa-01.ssh > 192.168.232.1.53070: Flags [P.], seq 2889311389:2889311537, ack 3110138182, win 274, length 148 19:08:27.654290 IP 192.168.232.1.53070 > aaa-01.ssh: Flags [.], ack 148, win 254, length 0 19:08:59.507789 IP 192.168.232.1.53070 > aaa-01.ssh: Flags [P.], seq 1:69, ack 148, win 254, length 68 19:08:59.508025 IP aaa-01.ssh > 192.168.232.1.53070: Flags [P.], seq 148:216, ack 69, win 274, length 68 19:08:59.553682 IP 192.168.232.1.53070 > aaa-01.ssh: Flags [P.], seq 69:169, ack 216, win 254, length 100 19:08:59.553749 IP 192.168.232.1.53070 > aaa-01.ssh: Flags [P.], seq 169:237, ack 216, win 254, length 68 19:08:59.553971 IP aaa-01.ssh > 192.168.232.1.53070: Flags [.], ack 237, win 274, length 0 19:08:59.563115 IP aaa-01.ssh > 192.168.232.1.53070: Flags [P.], seq 216:268, ack 237, win 274, length 52 19:08:59.570663 IP aaa-01.ssh > 192.168.232.1.53070: Flags [P.], seq 268:384, ack 237, win 274, length 116 19:08:59.570876 IP 192.168.232.1.53070 > aaa-01.ssh: Flags [.], ack 384, win 253, length 0 [root@aaa-01 ~]#
tshark抓包工具(需要记住)
安装:yum install -y wireshark
命令:tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri" 可以查看指定网卡80端口web访问的情况。自己的实验虚拟机是抓不到的因为他没有80端口的服务
[root@aaa-01 ~]# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri" tshark: -R without -2 is deprecated. For single-pass filtering use -Y. Running as user "root" and group "root". This could be dangerous. Capturing on 'bluetooth0'
linux 网络相关
命令:ifconfig 查看默认网卡ip 需要安装包:(yum install net-tools)
命令:ifconfig -a 在你网卡被当(down)掉不显示时,或者没有ip时,它会显示出来。
命令:ifup ens33开启网卡
命令:ifdown ens33关闭网卡 在我们编辑一个网卡并且不想让所有网卡都重新关闭开启,只需要指定一个网卡关闭重启时再用它
如果我们远程登录服务器,当使用ifdown eth0这个命令的时候,很有可能后面的命令ifup eth0不会被运行,这样导致我们断网而无法连接服务器,所以请尽量使用 service network restart 这个命令来重启网卡。
命令:ifdown ens33 && ifup ens33 一次性关闭并重启网卡,为了安全起见可以这样结合使用
[root@aaa-01 ~]# ifdown ens33 && ifup ens33 成功断开设备 'ens33'。 连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
设定虚拟网卡
例如:设定虚拟网卡ens33:1
方法:
第一步,先到网卡所在的目录中去:cd /etc/sysconfig/network-scripts/
第二步,把ens33拷贝到ens33:1里:cp ifcfg-ens33 ifcfg-ens33\:1
第三步,编辑配置文件:vi ifcfg-ens33\:1
第四步,把里边带ens33的改成ens33:1,把ip改一下,网关跟DNS1都可以不要。
第五步,重启网卡:ifdown ens33 && ifup ens33
mii-tool ens33 查看网卡是否连接,显示link ok 证明连接。
[root@aaa-01 network-scripts]# mii-tool ens33 ens33: negotiated 1000baseT-FD flow-control, link ok
ethtool ens33 也可以查看网卡是否连接,最后一行显示yes证明连接。
查看主机名:hostname
更改主机名:hostnamectl set-hostname aminglinux
配置文件:cat /etc/hostname
DNS配置文件
/etc/resolv.conf
[root@aaa-01 ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 119.29.29.29
特殊文件:/etc/hosts
[root@aaa-01 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
编辑它的配置文件可以给域名指定IP,vim /etc/hosts
格式:指定IP+域名 例如:192.168.232.140 www.qq.com 一个IP可以指定多个域名,仅仅在本机生效
更改前
更改后
一个IP可以设置多个域名
Linux 防火墙
centos6、5、4...使用netfilter防火墙
centos7开始使用firewalld防火墙
netfilter防火墙(centos6以及以前的版本使用的)
命令:getenforce 查看selinux防火墙是否开启
Enforcing表示打开,Permissive表示关闭,其实他只是遇到一些需要阻断是时候他不真正的去阻断,仅仅是有一个提醒,这个提醒我们是看不到的,他自己会记录。
selinux临时关闭命令: setenforce 0
[root@aaa-01 ~]# setenforce 0 [root@aaa-01 ~]# getenforce Permissive
selinux永久关闭
变配置文件:vi /etc/selinux/config ##把enforcing改成disabled
在centos7上开起netfilter防火墙方法:
命令:getenforce 查看selinux防火墙是否开启
关闭firewalld开启netfilter方法
第一步,不让firewalled开机启动:systemctl disable firewalled
第二步,再把firewalled服务停掉:systemctl stop firewalld
第三步,然后开启netfilter防火墙,开启之前需要安装包:yum install -y iptables-services
第四步,安装完它会产生iptables服务,查看一下:systemctl enable iptables
第五步,开启iptables服务:systemctl start iptables
命令:iptables -nvL 查看它的默认规则
netfilter是防火墙的名字,而iptables只是它的一个工具
netfilter的5个表
filter表用于过滤包,最常用的表,包含三个内置的链,有INPUT、FORWARD、OUTPUT三个链
filter 这个表主要用于过滤包的,是系统预设的表,这个表也是用的最多的。内建三个链INPUT、 OUTPUT以及FORWARD。INPUT作用于进入本机的包(数据包进来的时候要经过的一个链,假如把80端口进来的数据包访问我80端口的数据包检查一下它的源IP是什么发现可疑的IP给他禁掉);OUTPUT作用于本机送出的包(对本机送出的包进行操作);FORWARD作用于那些跟 本机无关的包。
nat表用于网络地址转换,有PREROUTING、OUTPUT、POSTROUTING三个链
nat 主要用处是网络地址转换,还可以做端口映射,也有三个链。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的 目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。
managle表用于给数据包做标记,几乎用不到
raw表可以实现不追踪某些数据包。
security表在centos6中并没有,用于强制访问控制(MAC)的网络规则
iptables传输数据包过程
参考文章:iptables详解
经过本机:PREROUTING > INPUT > 主机 > OUTPUT > POSTROUTING
不经过本机:PREROUTING > FORWARD > POSTROUTING
数据包流向与netfilter的5个链
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外发出
POSTROUTING:发送到网卡接口之前
iptables 基本语法
查看iptables默认规则:iptables -nvL
规则保存地址:cat /etc/sysconfig/iptables 配置文件的路径
iptables -F 清空规则。 service iptables restart 重启加载回来
service iptables save 保存规则(把当前的规则保存到配置文件去),因为刚才清空了规则没设置新的规则,所以现在保存他会是空规则
iptables -t 指定表。默认是filter表。iptables -t filter -nvL;iptables -t nat -nvL(nat表的规则是空的)
iptables -Z 可以把计数器清零,格式:iptables -Z; iptables -nvL
iptables -A 增加一条规则(默认增加到最后边)看下图
例如:iptables -A INPUT -s 192.168.188.1 -p tcp --sport 1234 -d 192.168.188.128 --dport 80 -j DROP
解释:-s:指定来源IP -p:指定协议(tcp、odp、icmp) --sport:目标端口 -b:目标IP -j:最后操作 DROP:把数据直接扔掉 REJECT:拒绝 这两个的最终结果都是让这个数据包过不来封掉了这个IP
iptables -I 插入规则。(插入到最前边)例如:iptables -I INPUT -p tcp --dport 80 -j DROP
iptables -D 删除规则。例如删除前两条规则:
[root@aaa-01 ~]# iptables -D INPUT -s 192.168.188.1 -p tcp --sport 1234 -d 192.168.188.128 --dport 80 -j DROP [root@aaa-01 ~]# iptables -D INPUT -p tcp --dport 80 -j DROP
如果你写的规则很久了记不得了可以用这条命令,它会把规则的序列号打印出来根据序列号删规则。
列出序列号:iptables -nvL --line-numbers 删除指定的规则:iptables -D INPUT 1
iptables -I/-A/-D INPUT -s 1.1.1.1 -j DROP
针对网卡设置规则:iptables -I INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT
iptables -P INPUT DROP 更改默认规则的。最好不用动!!假如说你更改了连接中断的工具会断开连接,你只能到终端上去把它更改回来:iptables -P INPUT ACCEPT
iptables小案例
定义解释器 定义变量名 清空所有规则 把INPUT链收到的数据包扔掉 接受发出去的所有包
先编辑vi /usr/local/sbin/iptables.sh 加入如下内容
#! /bin/bash
ipt="/usr/sbin/iptables" 尽量写全局的绝对路径!
$ipt -F 把之前的规则清除掉
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
w查看一下。
执行一下:sh /usr/local/sbin/iptables.sh
icmp示例
命令:iptables -I INPUT -p icmp --icmp-type 8 -j DROP 加上这条规则之后,你可以ping外网,但是外网不能ping你,因为它把icmp的8种类型给DROP掉了
nat表应用
现在有两台机器,A机器有两块网卡一块网卡我们把它比喻成是外网,另外一块网卡是内网,ens33是外网,ens37是内网。
另外一台B机器只有一块内网网卡(ens37),它默认是不能连外网的不能跟外网通信。我们的需求是让B机器可以连外网,说白了我们就是要做一个小路由器,路由器可以上网我们的电脑就可以上网
准备工作:
首先准备两台机器
第一步,给A机器添加一块网卡
选择LAN区段,就相当于我们给网卡连到了一个内网的交换机上,这个交换机咱们的Windows机器是连不上的,这样的话,我们这台机器和另外一台机器连上同一个内网交换机,它们两者之间通信
给第二台机器添加一块网卡因为我们已经设置了一块网卡,我们把它先禁用掉,把启动时链接给断掉,从新增加一块。
这两台机器必须选择同一个LAN区段才能进行内网通信
命令行给两台机器上的ens37设置IP,也可以设置配置文件,把ens33网卡配置文件复制一份给ens37
A机器:设置IP,ifconfig ens37 192.168.100.1/24(他只是一个临时的一重启就没有了)
B机器设置IP,为了保险可以把ens33网卡当掉ifdown ens33
只能在终端上设置IP:ifconfig ens37 192.168.100.100/24
两台机器互相ping一下内网IP看看能不能ping通
而Windows机器是ping不通的
准备工作做完,下面实验。
A机器两块网卡ens33(192.168.232.132)、ens37(192.168.100.1),ens33可以上外网,ens37仅仅是内部网络。
B机器只有ens37(192.168.100.100),和A机器ens37可以通信互联。
需求1:可以让B机器连接外网
查看路由转发:cat /proc/sys/net/ipv4/ip_forward 如果是0,我们需要打开它A机器上打开路由端口转发 echo "1">/proc/sys/net/ipv4/ip_forward
[root@aaa-01 ~]# cat /proc/sys/net/ipv4/ip_forward 0 [root@aaa-01 ~]# echo "1">/proc/sys/net/ipv4/ip_forward [root@aaa-01 ~]# cat /proc/sys/net/ipv4/ip_forward 1
A上增加一条规则执行:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
查看一下规则:iptables -t nat -nvL
B上设置网关为192.168.100.1 命令:route add default gw 192.168.100.1 查看网关:route -n
而现在pingA机器IP就通了,这证明他可以跟外网通信了
B机器设置一下DNS:vi /etc/resolv.conf 进去了写:nameserver 119.29.29.29
ping一下119.29.29.29 在ping一下www.qq.com
需求2:C机器只能和A通信,让C机器可以直接连通B机器的22端口,假如C机器就是我们的电脑
第一步,A上打开路由端口转发(因为上边已经做了就可以省略)echo "1">/ proc/sys/net/ipv4/ip_forward
在A上删掉上一个实验的规则:iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
A上执行iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22(端口转发,进来的包怎么操作)
A上执行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130(回来的包)
B上设置网关为192.168.100.1(如果上边实验设置了这一步就可以省略)
iptables规则备份和恢复
默认保存命令:service iptables save //会把规则保存到/etc/sysconfig/iptables
指定保存命令:例如,把iptables规则备份到my.ipt文件中,命令:iptables-save > /tmp/my.ipt
恢复刚才备份的规则命令:iptables-restore < /tmp/my.ipt
原文地址:http://blog.51cto.com/12922638/2129055