Linux的安全设置,网络防火墙

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的安全设置,网络防火墙相关的知识,希望对你有一定的参考价值。

下面介绍的是Linux的安全设置,网络防火墙(iptables、NAT、layer7、diff、patch、SELinux)


一、防火墙

1、防火墙基础

(1)、防火墙

 防火墙,是一种隔离工具,工作于主机和网络边缘。对于经过防火墙的报文,根据预先安排好的规则进行检测,如果能够匹配,则按照特定规进行处理。

(2)、防火墙分类

 防火墙分为两类,软件防火墙、硬件防火墙。软件防火墙有iptables、netfilter,硬件防火墙有PIX、ASA。

 同时,防火墙还可以按类别分,分为主机防火墙、网络防火墙。

(3)、iptables

 iptables,是专门为netfilter编写规则的用户空间工具,非交互式命令工具。

 iptables,包括chain和table两部分,具体解释如下:

    chain:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING。----------5类

    table:、filter、nat(修改源地址、目的地址、端口号)、mangle(修改封装格式)、raw

 

 table表的优先级:raw(高)、mangle、nat、filter

 raw表包含链:PREROUTING,OUTPUT ----------直入直出

 mangle表包含链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING ---------经过主机、路由

 nat表包含链:PREROUTING,OUTPUT,POSTROUTING,INPUT ----------------经过主机

 filter表包含链:INPUT,FORWARD,OUTPUT ----------经过路由


 iptables数据报文的流向:

 流入本机访问某进程:PREROUTING --> INPUT ------------------入主机

 本机进程发送出去:PREROUTING --> OUTPUT --> POSTROUTING ----------出主机

 经由本机转发:PREROUTING --> FORWARD --> POSTROUTING -----------经过路由


2、iptables命令 -------------对于报文,判断匹配条件(基本匹配、扩展匹配),然后进行处理动作(ACCEPT、DROP、REJECT)

  格式(规则):iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-target-options]

  targetname:----------------目标

    ACCEPT -------------接受,允许

    DROP -------------丢弃,拒绝

    REJECT ------------弹回,拒绝

    LOG -----------仅仅是开启内核对匹配的数据包做额外的日志记录

    SNAT

    DNAT

    MASQUERADE

    MARK


  常用选项:

  -t table:指定选择功能表,可以选择的有raw、mangle、nat、filter,默认的是filter表。

  --set -----------------记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

    # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

  --update ------------------是指每次建立连接都更新列表

  --seconds -----------------必须与--rcheck或者--update同时使用,几秒

  --hitcount ----------------必须与--rcheck或者--update同时使用,几次

    # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

  

  COMMAND:---------------链的操作命令、规则的操作命令、查看规则的命令

  -P -------------定义指定链的【默认策略】(ACCEPT、DROP)

  -N ------------【新建】一条自定义的规则链

  -X ------------【删除】被内建链【引用次数为0】的自定义链

  -F ------------【清除】指定链上的【所有规则】

  -E ------------【重命名】被内建链引用次数为0的自定义链

