1.LVS 简介： LVS的是Linux Virtual Server的简写，翻译为Linux虚拟服务器，即一个虚拟的服务器集群系统，> 是由我国章文嵩博士在1998年5月所研究成立，也是中国国内最早出现的自由软件项目之一。 LVS由2部分程序组成，包括 ipvs 和 ipvsadm ipvs(ip virtual server)：一段代码工作在内核空间，叫ipvs，是真正生效实现调度的代码。 ipvsadm：另外一段是工作在用户空间，叫ipvsadm，负责为ipvs内核框架编写规则，定义谁是集群服务，而谁是后端真实的服务器> (Real Server) LVS相关的几种IP: VIP :（virtual IP） LVS服务器上接收外网数据报文的网卡IP地址 DIP: （director IP） LVS服务器上发送数据报文到real server的网卡IP地址 RIP :（real server） 真实服务器上的IP，即提供服务的服务器IP(常简称为RS) CIP :（client IP ） 客户端的IP 工作模式： LVS常用的工作模式有DR模式、TUN模式、以及NAT模式 1.DR模式 直接路由: Director Route (1).工作原理 每个RS（Real Server）上都有两个IP：VIP和RIP，但是VIP是隐藏的，即不能提供解析等功能， 只是用来做请求回复的源IP的，Director（VS）上只需要一个网卡，在该网卡上配置两个IP：VIP和DIP， 在VS接收到客户端的请求后，VS根据负载算法选择一台RS的网卡mac作为客户端请求包中的目标mac， 通过arp转交给后端RS处理，后端RS再通过自己的路由网关回复给客户端client。 (2).特点 各DIP（VS）必须与 RIP（RS） 在同一局域网内(即具有相同的广播域)，且两个有相同的目标地址（vip）； RS的RIP可以使用私有地址，也可以使用公网地址，以方便配置；不支持支持端口映射； RS可以使用必须为uninx操作系统（OS）；且RS需要配置vip但不做响应； Director（VS）仅负责处理入站请求，响应报文由RS( Real server) 直接发往客户端； Real server（RS）不能将网关指向DIP（DS），而直接使用前端网关响应请求报文； (3).优缺点 优点： 负载均衡器VS只负责将请求包分发给物理服务器RS，而物理服务器RS将应答包直接发给用户。所以，负载均衡器VS能处理很巨大的请求量。 这种方式，一台负载均衡能为超过100台的物理服务器服务，负载均衡器不再是系统的瓶颈。 使用LVS/DR方式，如果你的负载均VS拥有100M的全双工网卡的话，就能使得整个Virtual Server能达到1G的吞吐量，甚至更高； 缺点： 这种方式需要所有的DIR和RIP都在同一广播域；不支持异地容灾。 总结： LVS/DR是三种模式中性能最高的一种模式，比LVS-NAT模式下负载的RS serve更多，通常在100台左右，对网络环境要求更高，也是日常应用的最多的一种工作模式。 2.TUN模式 (1).工作原理 它的连接调度和管理与LVS/NAT中的一样，利用ip隧道技术的原理，即在原有的客户端请求包头中再加一层IP Tunnel的包头ip首部信息， 不改变原来整个请求包信息，只是新增了一层ip首部信息，再利用路由原理将请求发给RS server，不过要求的是所有的server必须支持”IPTunneling”或者”IP Encapsulation”协议。 (2).特点 RIP、VIP、DIP全是公网地址 RS的网关不会也不可能指向DIP 所有的请求报文经由Director Server，但响应报文必须不能进过Director Server 不支持端口映射, RS的系统必须支持隧道 (3).优缺点 优点： 不需要调度应答报文，负载能力强； 服务器和调度器可以不在同一个VLAN中； 支持广域负载均衡； 缺点： 所有的服务器必须支持“IP Tunneling”协议，需安装内核模块，安装复杂； 建立IP隧道的开销大； 服务器需要联通外网，风险较大； 不支持端口映射； 3.NAT模式 NAT（Network address translation）即网络地址转换，作为一种过渡解决手段，可以用来减少对全球合法IP地址的需求。 简单的说，NAT就是在内部专用网络中使用内部地址，而当内部节点要与外界网络发生联系时，就在边缘路由器或者防火墙处， 将内部地址转换成全局地址，从而使得在外部公共网（Internet）上使用一个和数个合法IP地址正常传输数据。 其中，这里的外网和内网是相对来讲的，下面假设能够访问互联网的网络为外网。 (1).工作原理 当数据包到达VS时，VS做目标地址转换（DNAT），将目标IP改为RS的IP。RS接收到数据包以后，仿佛是客户端直接发给它的一样。 RS处理完，返回响应时，源IP是RIP，目标IP是客户端的IP。这时RS的包通过网关（VS）中转，VS会做源地址转换（SNAT）， 将包的源地址改为VIP，这样，这个包对客户端看起来就仿佛是VS直接返回给它的 (2). 特点 RS应该使用私有地址，RS的网关必须指向DIP DIP和RIP必须在同一个网段内 请求和响应报文都需要经过DS，高负载场景中，DS易成为性能瓶颈 支持端口映射 RS可以使用任意操作系统 缺陷：对Director Server压力会比较大，请求和响应都需经过director server (3).优缺点 优点： 集群中的物理服务器可以使用任何支持TCP/IP操作系统，物理服务器可以分配Internet的保留私有地址，只有负载均衡器需要一个合法的IP地址。 缺点： 扩展性有限；当服务器节点（普通PC服务器）数据增长到20个或更多时,负载均衡器将成为整个系统的瓶颈，因为所有的请求包和应答包都需要经过负载均衡器再生。 总结： LVS无论NAT及DR模式，均要求VS和RS在同一个网段内，NAT需要把VS当作各个RS的默认网关， DR模式采用修改mac地址直接从数据链路层转发、要求必须在同一个物理网段内 2.Nginx 1.简介 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件（IMAP/POP3）代理服务器，在BSD-like 协议下发行。其特点是占有内存少，并发能力强。 国内使用nginx网站用户有：百度、京东、新浪、网易、腾讯、淘宝等。 2.工作原理 Nginx由内核和模块组成。Nginx本身做的工作实际很少，当它接到一个HTTP请求时，它仅仅是通过查找配置文件将此次请求映射到一个location block， 而此location中所配置的各个指令则会启动不同的模块去完成工作，因此模块可以看做Nginx真正的劳动工作者。 通常一个location中的指令会涉及一个handler模块和多个filter模块（当然，多个location可以复用同一个模块）。 handler模块负责处理请求，完成响应内容的生成，而filter模块对响应内容进行处理。用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑，Nginx的功能才会如此强大。 Nginx的模块从结构上分为： 核心模块：HTTP模块、EVENT模块和MAIL模块 基础模块：HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块， 第三方模块：HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。 Nginx的模块从功能上分为： Core ： 核心模块；构建nginx基础服务、管理其他模块。 Handlers： 处理器模块；此类模块直接处理请求，并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。 Filters ： 过滤器模块；此类模块主要对其他处理器模块输出的内容进行修改操作，最后由Nginx输出。 Proxies ： 代理类模块；此类模块是Nginx的HTTP Upstream之类的模块，这些模块主要与后端一些服务比如FastCGI等进行交互，实现服务代理和负载均衡等功能。 Nginx的核心模块：主要负责建立nginx服务模型、管理网络层和应用层协议、以及启动针对特定应用的一系列候选模块。 其他模块负责分配给web服务器的实际工作： 当Nginx发送文件或者转发请求到其他服务器，由Handlers(处理模块)或Proxies（代理类模块）提供服务； 当需要Nginx把输出压缩或者在服务端加一些东西，由Filters(过滤模块)提供服务。 Nginx模块处理流程： 客户端发送HTTP请求 Nginx基于配置文件中的位置选择一个合适的处理模块 负载均衡模块选择一台后端服务器 (如果有) 处理模块进行处理并把输出缓冲放到第一个过滤模块上 第一个过滤模块处理后输出给第二个过滤模块 然后第二个过滤模块又到第三个 依此类推，最后把响应发给客户端。 Nginx请求处理流程： Nginx在启动时会以daemon形式在后台运行，采用多进程+异步非阻塞IO事件模型来处理各种连接请求。 多进程模型包括一个master进程，多个worker进程，一般worker进程个数是根据服务器CPU核数来决定的。 master进程负责管理Nginx本身和其他worker进程。 操作系统提供的机制（例如 epoll, kqueue 等）产生相关的事件。 接收和处理这些事件，如是接收到数据，则产生更高层的 request 对象。 处理 request 的 header 和 body。 产生响应，并发送回客户端。 完成 request 的处理。 重新初始化定时器及其他事件。 Nginx进程模型 Nginx默认采用多进程工作方式，Nginx启动后，会运行一个master进程和多个worker进程。 master充当整个进程组与用户的交互接口，同时对进程进行监护，管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。 worker用来处理基本的网络事件，worker之间是平等的，他们共同竞争来处理来自客户端的请求。 3.功能 Nginx能做： 正向代理 反向代理 负载均衡 HTTP服务器(包含动静分离) (1).正向代理 正向代理（Forward Proxy）：通常都被简称为代理，就是在用户无法正常访问外部资源， 比方说受到GFW的影响无法访问twitter的时候，我们可以通过代理的方式，让用户绕过防火墙， 从而连接到目标网络或者服务。 正向代理的工作原理就像一个跳板，比如：我访问不了google.com，但是我能访问一个代理服务器A，A能访问google.com， 于是我先连上代理服务器A，告诉他我需要google.com的内容，A就去取回来，然后返回给我。从网站的角度， 只在代理服务器来取内容的时候有一次记录，有时候并不知道是用户的请求，也隐藏了用户的资料，这取决于代理告不告诉网站。 正向代理是一个位于客户端和原始服务器之间的服务器。为了从原始服务器取得内容，客户端向代理发送一个请求并指定目标(原始服务器)， 然后代理向原始服务器转交请求并将获得的内容返回给客户端。 (2).反向代理 反向代理（Reverse Proxy）：是指以代理服务器来接受internet上的连接请求，然后将请求转发给内部网络上的服务器， 并将从服务器上得到的结果返回给internet上请求连接的客户端，此时代理服务器对外就表现为一个服务器。 举个例子，比如我想访问 http://www.test.com/readme，但www.test.com上并不存在readme页面，于是他是偷偷从另外一台服务器上取回来， 然后作为自己的内容返回用户，但用户并不知情。这里所提到的 www.test.com 这个域名对应的服务器就设置了反向代理功能。 反向代理服务器对于客户端而言它就像是原始服务器，并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求， 接着反向代理服务器将判断向何处(原始服务器)转交请求，并将获得的内容返回给客户端，就像这些内容原本就是它自己的一样。 总结： 正向代理：针对客户端而言，代理服务器代理客户端，转发请求，并将获得的内容返回给客户端。 反向代理：针对客户端而言，代理服务器就像是原始服务器,代理集群的web节点服务器返回结果。 (3).负载均衡 负载均衡也是Nginx常用的一个功能，负载均衡其意思就是分摊到多个操作单元上进行执行，例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等，从而共同完成工作任务。 简单而言就是当有2台或以上服务器时，根据规则随机的将请求分发到指定的服务器上处理，负载均衡配置一般都需要同时配置反向代理，通过反向代理跳转到负载均衡。 Nginx目前支持自带3种负载均衡策略，还有2种常用的第三方策略。 1.轮询（rr） 按照轮询（默认）方式进行负载，每个请求按时间顺序逐一分配到不同的后端服务器，如果后端服务器down掉，能自动剔除。 虽然这种方式简便、成本低廉。但缺点是：可靠性低和负载分配不均衡。 2.权重(weight) 指定轮询几率，weight和访问比率成正比，用于后端服务器性能不均的情况。 upstream westos{ server 172.25.66.2:80 weight=9; server 172.25.66.3:80 weight=1; } 3.ip哈希（ip_hash） 上面的2种方式都有一个问题，那就是下一个请求来的时候请求可能分发到另外一个服务器，当我们的程序不是无状态的时候（采用了session保存数据）， 这时候就有一个很大的很问题了，比如把登录信息保存到了session中，那么跳转到另外一台服务器的时候就需要重新登录了， 所以很多时候我们需要一个客户只访问一个服务器，那么就需要用ip_hash了，ip_hash的每个请求按访问ip的hash结果分配， 这样每个访客固定访问一个后端服务器，可以解决session的问题。 ip_hash： 来自同一个IP的请求会分发到相同的后端服务器 upstream westos{ ip_hash; server 172.25.66.2:80; server 172.25.66.3:80; } 第三方策略： 1.fair 按后端服务器的响应时间来分配请求，响应时间短的优先分配。 upstream backend{ fair; server 172.25.66.2:80; server 172.25.66.3:80; } 2.url_hash 按访问url的hash结果来分配请求，使每个url定向到同一个后端服务器，后端服务器为缓存时比较有效。 在upstream中加入hash语句，server语句中不能写入weight等其他的参数，hash_method是使用的hash算法。 upstream backend{ hash $request_uri; hash_method crc32; server 172.25.66.2:80; server 172.25.66.3:80; } (4).HTTP服务器 Nginx本身也是一个静态资源的服务器，当只有静态资源的时候，就可以使用Nginx来做服务器，同时现在也很流行动静分离， 就可以通过Nginx来实现，动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来，动静资源做好了拆分以后， 我们就可以根据静态资源的特点将其做缓存操作，这就是网站静态化处理的核心思路。 4.优点 (1).支持高并发 官方测试Nginx能够支撑5万并发连接，实际生产环境中可以支撑2~4万并发连接数。 原因主要是Nginx使用了最新的epoll（Linux2.6内核）和kqueue（freeBSD）网路I/O模型， 而Apache使用的是传统的Select模型，其比较稳定的Prefork模式为多进程模式，需要经常派生子进程，所以消耗的CPU等服务器资源，要比Nginx高很多。 (2).内存消耗少 Nginx+PHP（FastCGI）服务器，在3万并发连接下，开启10个Nginx进程消耗150MB内存，15MB10=150MB，开启的64个PHP-CGI进程消耗1280内存，20MB64=1280MB，加上系统自身消耗的内存，总共消耗不到2GB的内存。 如果服务器的内存比较小，完全可以只开启25个PHP-CGI进程，这样PHP-CGI消耗的总内存数才500MB。 (3).成本低廉 购买F5BIG-IP、NetScaler等硬件负载均衡交换机，需要十多万到几十万人民币，而Nginx为开源软件，采用的是2-clause BSD-like协议，可以免费试用，并且可用于商业用途。 BSD开源协议是一个给使用者很大自由的协议，协议指出可以自由使用、修改源代码、也可以将修改后的代码作为开源或专用软件再发布。 (4).配置简单 网络和程序一样通俗易懂，即使，非专用系统管理员也能看懂。 (5).支持Rewrite重写 Rewrite:重定向；能够根据域名、URL的不同，将http请求分到不同的后端服务器群组。 (6).内置健康检查 如果NginxProxy后端的某台Web服务器宕机了，不会影响前端的访问。 (7).节省带宽 支持GZIP压缩，可以添加浏览器本地缓存的Header头。 (8).支持热部署 Nginx支持热部署，它的自动特别容易，并且，几乎可以7天*24小时不间断的运行， 即使运行数个月也不需要重新启动，还能够在不间断服务的情况下，对软件版本进行升级。 3.HAproxy 1.简介 HAProxy是一个使用C语言编写的自由及开放源代码软件，它提供高可用性、负载均衡，以及基于TCP(第四层)和HTTP（第七层）的应用程序代理。 HAProxy特别适用于那些负载特大的web站点，这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上， 完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中， 同时可以保护你的web服务器不被暴露到网络上。 2.原理 HAProxy实现了一种事件驱动, 单一进程模型，此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制，很少能处理数千并发连接。 事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务，所以没有这些问题。 此模型的弊端是，在多核系统上，这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作 HAProxy的负载均衡算法： roundrobin：简单的轮询 static-rr：权重轮询 leastconn：最少连接者优先 source：根据请求源IP,这个跟Nginx的ip_hash机制类似 5 . ri：根据请求的URI rl_param：表示根据请求的URI参数‘balance url_param’requires an URL parameter name; hdr(name)：根据HTTP请求头来锁定每一次HTTP请求 rdp-cookie(name)：根据cookie来锁定并哈希每一次TCP请求 3.优点 免费开源，稳定性也是非常好。单HAproxy也跑得不错，稳定性可以与硬件级的F5相媲美。 根据官方文档，HAproxy可以跑满10Gbps，这个数值作为软件级负载均衡器是相当惊人的。 HAproxy支持连接拒绝:因为维护一个连接的打开的开销是很低的，有时我们很需要限制攻击蠕虫（attack bots），也就是说限制它们的连接打开从而限制它们的危害。这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点，这个优点也是其它负载均衡器没有的。 HAproxy支持全透明代理（已具备硬件防火墙的典型特点）:可以用客户端IP地址或者任何其他地址来连接后端服务器。这个特性仅在Linux 2.4/2.6内核打了tcp proxy补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。 HAproxy现多于线上的Mysql集群环境，我们常用于它作为MySQL（读）负载均衡。 自带强大的监控服务器状态的页面，实际环境中我们结合Nagios进行邮件或短信报警。 HAproxy支持虚拟主机，许多朋友说它不支持虚拟主机是错误的，通过测试我们知道，HAProxy是支持虚拟主机的。 4.比较LVS、Nginx、HAproxy优缺点 三大主流负载均衡器： LVS Nginx HAproxy (1).LVS 优点： 抗负载能力强,工作在网络4层之上,仅作分发之用，没有流量的产生，这个特点也决定了它在负载均衡软件里的性能最强的，对内存和cpu资源消耗比较低。 配置性比较低，这是一个缺点也是一个优点，因为没有可太多配置的东西，所以并不需要太多接触，大大减少了人为出错的几率。 工作稳定，因为其本身抗负载能力很强，自身有完整的双机热备方案，如LVS+Keepalived，不过我们在项目实施中用得最多的还是LVS/DR+Keepalived。 无流量，LVS只分发请求，而流量并不从它本身出去，这点保证了均衡器IO的性能不会收到大流量的影响。 应用范围比较广，因为LVS工作在4层，所以它几乎可以对所有应用做负载均衡，包括http、数据库、在线聊天室等等。 缺点： 软件本身不支持正则表达式处理，不能做动静分离；而现在许多网站在这方面都有较强的需求，这个是Nginx/HAProxy+Keepalived的优势所在。 如果是网站应用比较庞大的话，LVS/DR+Keepalived实施起来就比较复杂了，特别后面有Windows Server的机器的话，如果实施及配置还有维护过程就比较复杂了，相对而言，Nginx/HAProxy+Keepalived就简单多了。 (2).Nginx 优点： 工作在网络的7层之上，可以针对http应用做一些分流的策略，比如针对域名、目录结构。它的正则规则比HAProxy更为强大和灵活，这也是它目前广泛流行的主要原因之一，Nginx单凭这点可利用的场合就远多于LVS了。 对网络稳定性的依赖非常小，理论上能ping通就就能进行负载功能。 安装和配置比较简单，测试起来比较方便，它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了，LVS对网络依赖比较大。 抗高并发且稳定，在硬件不差的情况下一般能支撑几万次的并发量，负载度比LVS相对小些。 可以通过端口检测到服务器内部的故障，比如根据服务器处理网页返回的状态码、超时等等，并且会把返回错误的请求重新提交到另一个节点。 不仅仅是一款优秀的负载均衡器/反向代理软件，它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构，在高流量的环境中稳定性也很好。 作为Web反向加速缓存越来越成熟了，速度比传统的Squid服务器更快，可以考虑用其作为反向代理加速器。 可作为中层反向代理使用，这一层面Nginx基本上无对手，唯一可以对比Nginx的就只有lighttpd了，不过lighttpd目前还没有做到Nginx完全的功能，配置也不那么清晰易读，社区资料也远远没Nginx活跃。 可作为静态网页和图片服务器，这方面的性能也无对手。 Nginx社区非常活跃，第三方模块也很多。 缺点： Nginx仅能支持http、https和Email协议，适用范围小。 对后端服务器的健康检查，只支持通过端口来检测，不支持通过url来检测。不支持Session的直接保持，但能通过ip_hash来解决。 (3).HAproxy 优点： 支持两种代理模式：TCP（四层）和HTTP（七层），支持虚拟主机； 支持Session的保持，Cookie的引导；同时支持通过获取指定的url来检测后端服务器的状态。能够补充Nginx的一些缺点。 HAProxy跟LVS类似，本身就只是一款负载均衡软件；单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度，在并发处理上也是优于Nginx的。 HAProxy可以对Mysql进行负载均衡，对后端的DB节点进行检测和负载均衡。 HAProxy负载均衡策略非常多，比如：动态加权轮循(Dynamic Round Robin)，加权源地址哈希(Weighted Source Hash)，加权URL哈希和加权参数哈希(Weighted Parameter Hash) 免费开源，稳定性也是非常好，可以与LVS相媲美； 自带强大的监控服务器状态的页面，实际环境中我们结合Nagios进行邮件或短信报警； 缺点： 不支持POP/SMTP协议 SPDY协议； 不能做Web服务器，即不支持HTTP cache功能； 重载配置的功能需要重启进程，虽然也是soft restart，但没有Nginx的reaload更为平滑和友好； 多进程模式支持不够好； 适用场景： 网站建设初期，可以选用Nigix/HAproxy作为反向代理负载均衡（或者流量不大都可以不选用负载均衡），因为其配置简单，性能也能满足一般的业务场景。 如果考虑到负载均衡器是有单点问题，可以采用Nginx/HAproxy+Keepalived来避免。 网站并发达到一定程度之后，为了提高稳定性和转发效率，可以使用LVS、毕竟LVS比Nginx/HAproxy要更稳定，转发效率也更高。不过维护LVS对维护人员的要求也会更高，投入成本也更大。 参考博客： https://blog.csdn.net/wy757510722/article/details/75267431 参考简书： https://www.jianshu.com/p/6215e5d24553 转自：https://blog.csdn.net/lilygg/article/details/89538862
ip 网络配置工具 补充说明 ip命令 用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道，是Linux下较新的功能强大的网络配置工具。 语法 ip(选项)(参数) Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] -batch filename 选项 OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | macsec | tcp_metrics | token } -V：显示指令版本信息； -s：输出更详细的信息； -f：强制使用指定的协议族； -4：指定使用的网络层协议是IPv4协议； -6：指定使用的网络层协议是IPv6协议； -0：输出信息每条记录输出一行，即使内容较多也不换行显示； -r：显示主机时，不使用IP地址，而使用主机的域名。 参数 OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -h[uman-readable] | -iec | -f[amily] { inet | inet6 | ipx | dnet | bridge | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] | -rc[vbuf] [size] | -n[etns] name | -a[ll] } 网络对象：指定要管理的网络对象； 具体操作：对指定的网络对象完成具体操作； help：显示网络对象支持的操作命令的帮助信息。 实例 ip link show # 显示网络接口信息 ip link set eth0 up # 开启网卡 ip link set eth0 down # 关闭网卡 ip link set eth0 promisc on # 开启网卡的混合模式 ip link set eth0 promisc offi # 关闭网卡的混个模式 ip link set eth0 txqueuelen 1200 # 设置网卡队列长度 ip link set eth0 mtu 1400 # 设置网卡最大传输单元 ip addr show # 显示网卡IP信息 ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1 ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址 ip route show # 显示系统路由 ip route add default via 192.168.1.254 # 设置系统默认路由 ip route list # 查看路由信息 ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口 ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254 ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关 ip route del default # 删除默认路由 ip route delete 192.168.1.0/24 dev eth0 # 删除路由 用ip命令显示网络设备的运行状态 [root@localhost ~]# ip link list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff 显示更加详细的设备信息 [root@localhost ~]# ip -s link list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 RX: bytes packets errors dropped overrun mcast 5082831 56145 0 0 0 0 TX: bytes packets errors dropped carrier collsns 5082831 56145 0 0 0 0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:00:1e:51 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 3641655380 62027099 0 0 0 0 TX: bytes packets errors dropped carrier collsns 6155236 89160 0 0 0 0 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:16:3e:00:1e:52 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 2562136822 488237847 0 0 0 0 TX: bytes packets errors dropped carrier collsns 3486617396 9691081 0 0 0 0 显示核心路由表 [root@localhost ~]# ip route list 112.124.12.0/22 dev eth1 proto kernel scope link src 112.124.15.130 10.160.0.0/20 dev eth0 proto kernel scope link src 10.160.7.81 192.168.0.0/16 via 10.160.15.247 dev eth0 172.16.0.0/12 via 10.160.15.247 dev eth0 10.0.0.0/8 via 10.160.15.247 dev eth0 default via 112.124.15.247 dev eth1 显示邻居表 [root@localhost ~]# ip neigh list 112.124.15.247 dev eth1 lladdr 00:00:0c:9f:f3:88 REACHABLE 10.160.15.247 dev eth0 lladdr 00:00:0c:9f:f2:c0 STALE 获取主机所有网络接口 ip link | grep -E '^[0-9]' | awk -F: '{print $2}'
grep 强大的文本搜索工具 补充说明 grep （global search regular expression(RE) and print out the line，全面搜索正则表达式并把行打印出来）是一种强大的文本搜索工具，它能使用正则表达式搜索文本，并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用，使用上十分灵活。 选项 -a --text # 不要忽略二进制数据。 -A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外，并显示该行之后的内容。 -b --byte-offset # 在显示符合范本样式的那一行之外，并显示该行之前的内容。 -B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外，并显示该行之前的内容。 -c --count # 计算符合范本样式的列数。 -C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外，并显示该列之前后的内容。 -d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时，必须使用这项参数，否则grep命令将回报信息并停止动作。 -e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。 -E --extended-regexp # 将范本样式为延伸的普通表示法来使用，意味着使用能使用扩展正则表达式。 -f<范本文件> --file=<规则文件> # 指定范本文件，其内容有一个或多个范本样式，让grep查找符合范本条件的文件内容，格式为每一列的范本样式。 -F --fixed-regexp # 将范本样式视为固定字符串的列表。 -G --basic-regexp # 将范本样式视为普通的表示法来使用。 -h --no-filename # 在显示符合范本样式的那一列之前，不标示该列所属的文件名称。 -H --with-filename # 在显示符合范本样式的那一列之前，标示该列的文件名称。 -i --ignore-case # 忽略字符大小写的差别。 -l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。 -L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。 -n --line-number # 在显示符合范本样式的那一列之前，标示出该列的编号。 -P --perl-regexp # PATTERN 是一个 Perl 正则表达式 -q --quiet或--silent # 不显示任何信息。 -R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。 -s --no-messages # 不显示错误信息。 -v --revert-match # 反转查找。 -V --version # 显示版本信息。 -w --word-regexp # 只显示全字符合的列。 -x --line-regexp # 只显示全列符合的列。 -y # 此参数效果跟“-i”相同。 -o # 只输出文件中匹配到的部分。 -m <num> --max-count=<num> # 找到num行结果后停止查找，用来限制匹配行数 规则表达式 ^ # 锚定行的开始 如：'^grep'匹配所有以grep开头的行。 $ # 锚定行的结束 如：'grep$' 匹配所有以grep结尾的行。 . # 匹配一个非换行符的字符 如：'gr.p'匹配gr后接一个任意字符，然后是p。 * # 匹配零个或多个先前字符 如：'*grep'匹配所有一个或多个空格后紧跟grep的行。 .* # 一起用代表任意字符。 [] # 匹配一个指定范围内的字符，如'[Gg]rep'匹配Grep和grep。 [^] # 匹配一个不在指定范围内的字符，如：'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头，紧跟rep的行。 \(..\) # 标记匹配字符，如'\(love\)'，love被标记为1。 \< # 锚定单词的开始，如:'\<grep'匹配包含以grep开头的单词的行。 \> # 锚定单词的结束，如'grep\>'匹配包含以grep结尾的单词的行。 x\{m\} # 重复字符x，m次，如：'0\{5\}'匹配包含5个o的行。 x\{m,\} # 重复字符x,至少m次，如：'o\{5,\}'匹配至少有5个o的行。 x\{m,n\} # 重复字符x，至少m次，不多于n次，如：'o\{5,10\}'匹配5--10个o的行。 \w # 匹配文字和数字字符，也就是[A-Za-z0-9]，如：'G\w*p'匹配以G后跟零个或多个文字或数字字符，然后是p。 \W # \w的反置形式，匹配一个或多个非单词字符，如点号句号等。 \b # 单词锁定符，如: '\bgrep\b'只匹配grep。 grep命令常见用法 在文件中搜索一个单词，命令会返回一个包含 “match_pattern” 的文本行： grep match_pattern file_name grep "match_pattern" file_name 在多个文件中查找： grep "match_pattern" file_1 file_2 file_3 ... 输出除之外的所有行 -v 选项： grep -v "match_pattern" file_name 标记匹配颜色 --color=auto 选项： grep "match_pattern" file_name --color=auto 使用正则表达式 -E 选项： grep -E "[1-9]+" # 或 egrep "[1-9]+" 使用正则表达式 -P 选项： grep -P "(\d{3}\-){2}\d{4}" file_name 只输出文件中匹配到的部分 -o 选项： echo this is a test line. | grep -o -E "[a-z]+\." line. echo this is a test line. | egrep -o "[a-z]+\." line. 统计文件或者文本中包含匹配字符串的行数 -c 选项： grep -c "text" file_name 输出包含匹配字符串的行数 -n 选项： grep "text" -n file_name # 或 cat file_name | grep "text" -n #多个文件 grep "text" -n file_1 file_2 打印样式匹配所位于的字符或字节偏移： echo gun is not unix | grep -b -o "not" 7:not #一行中字符串的字符便宜是从该行的第一个字符开始计算，起始值为0。选项 **-b -o** 一般总是配合使用。 搜索多个文件并查找匹配文本在哪些文件中： grep -l "text" file1 file2 file3... grep递归搜索文件 在多级目录中对文本进行递归搜索： grep "text" . -r -n # .表示当前目录。 忽略匹配样式中的字符大小写： echo "hello world" | grep -i "HELLO" # hello 选项 -e 制动多个匹配样式： echo this is a text line | grep -e "is" -e "line" -o is line #也可以使用 **-f** 选项来匹配多个样式，在样式文件中逐行写出需要匹配的字符。 cat patfile aaa bbb echo aaa bbb ccc ddd eee | grep -f patfile -o 在grep搜索结果中包括或者排除指定文件： # 只在目录中所有的.php和.html文件中递归搜索字符"main()" grep "main()" . -r --include *.{php,html} # 在搜索结果中排除所有README文件 grep "main()" . -r --exclude "README" # 在搜索结果中排除filelist文件列表里的文件 grep "main()" . -r --exclude-from filelist 使用0值字节后缀的grep与xargs： # 测试文件： echo "aaa" > file1 echo "bbb" > file2 echo "aaa" > file3 grep "aaa" file* -lZ | xargs -0 rm # 执行后会删除file1和file3，grep输出用-Z选项来指定以0值字节作为终结符文件名（\0），xargs -0 读取输入并用0值字节终结符分隔文件名，然后删除匹配文件，-Z通常和-l结合使用。 grep静默输出： grep -q "test" filename # 不会输出任何信息，如果命令运行成功返回0，失败则返回非0值。一般用于条件测试。 打印出匹配文本之前或者之后的行： # 显示匹配某个结果之后的3行，使用 -A 选项： seq 10 | grep "5" -A 3 5 6 7 8 # 显示匹配某个结果之前的3行，使用 -B 选项： seq 10 | grep "5" -B 3 2 3 4 5 # 显示匹配某个结果的前三行和后三行，使用 -C 选项： seq 10 | grep "5" -C 3 2 3 4 5 6 7 8 # 如果匹配结果有多个，会用“--”作为各匹配结果之间的分隔符： echo -e "a\nb\nc\na\nb\nc" | grep a -A 1 a b -- a b
yum 基于RPM的软件包管理器 补充说明 yum命令 是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器，它可以使系统管理人员交互和自动化地更新与管理RPM软件包，能够从指定的服务器自动下载RPM包并且安装，可以自动处理依赖性关系，并且一次安装所有依赖的软体包，无须繁琐地一次次下载、安装。 yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令，而且命令简洁而又好记。 语法 yum(选项)(参数) 选项 -h：显示帮助信息； -y：对所有的提问都回答“yes”； -c：指定配置文件； -q：安静模式； -v：详细模式； -d：设置调试等级（0-10）； -e：设置错误等级（0-10）； -R：设置yum处理一个命令的最大等待时间； -C：完全从缓存中运行，而不去下载或者更新任何头文件。 参数 install：安装rpm软件包； update：更新rpm软件包； check-update：检查是否有可用的更新rpm软件包； remove：删除指定的rpm软件包； list：显示软件包的信息； search：检查软件包的信息； info：显示指定的rpm软件包的描述信息和概要信息； clean：清理yum过期的缓存； shell：进入yum的shell提示符； resolvedep：显示rpm软件包的依赖关系； localinstall：安装本地的rpm软件包； localupdate：显示本地rpm软件包进行更新； deplist：显示rpm软件包的所有依赖关系。 实例 部分常用的命令包括： 自动搜索最快镜像插件：yum install yum-fastestmirror 安装yum图形窗口插件：yum install yumex 查看可能批量安装的列表：yum grouplist 安装 yum install #全部安装 yum install package1 #安装指定的安装包package1 yum groupinsall group1 #安装程序组group1 更新和升级 yum update #全部更新 yum update package1 #更新指定程序包package1 yum check-update #检查可更新的程序 yum upgrade package1 #升级指定程序包package1 yum groupupdate group1 #升级程序组group1 查找和显示 # 检查 MySQL 是否已安装 yum list installed | grep mysql yum list installed mysql* yum info package1 #显示安装包信息package1 yum list #显示所有已经安装和可以安装的程序包 yum list package1 #显示指定程序包安装情况package1 yum groupinfo group1 #显示程序组group1信息yum search string 根据关键字string查找安装包 删除程序 yum remove | erase package1 #删除程序包package1 yum groupremove group1 #删除程序组group1 yum deplist package1 #查看程序package1依赖情况 清除缓存 yum clean packages #清除缓存目录下的软件包 yum clean headers #清除缓存目录下的 headers yum clean oldheaders #清除缓存目录下旧的 headers 更多实例 # yum /etc/yum.repos.d/ yum 源配置文件 vi /etc/yum.repos.d/nginx.repo # 举个栗子: nginx yum源 [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/6/$basearch/ gpgcheck=0 enabled=1 # yum mirror mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak wget https://mirror.tuna.tsinghua.edu.cn/help/centos/ yum makecache # 添加中文语言支持 LANG=C # 原始语言 LANG=zh_CN.utf8 # 切换到中文 yum groupinstall "Chinese Support" # 添加中文语言支持
vi 功能强大的纯文本编辑器 补充说明 vi命令 是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim，它是vi的增强版（vi Improved），与vi编辑器完全兼容，而且实现了很多增强功能。 vi编辑器支持编辑模式和命令模式，编辑模式下可以完成文本的编辑功能，命令模式下可以完成对文件的操作命令，要正确使用vi编辑器就必须熟练掌握着两种模式的切换。默认情况下，打开vi编辑器后自动进入命令模式。从编辑模式切换到命令模式使用“esc”键，从命令模式切换到编辑模式使用“A”、“a”、“O”、“o”、“I”、“i”键。 vi编辑器提供了丰富的内置命令，有些内置命令使用键盘组合键即可完成，有些内置命令则需要以冒号“：”开头输入。常用内置命令如下： Ctrl+u：向文件首翻半屏； Ctrl+d：向文件尾翻半屏； Ctrl+f：向文件尾翻一屏； Ctrl+b：向文件首翻一屏； Esc：从编辑模式切换到命令模式； ZZ：命令模式下保存当前文件所做的修改后退出vi； :行号：光标跳转到指定行的行首； :$：光标跳转到最后一行的行首； x或X：删除一个字符，x删除光标后的，而X删除光标前的； D：删除从当前光标到光标所在行尾的全部字符； dd：删除光标行正行内容； ndd：删除当前行及其后n-1行； nyy：将当前行及其下n行的内容保存到寄存器？中，其中？为一个字母，n为一个数字； p：粘贴文本操作，用于将缓存区的内容粘贴到当前光标所在位置的下方； P：粘贴文本操作，用于将缓存区的内容粘贴到当前光标所在位置的上方； /字符串：文本查找操作，用于从当前光标所在位置开始向文件尾部查找指定字符串的内容，查找的字符串会被加亮显示； ？字符串：文本查找操作，用于从当前光标所在位置开始向文件头部查找指定字符串的内容，查找的字符串会被加亮显示； a，bs/F/T：替换文本操作，用于在第a行到第b行之间，将F字符串换成T字符串。其中，“s/”表示进行替换操作； a：在当前字符后添加文本； A：在行末添加文本； i：在当前字符前插入文本； I：在行首插入文本； o：在当前行后面插入一空行； O：在当前行前面插入一空行； :wq：在命令模式下，执行存盘退出操作； :w：在命令模式下，执行存盘操作； :w！：在命令模式下，执行强制存盘操作； :q：在命令模式下，执行退出vi操作； :q！：在命令模式下，执行强制退出vi操作； :e文件名：在命令模式下，打开并编辑指定名称的文件； :n：在命令模式下，如果同时打开多个文件，则继续编辑下一个文件； :f：在命令模式下，用于显示当前的文件名、光标所在行的行号以及显示比例； :set number：在命令模式下，用于在最左端显示行号； :set nonumber：在命令模式下，用于在最左端不显示行号； 语法 vi(选项)(参数) 选项 +<行号>：从指定行号的行开始显示文本内容； -b：以二进制模式打开文件，用于编辑二进制文件和可执行文件； -c<指令>：在完成对第一个文件编辑任务后，执行给出的指令； -d：以diff模式打开文件，当多个文件编辑时，显示文件差异部分； -l：使用lisp模式，打开“lisp”和“showmatch”； -m：取消写文件功能，重设“write”选项； -M：关闭修改功能； -n：不实用缓存功能； -o<文件数目>：指定同时打开指定数目的文件； -R：以只读方式打开文件； -s：安静模式，不现实指令的任何错误信息。 参数 文件列表：指定要编辑的文件列表。多个文件之间使用空格分隔开。 知识扩展 vi编辑器有三种工作方式：命令方式、输入方式和ex转义方式。通过相应的命令或操作，在这三种工作方式之间可以进行转换。 命令方式 在Shell提示符后输入命令vi，进入vi编辑器，并处于vi的命令方式。此时，从键盘上输入的任何字符都被作为编辑命令来解释，例如，a(append）表示附加命令，i(insert）表示插入命令，x表示删除字符命令等。如果输入的字符不是vi的合法命令，则机器发出“报警声”，光标不移动。另外，在命令方式下输入的字符（即vi命令）并不在屏幕上显示出来，例如，输入i，屏幕上并无变化，但通过执行i命令，编辑器的工作方式却发生变化：由命令方式变为输入方式。 输入方式 通过输入vi的插入命令（i）、附加命令（a）、打开命令（o）、替换命令（s）、修改命令(c）或取代命令（r）可以从命令方式进入输入方式。在输入方式下，从键盘上输入的所有字符都被插入到正在编辑的缓冲区中，被当做该文件的正文。进入输入方式后，输入的可见字符都在屏幕上显示出来，而编辑命令不再起作用，仅作为普通字母出现。例如，在命令方式下输入字母i，进到输入方式，然后再输入i，就在屏幕上相应光标处添加一个字母i。 由输入方式回到命令方式的办法是按下Esc键。如果已在命令方式下，那么按下Esc键就会发出“嘟嘟”声。为了确保用户想执行的vi命令是在命令方式下输入的，不妨多按几下Esc键，听到嘟声后再输入命令。 ex转义方式 vi和ex编辑器的功能是相同的，二者的主要区别是用户界面。在vi中，命令通常是单个字母，如a,x,r等。而在ex中，命令是以Enter；键结束的命令行。vi有一个专门的“转义”命令，可访问很多面向行的ex命令。为使用ex转义方式，可输入一个冒号（:）。作为ex命令提示符，冒号出现在状态行（通常在屏幕最下一行）。按下中断键（通常是Del键），可终止正在执行的命令。多数文件管理命令都是在ex转义方式下执行的（例如，读取文件，把编辑缓冲区的内容写到文件中等）。转义命令执行后，自动回到命令方式。例如： :1,$s/I/i/g 按Enter键 则从文件第一行至文件末尾（$）将大写I全部替换成小写i。vi编辑器的三种工作方式之间的转换如图所示。 !vi
firewall-cmd Linux上新用的防火墙软件，跟iptables差不多的工具 补充说明 firewall-cmd 是 firewalld的字符界面管理工具，firewalld是centos7的一大特性，最大的好处有两个：支持动态更新，不用重启服务；第二个就是加入了防火墙的“zone”概念。 firewalld跟iptables比起来至少有两大好处： firewalld可以动态修改单条规则，而不需要像iptables那样，在修改了规则后必须得全部刷新才可以生效。 firewalld在使用上要比iptables人性化很多，即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。 firewalld自身并不具备防火墙的功能，而是和iptables一样需要通过内核的netfilter来实现，也就是说firewalld和 iptables一样，他们的作用都是用于维护规则，而真正使用规则干活的是内核的netfilter，只不过firewalld和iptables的结 构以及使用方法不一样罢了。 命令格式 firewall-cmd [选项 ... ] 选项 通用选项 -h, --help # 显示帮助信息； -V, --version # 显示版本信息. （这个选项不能与其他选项组合）； -q, --quiet # 不打印状态消息； 状态选项 --state # 显示firewalld的状态； --reload # 不中断服务的重新加载； --complete-reload # 中断所有连接的重新加载； --runtime-to-permanent # 将当前防火墙的规则永久保存； --check-config # 检查配置正确性； 日志选项 --get-log-denied # 获取记录被拒绝的日志； --set-log-denied=<value> # 设置记录被拒绝的日志，只能为 'all','unicast','broadcast','multicast','off' 其中的一个； 实例 # 安装firewalld yum install firewalld firewall-config systemctl start firewalld # 启动 systemctl stop firewalld # 停止 systemctl enable firewalld # 启用自动启动 systemctl disable firewalld # 禁用自动启动 systemctl status firewalld # 或者 firewall-cmd --state 查看状态 # 关闭服务的方法 # 你也可以关闭目前还不熟悉的FirewallD防火墙，而使用iptables，命令如下： systemctl stop firewalld systemctl disable firewalld yum install iptables-services systemctl start iptables systemctl enable iptables 配置firewalld firewall-cmd --version # 查看版本 firewall-cmd --help # 查看帮助 # 查看设置： firewall-cmd --state # 显示状态 firewall-cmd --get-active-zones # 查看区域信息 firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域 firewall-cmd --panic-on # 拒绝所有包 firewall-cmd --panic-off # 取消拒绝状态 firewall-cmd --query-panic # 查看是否拒绝 firewall-cmd --reload # 更新防火墙规则 firewall-cmd --complete-reload # 两者的区别就是第一个无需断开连接，就是firewalld特性之一动态添加规则，第二个需要断开连接，类似重启服务 # 将接口添加到区域，默认接口都在public firewall-cmd --zone=public --add-interface=eth0 # 永久生效再加上 --permanent 然后reload防火墙 # 设置默认接口区域，立即生效无需重启 firewall-cmd --set-default-zone=public # 查看所有打开的端口： firewall-cmd --zone=dmz --list-ports # 加入一个端口到区域： firewall-cmd --zone=dmz --add-port=8080/tcp # 若要永久生效方法同上 # 打开一个服务，类似于将端口可视化，服务需要在配置文件中添加，/etc/firewalld 目录下有services文件夹，这个不详细说了，详情参考文档 firewall-cmd --zone=work --add-service=smtp # 移除服务 firewall-cmd --zone=work --remove-service=smtp # 显示支持的区域列表 firewall-cmd --get-zones # 设置为家庭区域 firewall-cmd --set-default-zone=home # 查看当前区域 firewall-cmd --get-active-zones # 设置当前区域的接口 firewall-cmd --get-zone-of-interface=enp03s # 显示所有公共区域（public） firewall-cmd --zone=public --list-all # 临时修改网络接口（enp0s3）为内部区域（internal） firewall-cmd --zone=internal --change-interface=enp03s # 永久修改网络接口enp03s为内部区域（internal） firewall-cmd --permanent --zone=internal --change-interface=enp03s 服务管理 # 显示服务列表 Amanda, FTP, Samba和TFTP等最重要的服务已经被FirewallD提供相应的服务，可以使用如下命令查看： firewall-cmd --get-services # 允许SSH服务通过 firewall-cmd --new-service=ssh # 禁止SSH服务通过 firewall-cmd --delete-service=ssh # 打开TCP的8080端口 firewall-cmd --enable ports=8080/tcp # 临时允许Samba服务通过600秒 firewall-cmd --enable service=samba --timeout=600 # 显示当前服务 firewall-cmd --list-services # 添加HTTP服务到内部区域（internal） firewall-cmd --permanent --zone=internal --add-service=http firewall-cmd --reload # 在不改变状态的条件下重新加载防火墙 端口管理 # 打开443/TCP端口 firewall-cmd --add-port=443/tcp # 永久打开3690/TCP端口 firewall-cmd --permanent --add-port=3690/tcp # 永久打开端口好像需要reload一下，临时打开好像不用，如果用了reload临时打开的端口就失效了 # 其它服务也可能是这样的，这个没有测试 firewall-cmd --reload # 查看防火墙，添加的端口也可以看到 firewall-cmd --list-all 直接模式 # FirewallD包括一种直接模式，使用它可以完成一些工作，例如打开TCP协议的9999端口 firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT firewall-cmd --reload 自定义服务管理 选项 （末尾带有 [P only] 的话表示该选项除了与（--permanent）之外，不能与其他选项一同使用！） --new-service=<服务名> 新建一个自定义服务 [P only] --new-service-from-file=<文件名> [--name=<服务名>] 从文件中读取配置用以新建一个自定义服务 [P only] --delete-service=<服务名> 删除一个已存在的服务 [P only] --load-service-defaults=<服务名> Load icmptype default settings [P only] --info-service=<服务名> 显示该服务的相关信息 --path-service=<服务名> 显示该服务的文件的相关路径 [P only] --service=<服务名> --set-description=<描述> 给该服务设置描述信息 [P only] --service=<服务名> --get-description 显示该服务的描述信息 [P only] --service=<服务名> --set-short=<描述> 给该服务设置一个简短的描述 [P only] --service=<服务名> --get-short 显示该服务的简短描述 [P only] --service=<服务名> --add-port=<端口号>[-<端口号>]/<protocol> 给该服务添加一个新的端口(端口段) [P only] --service=<服务名> --remove-port=<端口号>[-<端口号>]/<protocol> 从该服务上移除一个端口(端口段) [P only] --service=<服务名> --query-port=<端口号>[-<端口号>]/<protocol> 查询该服务是否添加了某个端口(端口段) [P only] --service=<服务名> --get-ports 显示该服务添加的所有端口 [P only] --service=<服务名> --add-protocol=<protocol> 为该服务添加一个协议 [P only] --service=<服务名> --remove-protocol=<protocol> 从该服务上移除一个协议 [P only] --service=<服务名> --query-protocol=<protocol> 查询该服务是否添加了某个协议 [P only] --service=<服务名> --get-protocols 显示该服务添加的所有协议 [P only] --service=<服务名> --add-source-port=<端口号>[-<端口号>]/<protocol> 添加新的源端口(端口段)到该服务 [P only] --service=<服务名> --remove-source-port=<端口号>[-<端口号>]/<protocol> 从该服务中删除源端口(端口段) [P only] --service=<服务名> --query-source-port=<端口号>[-<端口号>]/<protocol> 查询该服务是否添加了某个源端口(端口段) [P only] --service=<服务名> --get-source-ports 显示该服务所有源端口 [P only] --service=<服务名> --add-module=<module> 为该服务添加一个模块 [P only] --service=<服务名> --remove-module=<module> 为该服务移除一个模块 [P only] --service=<服务名> --query-module=<module> 查询该服务是否添加了某个模块 [P only] --service=<服务名> --get-modules 显示该服务添加的所有模块 [P only] --service=<服务名> --set-destination=<ipv>: [/<mask>] Set destination for ipv to address in service [P only] --service=<服务名> --remove-destination=<ipv> Disable destination for ipv i service [P only] --service=<服务名> --query-destination=<ipv>: [/<mask>] Return whether destination ipv is set for service [P only] --service=<服务名> --get-destinations List destinations in service [P only] 控制端口 / 服务 可以通过两种方式控制端口的开放，一种是指定端口号另一种是指定服务名。虽然开放 http 服务就是开放了 80 端口，但是还是不能通过端口号来关闭，也就是说通过指定服务名开放的就要通过指定服务名关闭；通过指定端口号开放的就要通过指定端口号关闭。还有一个要注意的就是指定端口的时候一定要指定是什么协议，tcp 还是 udp。知道这个之后以后就不用每次先关防火墙了，可以让防火墙真正的生效。 firewall-cmd --add-service=mysql # 开放mysql端口 firewall-cmd --remove-service=http # 阻止http端口 firewall-cmd --list-services # 查看开放的服务 firewall-cmd --add-port=3306/tcp # 开放通过tcp访问3306 firewall-cmd --remove-port=80tcp # 阻止通过tcp访问3306 firewall-cmd --add-port=233/udp # 开放通过udp访问233 firewall-cmd --list-ports # 查看开放的端口 伪装 IP firewall-cmd --query-masquerade # 检查是否允许伪装IP firewall-cmd --add-masquerade # 允许防火墙伪装IP firewall-cmd --remove-masquerade# 禁止防火墙伪装IP 端口转发 端口转发可以将指定地址访问指定的端口时，将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机，如果指定了 ip 却没指定端口，则默认使用来源端口。 如果配置好端口转发之后不能用，可以检查下面两个问题： 比如我将 80 端口转发至 8080 端口，首先检查本地的 80 端口和目标的 8080 端口是否开放监听了 其次检查是否允许伪装 IP，没允许的话要开启伪装 IP firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口 当我们想把某个端口隐藏起来的时候，就可以在防火墙上阻止那个端口访问，然后再开一个不规则的端口，之后配置防火墙的端口转发，将流量转发过去。 端口转发还可以做流量分发，一个防火墙拖着好多台运行着不同服务的机器，然后用防火墙将不同端口的流量转发至不同机器。
iptables Linux上常用的防火墙软件 补充说明 iptables命令 是Linux上常用的防火墙软件，是netfilter项目的一部分。可以直接配置，也可以通过许多前端和图形界面配置。 语法 iptables(选项)(参数) 选项 -t, --table table 对指定的表 table 进行操作， table 必须是 raw， nat，filter，mangle 中的一个。如果不指定此选项，默认的是 filter 表。 # 通用匹配：源地址目标地址的匹配 -p：指定要匹配的数据包协议类型； -s, --source [!] address[/mask] ：把指定的一个／一组地址作为源地址，按此规则进行过滤。当后面没有 mask 时，address 是一个地址，比如：192.168.1.1；当 mask 指定时，可以表示一组范围内的地址，比如：192.168.1.0/255.255.255.0。 -d, --destination [!] address[/mask] ：地址格式同上，但这里是指定地址为目的地址，按此进行过滤。 -i, --in-interface [!] <网络接口name> ：指定数据包的来自来自网络接口，比如最常见的 eth0 。注意：它只对 INPUT，FORWARD，PREROUTING 这三个链起作用。如果没有指定此选项， 说明可以来自任何一个网络接口。同前面类似，"!" 表示取反。 -o, --out-interface [!] <网络接口name> ：指定数据包出去的网络接口。只对 OUTPUT，FORWARD，POSTROUTING 三个链起作用。 # 查看管理命令 -L, --list [chain] 列出链 chain 上面的所有规则，如果没有指定链，列出表上所有链的所有规则。 # 规则管理命令 -A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则，也就是说，这条规则会被放到最后，最后才会被执行。规则是由后面的匹配来指定。 -I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1，则在链的头部插入。这也是默认的情况，如果没有指定规则号。 -D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。 -R num：Replays替换/修改第几条规则 # 链管理命令（这都是立即生效的） -P, --policy chain target ：为指定的链 chain 设置策略 target。注意，只有内置的链才允许有策略，用户自定义的是不允许的。 -F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链，清空该表上所有链的所有规则。 -N, --new-chain chain 用指定的名字创建一个新的链。 -X, --delete-chain [chain] ：删除指定的链，这个链必须没有被其它任何规则引用，而且这条上必须没有任何规则。如果没有指定链名，则会删除该表中所有非内置的链。 -E, --rename-chain old-chain new-chain ：用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。 -Z, --zero [chain] ：把指定链，或者表中的所有链上的所有计数器清零。 -j, --jump target <指定目标> ：即满足某条件时该执行什么样的动作。target 可以是内置的目标，比如 ACCEPT，也可以是用户自定义的链。 -h：显示帮助信息； 基本参数 参数 作用 -P 设置默认策略:iptables -P INPUT (DROP ACCEPT) -F 清空规则链 -L 查看规则链 -A 在规则链的末尾加入新规则 -I num 在规则链的头部加入新规则 -D num 删除某一条规则 -s 匹配来源地址IP/MASK，加叹号"!"表示除这个IP外。 -d 匹配目标地址 -i 网卡名称 匹配从这块网卡流入的数据 -o 网卡名称 匹配从这块网卡流出的数据 -p 匹配协议,如tcp,udp,icmp --dport num 匹配目标端口号 --sport num 匹配来源端口号 命令选项输入顺序 iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作 工作机制 规则链名包括(也被称为五个钩子函数（hook functions）)： INPUT链 ：处理输入数据包。 OUTPUT链 ：处理输出数据包。 FORWARD链 ：处理转发数据包。 PREROUTING链 ：用于目标地址转换（DNAT）。 POSTOUTING链 ：用于源地址转换（SNAT）。 防火墙的策略 防火墙策略一般分为两种，一种叫通策略，一种叫堵策略，通策略，默认门是关着的，必须要定义谁能进。堵策略则是，大门是洞开的，但是你必须有身份认证，否则不能进。所以我们要定义，让进来的进来，让出去的出去，所以通，是要全通，而堵，则是要选择。当我们定义的策略的时候，要分别定义多条功能，其中：定义数据包中允许或者不允许的策略，filter过滤的功能，而定义地址转换的功能的则是nat选项。为了让这些功能交替工作，我们制定出了“表”这个定义，来定义、区分各种不同的工作功能和处理方式。 我们现在用的比较多个功能有3个： filter 定义允许或者不允许的，只能做在3个链上：INPUT ，FORWARD ，OUTPUT nat 定义地址转换的，也只能做在3个链上：PREROUTING ，OUTPUT ，POSTROUTING mangle功能:修改报文原数据，是5个链都可以做：PREROUTING，INPUT，FORWARD，OUTPUT，POSTROUTING 我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开，在里面做标记/修改内容的。而防火墙标记，其实就是靠mangle来实现的。 小扩展: 对于filter来讲一般只能做在3个链上：INPUT ，FORWARD ，OUTPUT 对于nat来讲一般也只能做在3个链上：PREROUTING ，OUTPUT ，POSTROUTING 而mangle则是5个链都可以做：PREROUTING，INPUT，FORWARD，OUTPUT，POSTROUTING iptables/netfilter（这款软件）是工作在用户空间的，它可以让规则进行生效的，本身不是一种服务，而且规则是立即生效的。而我们iptables现在被做成了一个服务，可以进行启动，停止的。启动，则将规则直接生效，停止，则将规则撤销。 iptables还支持自己定义链。但是自己定义的链，必须是跟某种特定的链关联起来的。在一个关卡设定，指定当有数据的时候专门去找某个特定的链来处理，当那个链处理完之后，再返回。接着在特定的链中继续检查。 注意：规则的次序非常关键，谁的规则越严格，应该放的越靠前，而检查规则的时候，是按照从上往下的方式进行检查的。 表名包括： raw ：高级功能，如：网址过滤。 mangle ：数据包修改（QOS），用于实现服务质量。 nat ：地址转换，用于网关路由器。 filter ：包过滤，用于防火墙规则。 动作包括： ACCEPT ：接收数据包。 DROP ：丢弃数据包。 REDIRECT ：重定向、映射、透明代理。 SNAT ：源地址转换。 DNAT ：目标地址转换。 MASQUERADE ：IP伪装（NAT），用于ADSL。 LOG ：日志记录。 ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓ ┌───────────────┐ ┃ Network ┃ │ table: filter │ ┗━━━━━━━┳━━━━━━━┛ │ chain: INPUT │◀────┐ │ └───────┬───────┘ │ ▼ │ │ ┌───────────────────┐ ┌ ▼ ┐ │ │ table: nat │ │local process│ │ │ chain: PREROUTING │ └ ┘ │ └─────────┬─────────┘ │ │ │ ▼ │ ▼ ┌─────────────────┐ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │table: nat │ Routing decision └───── outing decision ─────▶│chain: PREROUTING│ ┅┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅┅ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ └────────┬────────┘ │ │ ▼ │ ┌───────────────┐ │ │ table: nat │ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │ │ chain: OUTPUT │ ┌─────▶ outing decision ◀──────────────┘ └───────┬───────┘ │ ┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅ │ │ │ ▼ │ ▼ ┌───────────────┐ │ ┌────────────────────┐ │ table: filter │ │ │ chain: POSTROUTING │ │ chain: OUTPUT ├────┘ └──────────┬─────────┘ └───────────────┘ │ ▼ ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓ ┃ Network ┃ ┗━━━━━━━━━━━━━━━┛ 实例 空当前的所有规则和计数 iptables -F # 清空所有的防火墙规则 iptables -X # 删除用户自定义的空链 iptables -Z # 清空计数 配置允许ssh端口连接 iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT # 22为你的ssh端口， -s 192.168.1.0/24表示允许这个网段的机器来连接，其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求 允许本地回环地址可以正常使用 iptables -A INPUT -i lo -j ACCEPT #本地圆环地址就是那个127.0.0.1，是本机上使用的,它进与出都设置为允许 iptables -A OUTPUT -o lo -j ACCEPT 设置默认的规则 iptables -P INPUT DROP # 配置默认的不让进 iptables -P FORWARD DROP # 默认的不允许转发 iptables -P OUTPUT ACCEPT # 默认的可以出去 配置白名单 iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问 iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问 iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口 开启相应的服务端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口，因为web对外都是这个端口 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来 保存规则到配置文件中 cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份，请保持这一优秀的习惯 iptables-save > /etc/sysconfig/iptables cat /etc/sysconfig/iptables 列出已设置的规则 iptables -L [-t 表名] [链名] 四个表名 raw，nat，filter，mangle 五个规则链名 INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING filter表包含INPUT、OUTPUT、FORWARD三个规则链 iptables -L -t nat # 列出 nat 上面的所有规则 # ^ -t 参数指定，必须是 raw， nat，filter，mangle 中的一个 iptables -L -t nat --line-numbers # 规则带编号 iptables -L INPUT iptables -L -nv # 查看，这个列表看起来更详细 清除已有规则 iptables -F INPUT # 清空指定链 INPUT 上面的所有规则 iptables -X INPUT # 删除指定的链，这个链必须没有被其它任何规则引用，而且这条上必须没有任何规则。 # 如果没有指定链名，则会删除该表中所有非内置的链。 iptables -Z INPUT # 把指定链，或者表中的所有链上的所有计数器清零。 删除已添加的规则 # 添加一条规则 iptables -A INPUT -s 192.168.1.5 -j DROP 将所有iptables以序号标记显示，执行： iptables -L -n --line-numbers 比如要删除INPUT里序号为8的规则，执行： iptables -D INPUT 8 开放指定的端口 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行 iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口 iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口 iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口 iptables -A INPUT -j reject #禁止其他未允许的规则访问 iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问 屏蔽IP iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽恶意主机（比如，192.168.0.8 iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是 指定数据包出去的网络接口 只对 OUTPUT，FORWARD，POSTROUTING 三个链起作用。 iptables -A FORWARD -o eth0 查看已添加的规则 iptables -L -n -v Chain INPUT (policy DROP 48106 packets, 2690K bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes) pkts bytes target prot opt in out source destination 5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 启动网络转发规则 公网210.14.67.7让内网192.168.188.0/24上网 iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127 端口映射 本机的 2222 端口映射到内网 虚拟机的22 端口 iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22 字符串匹配 比如，我们要过滤所有TCP连接中的字符串test，一旦出现它我们就终止这个连接，我们可以这么做： iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset iptables -L # Chain INPUT (policy ACCEPT) # target prot opt source destination # REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset # # Chain FORWARD (policy ACCEPT) # target prot opt source destination # # Chain OUTPUT (policy ACCEPT) # target prot opt source destination 阻止Windows蠕虫的攻击 iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe" 防止SYN洪水攻击 iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT 更多实例 用iptables搭建一套强大的安全防护盾 http://www.imooc.com/learn/389 iptables: linux 下应用层防火墙工具 iptables 5链: 对应 Hook point netfilter: linux 操作系统核心层内部的一个数据包处理模块 Hook point: 数据包在 netfilter 中的挂载点; PRE_ROUTING / INPUT / OUTPUT / FORWARD / POST_ROUTING iptables & netfilter iptables 4表5链 4表 filter: 访问控制 / 规则匹配 nat: 地址转发 mangle / raw 规则 数据访问控制: ACCEPT / DROP / REJECT 数据包改写(nat -> 地址转换): snat / dnat 信息记录: log 使用场景实例 场景一 开放 tcp 10-22/80 端口 开放 icmp 其他未被允许的端口禁止访问 存在的问题: 本机无法访问本机; 本机无法访问其他主机 场景二 ftp: 默认被动模式(服务器产生随机端口告诉客户端, 客户端主动连接这个端口拉取数据) vsftpd: 使 ftp 支持主动模式(客户端产生随机端口通知服务器, 服务器主动连接这个端口发送数据) 场景三 允许外网访问: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp 内部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp 场景四 nat 转发 场景五 防CC攻击 iptables -L -F -A -D # list flush append delete # 场景一 iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允许 tcp 80 端口 iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允许 tcp 10-22 端口 iptables -I INPUT -p icmp -j ACCEPT # 允许 icmp iptables -A INPUT -j REJECT # 添加一条规则, 不允许所有 # 优化场景一 iptables -I INPUT -i lo -j ACCEPT # 允许本机访问 iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许访问外网 iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允许固定ip访问80 # 场景二 vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 开启 ftp 主动模式 port_enable=yes connect_from_port_20=YES iptables -I INPUT -p tcp --dport 21 -j ACCEPT vi /etc/vsftpd/vsftpd.conf # 建议使用 ftp 被动模式 pasv_min_port=50000 pasv_max_port=60000 iptables -I INPUT -p tcp --dport 21 -j ACCEPT iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT # 还可以使用 iptables 模块追踪来自动开发对应的端口 # 场景三 iptables -I INPUT -i lo -j ACCEPT # 允许本机访问 iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许访问外网 iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允许内网访问 iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允许端口, 80 -> http, 1723 -> vpn iptables -A INPUT -j REJECT # 添加一条规则, 不允许所有 iptables-save # 保存设置到配置文件 # 场景四 iptables -t nat -L # 查看 nat 配置 iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT vi /etc/sysconfig/network # 配置网关 iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT #场景五 iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制并发连接访问数 iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模块; --limit-burst 默认为5
ip6tables linux中防火墙软件 补充说明 ip6tables命令 和iptables一样，都是linux中防火墙软件，不同的是ip6tables采用的TCP/ip协议为IPv6。 语法 ip6tables(选项) 选项 -t<表>：指定要操纵的表； -A：向规则链中添加条目； -D：从规则链中删除条目； -i：向规则链中插入条目； -R：替换规则链中的条目； -L：显示规则链中已有的条目； -F：清楚规则链中已有的条目； -Z：清空规则链中的数据包计算器和字节计数器； -N：创建新的用户自定义规则链； -P：定义规则链中的默认目标； -h：显示帮助信息； -p：指定要匹配的数据包协议类型； -s：指定要匹配的数据包源ip地址； -j<目标>：指定要跳转的目标； -i<网络接口>：指定数据包进入本机的网络接口； -o<网络接口>：指定数据包要离开本机所使用的网络接口。 -c<计数器>：在执行插入操作（insert），追加操作（append），替换操作（replace）时初始化包计数器和字节计数器。 实例 在命令行窗口输入下面的指令就可以查看当前的 IPv6 防火墙配置： ip6tables -nl --line-numbers /etc/sysconfig/ip6tables文件 使用编辑器编辑/etc/sysconfig/ip6tables文件： vi /etc/sysconfig/ip6tables 可能会看到下面的默认 ip6tables 规则： *filter :INPUT accept [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 32768:61000 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 32768:61000 ! --syn -j ACCEPT -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -j reject --reject-with icmp6-adm-prohibited COMMIT 与 IPv4 的 iptables 规则类似，但又不完全相同。 要开启 80 端口（HTTP 服务器端口），在 COMMIT 一行之前添加如下规则： -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT -p tcp表示仅针对 tcp 协议的通信。--dport指定端口号。 要开启 53 端口（DNS 服务器端口），在 COMMIT 一行之前添加如下规则： -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT -A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT 同时针对 tcp 和 udp 协议开启 53 端口。 要开启 443 端口，在 COMMIT 一行之前添加如下规则： -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT 要开启 25 端口（SMTP 邮件服务器端口），在 COMMIT 一行之前添加如下规则： -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT 对于那些没有特定规则与之匹配的数据包，可能是我们不想要的，多半是有问题的。我们可能也希望在丢弃（DROP）之前记录它们。此时，可以将最后一行： -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited COMMIT 改为： -A RH-Firewall-1-INPUT -j LOG -A RH-Firewall-1-INPUT -j DROP COMMIT 保存并关闭该文件。然后重新启动 ip6tables 防火墙： # service ip6tables restart 然后重新查看 ip6tables 规则，可以看到如下所示的输出： # ip6tables -vnL --line-numbers 输出示例： Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 42237 3243K RH-Firewall-1-INPUT all * * ::/0 ::/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 RH-Firewall-1-INPUT all * * ::/0 ::/0 Chain OUTPUT (policy ACCEPT 12557 packets, 2042K bytes) num pkts bytes target prot opt in out source destination Chain RH-Firewall-1-INPUT (2 references) num pkts bytes target prot opt in out source destination 1 6 656 ACCEPT all lo * ::/0 ::/0 2 37519 2730K ACCEPT icmpv6 * * ::/0 ::/0 3 0 0 ACCEPT esp * * ::/0 ::/0 4 0 0 ACCEPT ah * * ::/0 ::/0 5 413 48385 ACCEPT udp * * ::/0 ff02::fb/128 udp dpt:5353 6 0 0 ACCEPT udp * * ::/0 ::/0 udp dpt:631 7 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:631 8 173 79521 ACCEPT udp * * ::/0 ::/0 udp dpts:32768:61000 9 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpts:32768:61000 flags:!0x16/0x02 10 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:22 11 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:80 12 0 0 ACCEPT tcp * * ::/0 ::/0 tcp dpt:53 13 4108 380K ACCEPT udp * * ::/0 ::/0 udp dpt:53 14 18 4196 REJECT all * * ::/0 ::/0 IPv6 私有 IP IPv4 通常默认即可保护内部局域网私有 IP 上的主机。但是 IPv6 的地址非常丰富，不再需要使用类似 NAT 等协议的私有网络。这样一来，所有的内部主机都可以拥有公网 IP 而直接连接到互联网，也就同时暴露于互联网上的各种威胁之中了。那么，如何配置 IPv6 防火墙使其默认将除了 ping6 请求之外的所有输入数据包都丢弃呢？可以使用FC00::/7 前缀来标识本地 IPv6 单播地址。 允许特定的 ICMPv6 通信 使用 IPv6 的时候需要允许比 IPv4 更多类型的 ICMP 通信以保证路由和 IP 地址自动配置等功能正常工作。有时候，如果你的规则设置太过苛刻，可能都无法分配到正确的 IPv6 地址。当然，不使用 DHCP 而是手动配置 IP 地址的除外。 下面是一些比较常见的 ipv6-icmp 配置实例： :ICMPv6 - [0:0] # Approve certain ICMPv6 types and all outgoing ICMPv6 # http://forum.linode.com/viewtopic.php?p=39840#39840 -A INPUT -p icmpv6 -j ICMPv6 -A ICMPv6 -p icmpv6 --icmpv6-type echo-request -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type redirect -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 141 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 142 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 148 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 149 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 130 -s fe80::/10 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 131 -s fe80::/10 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 132 -s fe80::/10 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 143 -s fe80::/10 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 151 -s fe80::/10 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 152 -s fe80::/10 -j ACCEPT -A ICMPv6 -p icmpv6 --icmpv6-type 153 -s fe80::/10 -j ACCEPT -A ICMPv6 -j RETURN -A OUTPUT -p icmpv6 -j ACCEPT
nmcli命令与配置文件对应关系 主机名： 如果说你没有设置主机名的话，默认:localhost.localdomain 修改配置文件的主机名: # hostnamectl set-hostname server.host.com 查看网卡信息 nmcli connection nmcli con show 显示具体的网络接口信息 nmcli connection show `System eth0` 显示所有设配状态 nmcli device status 修改配置文件执行生效 nmcli connection reload 注：如果不行，可尝试以下命令 # 重载所有ifcfg或route到connection（不会立即生效） nmcli c reload ifcfg-xxx # 重载指定ifcfg或route到connection（不会立即生效） nmcli c load /etc/sysconfig/network-scripts/ifcfg-ethX nmcli c load /etc/sysconfig/network-scripts/route-ethX # 立即生效connection，有3种方法 nmcli c up ethX nmcli d reapply ethX nmcli d connect ethX 显示所有活动连接 nmcli connection show --active 删除一个网卡连接 nmcli connection delete `System eth0` 添加一个网卡连接 nmcli connection add type ethernet con-name `System eth0` ifname eth0 网络接口的启用与停用： 停用： nmcli connection down `System eth0` 启用： nmcli connection up `System eth0` 给eth0添加一个IP（IPADDR） nmcli connection modify `System eth0` ipv4.addresses 10.10.12.1 给eth0添加一个子网掩码（NETMASK） nmcli connection modify `System eth0` ipv4.addresses 10.10.12.1/24 IP获取方式设置成手动（BOOTPROTO=static/none） nmcli connection modify `System eth0` ipv4.method manual 添加一个ipv4 nmcli connection modify `System eth0` +ipv4.addresses 10.10.12.2/24 删除一个ipv4 nmcli connection modify `System eth0` ipv4.addresses 10.10.12.2/24 添加DNS nmcli connection modify `System eth0` ipv4.dns 114.114.114.114 删除DNS # nmcli connection modify `System eth0` -ipv4.dns 114.114.114.114 添加一个网关（GATEWAY） # nmcli connection modify `System eth0` ipv4.gateway 192.168.0.2 可一块写入： nmcli connection modify `System eth0` ipv4.dns 114.114.114.114 ipv4.gateway 10.10.12.254
远程桌面中转，基于 UltraVNC Repeater（中继器）的远程桌面服务搭建，用于复杂网络环境
概述 常见的远程桌面服务，大多数是点对点的，需要控制端和被控制端双方互相能够连通，若不在同一个局域网内，仅仅通过内网 ip 地址和端口，是不能直接远程桌面的，所以需要一个服务器来中转双方的数据，这样只要大家能够连通服务器，那么任意两台 PC 都可以互相远程桌面。市面上出现的 TeamViewer 和向日葵，原理应该也是这样的。本文讲解如何使用 UltraVNC 搭建远程桌面服务器，并介绍如何用 Java 代码调用。 如下图所示：两个不同的局域网A、B，PC1、2、3无法直接 ping PC4、5、6，但是全部都能连通 Server（中继器服务），那么任意两台机器都可以用 UltraVNC 互相远程。 搭建 UltraVNC Repeater 中继器服务器 可以根据服务器环境选择在 windows 上或者 linux 上面搭建，UltraVNC 官网只有 windows 端的源代码和可执行程序，本文提供 centos 版本的源代码，下面介绍。 windows 端搭建 下载可执行文件 ultravncrepeater1400 直接运行即可 ： 中继器 UltraVNC Viewer 监听端口: 名称 描述 中继器服务器 ip 运行 repeater 的服务器地址 中继器 UltraVNC Server 监听端口 5500 中继器 UltraVNC Viewer 监听端口 5901 WEB 端管理页面 浏览器中直接访问中继器 ip 地址，端口默认 80 centos 端搭建 csdn 上传的资源默认 5 个积分，后来会自动增长，我修改后发现没有用，您可以下载百度云的资源 下载 uvncrepeater 源代码 本站下载: uvncrep017-ws.tar.gz 百度云：https://pan.baidu.com/s/13OcU1QAL6eqKFnFWG8mPrw 提取码 1234 解压源代码文件 tar -xvf uvncrep017-ws.tar 编译并安装 cd uvncrep017-ws make & make install 为中继器服务添加一个用户 useradd uvncrep 根据需要编辑配置文件 /etc/uvnc/uvncrepeater.ini ，默认如下 viewerport = 5901 maxsessions = 10 runasuser = uvncrep logginglevel = 2 srvListAllow1 = 192.168.0.0 ;Allow network 192.168.x.x srvListDeny0 = 127.0.0.1 ;Deny loopback requirelistedserver=1 启动服务 /etc/init.d/uvncrepeater start 客户端安装 UltraVNC Server 和 UltraVNC Viewer UltraVNC 下载地址，若地址失效，可去官网下载 启动 UltraVNC Server 打开 cmd 命令行，切换到软件根目录，执行 // 命令行参数如下 // id number: 被控制端编号（只能是数字，唯一，且至少三位，即最小是 100，最大是 2147483647，源码中此为 int 类型） // ip: repeater 中继器服务器 IP // port: 中继器 UltraVNC Server 监听端口 winvnc.exe -autoreconnect ID:[id number]-connect [repeater ip]:[server listen port] -run // 示例如下 winvnc.exe -autoreconnect ID:10001 -connect 192.168.1.2:5500 -run 启动 UltraVNC Viewer 打开 cmd 命令行，切换到软件根目录，执行 // 命令行参数如下 // id number: 被控制端编号（只能是数字，唯一，且至少三位，即最小是 100，最大是 2147483647，源码中此为 int 类型） // ip: repeater 中继器服务器 IP // port: 中继器 UltraVNC Viewer 监听端口 vncviewer.exe -proxy [repeater ip]:[viewer listen port] ID:[id number] // 示例如下 vncviewer.exe -proxy 192.168.1.2:5901 ID:10001 ···