Iptables与LVS——从入门到放弃

Stella981
• 阅读 722

防火墙
什么是防火墙?防火墙其实就是一个隔离的工具,工作于主机或者网络的边缘,对于进出本主机或者网络的报文根据事先定义好的网络规则做匹配监测。
防火墙可以简单地划分为两大类:主机防火墙 网络防火墙
    又可以分为:硬件防火墙、软件防火墙。
    对于软件防火墙,如果设立匹配较多,速度会很慢。
    硬件防火墙在硬件上处理远超于软件防火墙。

linux主要分为两个部分:
内核空间——tcp/ip协议站共作在内核空间
用户空间
防火墙firewalld——其中就有netfilter来过滤进出的报文。

四表五链:
 表: filter nat mangle raw
  应用优先级:raw>mangle>nat>filter
  常用优先级:filter nat mangle raw
 链:prerouting input forward output postrouting

各表中的链:
 filter : INPUT FORWARD OUTPUT
 nat:PREROUTING OUTPUT INPUT POSTROUTING
 mangle:PREROUTING  INPUT  FORWARD  OUTPUT  POSTROUTING
 raw:PREROUTING OUTPUT
firewalld是工作在liunx的内核空间之中的,那么我们用户是无法直接对其进行操作的。所以liunx提供了一种工具来实现
用户对于firewalld的网络规则的操作,那就是iptables,iptables是用来调度内核中的表和链的。

各表的功能:
 filter:过滤,防火墙
 nat:网络地址转换,network address translation
 mangle:拆分报文,做出修改,封装报文
 raw:关闭nat表上启用的连接追踪机制

添加规则的考量点:
  1、要实现什么功能:判断在哪张表上。
  2、报文的流向的路径:判断在哪条链上。

[jerry@centos ~]$ sudo iptables -L -n
[sudo] jerry 的密码:
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED

iptables工具:
 -L:以列表的形式查看
 -n:以数字形式显示
 -t:指定表
 -P:指定链的默认规则
 -F:清空所有的规则
 -X:清除自定义链
 -j:指定要执行的操作
  ACCEPT:接受
  DROP:丢弃
  REJECT:拒绝
  DNAT:目标地址转换
  SNAT:源地址转换
 -A:append追加策略
 -s:source源ip(可以是网段)
 -d:destination源ip(可以是网段)
 -I:insert插入策略
 -p:protocol指定协议
 --dport:指定目标端口
 --sport:指定源端口
 --line-num:显示规则的行号
 -D:按照行号删除某链中的规则
 -i:指定网卡interface
 
iptables -X  #删除自定义链
iptables -L -n

iptables -t nat -L -n --line-number

内核工作在内存当中。关机就丢失数据,就需要重设,但是可以事先将规则写到文件里。
对于firewalld是没有进程的,集成在内核当中,开机防火墙就存在,只是使用与不使用的区别。
 iptables-save > rules.txt   #存储规则到文件
 iptables-restore < rules.txt  #加载规则到四表五链
 iptables -X    #清除自定义的链
 iptables -L -n

filter表:过滤
 iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p icmp -j DROP  #ping提示连接超时
 iptables -L -n
 iptables -F  #清所有的规则
 iptables -t filter -A INPUT -s 192.168.27.0/24 -d 192.168.27.20 -p icmp -j REJECT    #ping提示无法连接到端口
 iptables -t filter -A INPUT -s 0.0.0.0 -d 192.168.27.20 -p icmp -j REJECT     #决绝所有ip来ping本主机

拒绝访问本主机的web服务:
 iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
 iptables -t filter -A OUTPUT -p tcp --sport 80 -j DROP

 iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p tcp --dport 80 -j REJECT
使用:telnet 192.168.27.20 80
iptables -t filter -P INPUT DROP

ssh远程连接也是通过tcp协议:
 iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -p tcp --dport 22 -j ACCEPT
 iptables -L -n

-i——指定网卡:
 iptables -t filter -A INPUT -s 192.168.27.1 -d 192.168.27.20 -i ens33 -p icmp -j REJECT
 iptables -t filter -A OUPUT -s 192.168.27.20 -d 192.168.27.1 -o ens33 -p icmp -j REJECT

 iptables -t filter -A INPUT -i ens33 -p icmp -j DROP
 iptables -t filter -A OUTPUT -o ens33 -p icmp -j REJECT

 iptables -L -n --line-num #显示规则的行号,便于删除
 iptables -t filter -D INPUT 2 #删除filter表上INPUT链上的2号规则