-----------------------------------------------------------

  -A -----------------追加,在指定的链的尾部追加一条规则

  -I [#] -------------插入,在指定的位置插入一条规则,省略了数字表示将规则插入到链的第一条

  -D [#] -------------删除,删除指定的规则

  -R -----------------替换,用指定的规则去替换目标链中的原有规则

  -Z -----------------重置规则计数器,将指定表指定链上的规则的计数器置0

-----------------------------------------------------------

  -L -------------列出指定表指定链上的所有规则

  -n -------------规则数字化(主机名、端口号)

  -v -------------详细显示

  -x -------------精确的显示计数器的结果

  --line-numbers --------------------显示规则链中的规则编号


基本匹配条件:

  -s -------------源IP地址,是否匹配

  -d -------------目标IP地址,是否匹配

  -p -------------封装报文协议,是否匹配(tcp、udp、ip、icmp、arp)

  -i -------------数据报文【入站】的接口,是否匹配

  -o -------------数据报文【出站】的接口,是否匹配

          

  例:

  # iptables -A INPUT -s 172.16.0.0/16 -d 172.16.72.1,172.16.72.101 -j ACCEPT

  # iptables -P INPUT DROP 

  # iptables -A INPUT -s 172.16.0.0/16 -d 172.16.72.101 -j ACCEPT

  # iptables -I INPUT -s 172.16.0.1 -d 172.16.72.1 -p tcp --dport 22 -j ACCEPT

  # iptables -I INPUT -s 172.16.0.0/16 -d 172.16.72.101 -p tcp --dport 80 -j ACCEPT

  # iptables -I INPUT 2 -s 172.16.69.1 -p icmp --icmp-type 8 -j ACCEPT

  # iptables -I INPUT 3 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT


扩展匹配条件(7种)----------multiport扩展、iprange扩展、string扩展、time扩展、connlimit扩展、limit扩展、state扩展

(1)、multiport扩展 ----------离散或连续的方式【定义多个端口】匹配条件

  常用选项:

  -m multiport --sports port

  -m multiport --dports port

  -m multiport --ports port

  端口如:21,22,23,80,1000:2000

  例:

  # iptables -I INPUT -d 172.16.72.1 -s 172.16.0.0/16 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT


(2)、iprange扩展 --------------以【连续的IP地址范围】指明连续的多个地址的匹配条件

  -m iprange --src-range from[-to]

  -m iprange --dst-range from[-to]

  地址范围如:172.16.50.1-172.16.72.254

  例:

  # iptables -I INPUT 4 -m iprange --src-range 172.16.0.1-172.16.72.254 -p tcp -m multiport --dports 21,22,80 -j ACCEPT


(3)、string扩展 -------------对报文中的应用层数据做【字符串匹配】检测

  -m string --algo {bm|kmp} --------------选择处理字符串的算法

  -m string --string pattern -------------指明要检查匹配的字符串

  例:

  # iptables -A OUTPUT -s 172.16.72.1 -d 172.16.0.0/16 -m string --string "admin" --algo kmp -j DROP


(4)、time扩展 ---------------根据报文【到达的时间】与指定的【时间范围】进行匹配度检测

  -m time --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

  -m time --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

  -m time --timestart hh:mm[:ss] --------------------timestart 09:00:00

  -m time --timestop hh:mm[:ss] ----------------------timestop 17:00:00 

  -m time --monthdays day[,day...]

  -m time --weekdays day[,day...] ----------------------weekdays Sat,Sun

  例:

  # iptables -I INPUT -d 172.16.72.1 -p tcp -m multiport --dports 21,23,80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Sat,Sun --kerneltz -j ACCEPT


(5)、connlimit扩展 --------------根据每个客户端【IP并发连接数】的匹配

  -m connlimit --connlimit-upto n ------------------连接数数量小于等于n,此时规则应设置为允许

  -m connlimit --connlimit-above n ---------------连接数数量大于n,此时规则应设置为拒绝

  例:

  # iptables -I INPUT -d 172.16.72.1 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT


(6)、limit扩展 -------------------基于【收发报文的速率】进行匹配

  -m limit --limit rate[/second|/minute|/hour|/day]

  -m limit --limit-burst number

  例:

  # iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 8 -j ACCEPT


(7)、state扩展 --------------状态检测(基于连接追踪机制)

  格式:-m state --state *

  INVALID --------------无效状态(无法识别的状态)

  ESTABLISHED --------------连接态(已建立连接的状态)

  NEW ------------------新连接态(尚未建立连接的状态)

  RELATED ------------关联态(与其他已建立的连接相关联的状态)

  UNTRACKED -----------未追踪的连接

  

  /proc/net/nf_conntrack ----------------追踪到的【连接保存】的位置,追踪FTP协议的模块

  /proc/sys/net/nf_conntrack_max -------------------能够被追踪到的【最大连接数】

  /proc/sys/net/netfilter/*timeout -------------不同协议的连接追踪的【超时时间】

  例:

  # iptables -I INPUT -d 172.16.72.1 -m state --state ESTABLISHED,RELATED -j ACCEPT

  # iptables -I INPUT 2 -d 172.16.72.1 -p tcp -m multiport --dports 21,22,23,80,3306 -m state --state NEW -j ACCEPT

  # iptables -A INPUT -j DROP --------------------默认的规则或最后一条规则拒绝所有主机访问

  

  # iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

  # iptables -A OUTPUT -j DROP --------------------默认的规则或最后一条规则拒绝所有主机访问



3、网络防火墙 -------------------filter表FORWARD链规则设置、nat表相关链规则设置

(1)、FORWARD链配置如下:

  例:

  # iptables -A FORWARD -j DROP

  # iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

  # iptables -I FORWARD 2 -d 192.168.100.2 -p tcp -m multiport --dports 21:23,80,3306 -m state --state NEW -j ACCEPT

  # iptables -I FORWARD 3 -d 192.168.100.2 -p udp --dport 53 -m state --state NEW -j ACCEPT

  # iptables -I FORWARD 4 -s 192.168.100.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT


(2)、自定义链:

  自定义链的配置如下:

  例:

  # iptables -N udp_match -----------------新建一条自定义链

  # iptables -A udp_match -j RETURN

  # iptables -I udp_match -d 192.168.100.2 -p udp --dport 53 -j ACCEPT

  # iptables -I udp_match 2 -d 192.168.100.2 -p udp --dport 137 -j ACCEPT

  # iptables -I udp_match 3 -d 192.168.100.2 -p udp --dport 138 -j ACCEPT


  在主链上【引用】自定义链:

  # iptables -I FORWARD 4 -p udp -j udp_match


  更改自定义链的名称:-----------自定义链不能被引用

  # iptables -E old_chain_name new_chain_name

  例:

  # iptables -E udp_match udp


  删除自定义链:---------------引用计数为0的链、自定义链上必须为空

  # iptables -X udp



4、NAT表 -------------SNAT、DNAT

  NAT表功能(两个):网络地址转换(NAT)、端口映射(NAPT)

  网络地址转换NAT(两类):SNAT(内访外,静态地址转换、地址伪装)、DNAT(外访内,地址转换、端口映射)

(1)、SNAT ----------内访外,静态地址转换、地址伪装

  格式:--to-source [ipaddr[-ipaddr]][:port[-port]]

  例:

  # iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j SNAT --to-source 172.16.72.50


(2)、MASQUERADE ------------相当于替代

  格式:--to-ports port[-port]

  例:

  # iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j MASQUERADE


(3)、DNAT ---------------------外访内,地址转换、端口映射

  格式:--to-destination [ipaddr[-ipaddr]][:port[-port]]

  例:

  # iptables -t nat -A PREROUTING -d 172.16.72.50 -j DNAT --to-destination 192.168.100.2

  # iptables -t nat -A PREROUTING -d 172.16.72.50 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:8077


  注意:使用iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077 做端口重定向的时候,主机上的真正的80端口不能被httpd监听,否则就会有错误。


(4)、REDIRECT -------------端口重定向

  格式:--to-ports port[-port]

  # iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077


(5)、LOG -------------------仅仅是开启内核对匹配的数据包做额外的日志记录

  格式:

  --log-level level

  --log-prefix prefix

  --log-ip-options


5、NAT表中,规则的保存和重载

(1)、CentOS 7保存和重载

  /etc/sysconfig/iptables -------------------规则保存位置

  # iptables-save > /PATH/TO/SOME_RULE_FILE

  # iptables-restore < /PATH/FROM/SOME_RULE_FILE


(2)、CentOS 6保存和重载

 /etc/sysconfig/iptables -----------------默认规则保存位置

  # iptables-save > /PATH/TO/SOME_RULE_FILE

  # iptables-restore < /PATH/FROM/SOME_RULE_FILE


  # service iptables save

  # service iptables restore|restart



二、layer7扩展模块 ----------------------应用层,iptables实现七层访问过滤

 文本操作工具:diff、patch

1、diff命令 -----------比较两个文本文件的差异

 格式:diff <变动前的文件> <变动后的文件>

 diff的三种格式:正常格式、上下文格式、合并格式

(1)、正常格式的diff

  # diff file1 file2 --------------------结果 3 部分

  显示结果中,【第一行】是一个提示,用来说明变动位置。

  第一行分为三个部分:

  #  ------------表示file1的第 # 行有变化

  c -------------表示变动的模式是【内容改变change】

  a -------------代表增加addition

  d -------------代表删除deletion

(2)、上下文格式的diff

  常用选项:

  -c ---------------context

  

  # diff -c f1 f2 --------------结果 4 部分

  显示结果中的四部分如下:

  第一部分:-----------两行,显示两个文件的基本情况,*表变动前,-表变动后。

  第二部分:-----------15个星号,将文件的基本情况与变动内容分割开。

  第三部分:-----------显示变动【前】的文件,即file1。

  第四部分:-----------显示变动【后】的文件,即file2。

  注:文件内容的每一行最前面,还有一个标记位。

      空 ------------表示该行无变化

      ! -------------表示该行有改动

      - -------------表示该行被删除

      + -------------表示该行为新增

        

(3)、合并格式的diff -----------------将f1和f2的上下文合并在一起显示

  常用选项:

  -u -------------unified(合并)

  

  # diff -u f1 f2 -----------------上下文各显示3行

  显示结果中的三部分如下:

  第一部分: -----------文件的基本信息,-表变动前的文件,+表变动后的文件。

  第二部分: -----------【变动】的位置用【两个@】作为起首和结束。

  第三部分: -----------变动的具体内容。

  注:文件内容的每一行最前面,还有一个标记位。

      空 ------------表示该行无变化

      ! -------------表示该行有改动

      - -------------表示该行被删除

      + -------------表示该行为新增        


2、patch命令 --------------------支持多种diff输出文件格式,可以忽略文件中的冗余信息

  格式:patch [options] [originalfile] [patchfile]

  常用选项:

  -p --------------使用源文件名的【前缀目录】信息

  -p0/-p 0 -------------使用全部的路径信息

  -p1 ----------------忽略第一个"/"以前的目录,其余类似。

  例:

  /usr/src/linux-2.4.15/Makefile文件,提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。



3、实现layer7操作步骤,如下:-------------------9步

(1)、获取并编译内核

  # useradd mockbuild

  # rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm

  # cd rpmbuild/SOURCES

  # tar linux-2.6.32-*.tar.gz -C /usr/src

  # cd /usr/src

  # ln -sv 


(2)、给内核打补丁

  # tar xf netfilter-layer7-v2.23.tar.bz2

  # cd /usr/src/linux

  # patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch

  # cp /boot/config-*  .config

  # make menuconfig


  启用layer7模块步骤:   

    Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration

    <M>  “layer7” match support


(3)、编译并安装内核

  # make

  # make modules_install

  # make install


(4)、重启系统,启用新内核


(5)、编译iptables

  # tar xf iptables-1.4.20.tar.gz

  # cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/

  # cp /etc/rc.d/init.d/iptales /root

  # cp /etc/sysconfig/iptables-config /root

  # rpm -e iptables iptables-ipv6 --nodeps

  # ./configure  --prefix=/usr  --with-ksource=/usr/src/linux

  # make && make install


  # cp /root/iptables /etc/rc.d/init.d

  # cp /root/iptables-config /etc/sysconfig


(6)、为layer7模块提供其所识别的协议的【特征码】

  # tar zxvf l7-protocols-2009-05-28.tar.gz

  # cd l7-protocols-2009-05-28

  # make install    


(7)、使用layer7模块

  设置ACCT参数,装载nf_conntrack模块。

  net.netfilter.nf_conntrack_acct = 1

  

  l7-filter uses the standard iptables extension syntax 


(8)、编译内核:

  # make menuconfig

  # make -j #

  # make modules_install

  # make install


(9)、清理内核源码树



4、抵御对22端口发起的DOS攻击 -------------解决方法

 利用iptables的【recent模块】来抵御对22端口发起的DOS攻击,建立一个列表,保存有所有访问过指定的服务的客户端IP。 

  # iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP


  # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

  # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

  注:SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

  # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP


  知识点:

(1)、利用connlimit模块将单IP的并发设置为3。会误杀使用NAT上网的用户,可以根据实际情况增大该值。

(2)、利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制【五分钟】后即可恢复访问。

(3)、--set --name SSH -----------------------记录访问tcp 22端口的新连接,记录名称为SSH

       --set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

(4)、记录日志:

  使用:

  # iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "

  也可使用:

  # iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"

(5)、iptables的记录:/proc/net/xt_recent/SSH




三、SELinux

1、操作系统的【安全级别】:(4个)

  1、D ---------最低

  2、C:C1、C2

  3、B:B1、B2、B3(B3最高)

  4、A:A1、A2


2、selinxu【访问控制机制】:

DAC ---------------自主访问控制(针对用户设定)

MAC ---------------强制访问控制(不针对用户)


3、selinux的两种【工作级别】:strict、targeted(默认)

  strict ------------------每个文件都受selinux严格管控

  targeted ----------------部分文件受selinux管控(默认级别)


4、selinux的【工作模式】:enforcing、permissive、disabled

# setenforce 0 ------------permissive

# setenforce 1 ------------enforcing 

# getenforce -----------查看工作级别


使工作模式永久生效:修改配置文件/etc/sysconfig/selinux

SELINUX=enforcing 


5、文件的安全标签

(1)、安全标签的查看

  # ls --context|-Z [file...] -------------文件的

  # ps auxZ -------------进程的


(2)、chcon命令 ----------------更改文件安全标签

  格式:chcon [options]... CONTEXT FILE...

  常用选项:

  -t type ---------类型

  -R ------------递归修改文件

  --reference=FILE --------------设置相同的安全上下文


  适用:目标页面文件的类型与httpd进程的域不相符合时


(3)、restorecon命令 -------------还原安全上下文默认值

  常用选项:

  -R -----------递归还原文件 


6、Linux布尔型规则:

(1)、getsebool命令

  常用选项:

  -a -------------显示所有已经生效的布尔型规则


(2)、setsebool命令

  常用选项:

  -P --------写入策略文件,使更改永久生效

  

  例1:

  ftp的匿名用户【上传功能】:

  # setsebool -P ftpd_full_access=1

  # setsebool -P ftpd_anon_write=1

  例2:

  samba用户访问自己的家目录:

  # setsebool -P samba_enable_home_dirs=1


(3)、semanage命令

  # semanage port -a -t http_port_t -p tcp 8077

  注:需安装policycoreutils-python


以上是关于Linux的安全设置,网络防火墙的主要内容,如果未能解决你的问题,请参考以下文章

linux代理不能代理项目网络

网络安全巧设置 Win2008 R2 防火墙详解

linux下共享文件怎么查看

linux之网络安全

Linux网络安全模型及iptables详解

《网络安全入门到精通》-1.2 - Linux系统 - firewalld防火墙&iptables防火墙