nat表:地址转换
#开启ipforward的核心转发功能
临时性:
 echo 1 > /proc/sys/net/ipv4/ip_forward
永久性:
 vim /etc/sysctl.conf
  net.ipv4.ip_forward = 1
  使用Sysctl -p来生效
 #源地址为192.168.20.2的主机地址经过防火墙都转换成172.16.100.1这个地址(snat——源地址转换)
 iptables -t nat -A POSTROUTING -s 192.168.20.2 -d 172.16.100.2 -j SNAT --to-source 172.16.100.1
 #访问目标地址为172.16.100.1的这个机器并且是tcp协议80端口都转发给192.168.20.2的80端口(dnat——目标地址转化)
 iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --deport 80 -j DNAT --to-destination 192.168.20.2:80
 #访问目标地址为172.16.100.1的这个机器并且是tcp协议80端口都转发给192.168.20.2的8080端口(dnat——目标地址转化)
 iptables -t nat -A PREROUTING -d 172.16.100.1 -p tcp --deport 80 -j DNAT --to-destination 192.168.20.2:8080

如果将IPFORWARD链上的转发功能给关掉就无法实现了。
 iptables -P IPFORWARD DROP

 iptables -t nat -A POSTROUTING -s 192.168.20.2 -d 172.16.100.2 -p tcp --dport 80 -j SNAT --to-source 172.16.100.1
 iptables -t nat -A PREROUTING -s 172.16.100.2 -d 172.16.100.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2:9999

 iptables -t nat -L -n #查看两条链上的规则

系统的扩展方式:
 scale up:向上扩展
 scale out:向外扩展
 也即是走质量或者走数量。
 集群类型:LB HA
 LB集群的实现:
  硬件:FS Redware
  软件:lvs haproxy nginx
   基于工作协议层划分:
    传输层:
     lvs:工作在内核空间之中,属于四层LB。
     haproxy:1、mode tcp,如果工作在应用层,只能调度http协议。如果基于tcp协议他能够调度https,mysql等常用的tcp协议。
        2、haproxy只是模拟tcp协议,因为tcp协议工作在内核之中,而haproxy属于应用程序工作在第七层,是工作在某个套接字上的应用程序。
    应用层:
     haproxy lvs

LVS
 linux virtual server
 工作在input链上的,lvs接受报文转发的流程:PREROUTING —— INPUT —— POSTROUTING
 用户空间使用ipvsadm定义转发规则,通过系统调用将规则发送给内核中的ipvs
  Lvs——处理并发上不封顶
  Haproxy——最多处理并发3万
  Nginx——微线程,io处理切换,一遇见io就切换
 lvs术语:
 调度器——director server(DS)
 后端真实处理服务器——Real server (RS)
 client ip —— CIP
 Director virtual ip —— VIP
 director ip —— DIP
 Real server ip —— RIP
 
ipvs工作原理:
 报文从PREROUTING进入,按正常顺序流入INPUT链,lvs工作在INPUT链上,根据所匹配的规则,符合规则的报文会被LVS强行拉到POSTROUTING链上
 然后根据规则流通出去。
 lvs的模式:
 lvs-nat(其实就是一个DNAT)
 lvs-dr(direct routing)
 lvs-tun(ip tunneling)

   lvs-nat:多目标的DNAT,通过修改请求报文的ip和端口至挑选出来的某个RS的RIP地址来实现转发。
     特点: 1、RIP应该和DIP使用私网地址,且RS的网关应该指向DIP。
      2、请求和响应报文都要经过director server,因此在并发量较高的情况下,director server有可能成为瓶颈。
      3、支持端口映射。
      4、RS可以是任意的OS。
      5、RS的RIP和director的DIP必须在同一个网段。

  ** lvs-dr:路由模式**
  交换机通过mac地址寻址的方式来找主机。
  通过修改请求报文的目标mac地址进行转发。
   特点:1、保证前端路由器将目标ip为vip的请求发送给director server
     解决方案:静态绑定 arptables 修改RS的内核参数
      2、RS和DS必须在同一个物理网络之中。
      3、请求报文经过director调度,但是响应报文一定不能经过director
      4、不支持端口映射
      5、RS可以是大多数的OS
      6、RS的网关不能指向DIP
  lvs支持的算法:
   静态方法:依据算法本身进行调度
    RR:round robin轮调
    WRR:weighted RR
    SH:source hash,实现session保持的机制
    DH:destination hash ,将同一个目标的请求始终发往同一个RS
   动态方法:gun算法以及各RS的当前负载情况进行调度
    LC:least connection
     overhead=active*256+inactive
    WLC:weighted LC
     overhead=(active*256+inactive)/weighted
     overhead较小的即为被挑选的主机
    SED  LBLC   LBLCR

lvs—nat模式配置:
  网络环境说明:
   DS:外网网卡和内网网卡
   外网网卡:192.168.27.10
       255.255.255.0
       192.168.27.1
   内网网卡:172.16.100.1
       255.255.255.0
   RS1:网关指向DS的内网网卡
    172.16.100.10
    255.255.255.0
    172.16.100.1 
   RS2:网关指向DS的内网网卡
    172.16.100.20
    255.255.255.0
    172.16.100.1
  安装lvs:yum install ipvsadm -y
  DS开启路由转发模式:
   临时性:
   echo 1 > /proc/sys/net/ipv4/ip_forward
   永久性:
   vim /etc/sysctl.conf
   net.ipv4.ip_forward = 1
   使用Sysctl -p来生效
  ipvsadm配置:
   ipvsadm -A -t 192.168.27.10:80 -s rr
   ipvasdm -a -t 192.168.27.10:80 -r 172.16.100.10 -m
   ipvsadm -a -t 192.168.27.10:80 -r 172.16.100.20 -m
   -A : 添加virtual server
   -D : 删除virtual server
   -s :调度算法
   -r :真实的real server
   -m : nat模式
   -t :tcp协议
  ipvsadm也是工作在内核空间的,所以规则需要写入文件:ipvsadm-save > a.txt 和iptables是类似的。

lvs—dr模式配置:
  direct-server:192.168.27.20
  real-server:192.168.27.30
  real-server:192.168.27.40
  #vip为虚拟服务ip
  vip:192.168.27.250
  direct-server:
   yum install ipvsadm -y
  direct-server:
   ipvsadm -C   #清除配置信息
   ipvsadm -A -t 192.168.27.250:80 -s rr #-A为ADD  -t为tcp -s rr 为轮调算法
   #添加两台real-server
   ipvsadm -a -t 192.168.27.250:80 -r  192.168.27.30:80 -g
   #-a为add -t:tcp -r:realserver -g为DR路由模式。
   ipvsadm -a -t 192.168.27.250:80 -r  192.168.27.40:80 -g
   
   #配置网卡的子网口为vip,ip地址为192.168.27.250
   ifconfig ens33:0 192.168.27.250 broadcast 192.168.27.250 netmask 255.255.255.255 up
   #添加路由(访问192.168.27.250都走ens33:0这个网卡)
   route add -host 192.168.27.250 dev ens33:0
  
  real-server:
   #在回环地址上配置服务ip(vip)
   ifconfig lo:0 192.168.27.250 broadcast 192.168.27.250 netmask 255.255.255.255 up
   #添加路由
   route add -host 192.168.27.250 dev lo:0
   
   arp_ignore:定义接受到ARP请求时的响应级别
    0——默认,只要本地配置的有响应地址都给予回应
    1——仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应
     (仅在请求的目标地址配置请求到达的接口上的时候,才给予响应)
   arp_announce:定义将自己的地址向外通告时的级别
    0——默认,表示使用配置在任何接口的任何地址向外通告
    1——尽量仅向目标网络通告与其网络匹配的地址
    2——仅向与本地接口上地址匹配的网络进行通告
   
   #为了实现在访问vip的时候direct-server响应,然后转发给real-server,再由real-server回应并返回vip地址,需要执行以下配置:
   echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
   echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
   echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
   echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
   
   #如果需要关闭这些功能
   echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
   echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
   echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
   echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
 #备注
 如果没有ifconfig这个命令:yum install net-tools -y
 配置多个虚拟ip——ens33:1 or ens33:2

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这