Linux下的防火墙
Linux下的防火墙
Linux防火墙简介:
首先,网络封包要进入你主机,需要经过的流程:通过防火墙、服务器软件程序(验证账号)、SELinux与文件系统(权限rwx等)等。 防火墙的主要类别:1,Netfilter (封包过滤机制); 2,TCP Wrappers (程序控管); 3,Proxy (代理服务器)。 Netfilter可做的事:1,、拒绝让 Internet 的封包进入主机的某些端口口; 2、拒绝让某些来源 IP 的封包进入 3、拒绝让带有某些特殊旗标 (flag) 的封包进入 4、分析硬件地址 (MAC) 来决定联机与否TCP Wrappers :是透过 /etc/hosts.allow, /etc/hosts.deny 这两个宝贝蛋来管理的一个类似防火墙的机制, 但并非所有的软件都可以透过这两个档案来控管,只有底下的软件才能够透过这两个档案来管理防火墙规则,分别是:1、由 super daemon (xinetd) 所管理的服务;2、有支援 libwrap.so 模块的服务。
Proxy :如图
Netfilter :iptables机制
因为iptables用得更多范围更广,所以这里只详细介绍Netfilter :iptables防火墙,其他两个,请想深入了解的读者自行百度。iptables简介:
注:当一个网络封包要进入到主机之前,会先经由 NetFilter 进行检查,那就是 iptables 的规则了。 检查通过则接受 (ACCEPT) 进入本机取得资源,如果检查不通过,则可能予以丢弃 (DROP) ! 上图中主要的目的在告知你:『规则是有顺序的』!例如当网络封包进入 Rule 1 的比对时, 如果比对结果符合 Rule 1 ,此时这个网络封包就会进行 Action 1 的动作,而不会理会后续的 Rule 2, Rule 3.... 等规则的分析了。Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。 这里笔者只介绍filter: 1、INPUT:主要与想要进入我们 Linux 本机的封包有关; 2、OUTPUT:主要与我们 Linux 本机所要送出的封包有关; 3、FORWARD:这个东东与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与 nat table 相关性较高。
iptables语法:
规则的观察与清除:
查看:[root@www ~]# iptables [-t tables] [-L] [-nv] 选项与参数: -t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter -L :列出目前的 table 的规则 -n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多! -v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
例如:iptables -L -n iptables-save 这个指令也可以观察防火墙规则。
清除:
[root@www ~]# iptables [-t tables] [-FXZ] 选项与参数: -F :清除所有的已订定的规则; -X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )啰; -Z :将所有的 chain 的计数与流量统计都归零
定义预设政策 (policy):
[root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP] 选项与参数: -P :定义政策( Policy )。注意,这个 P 为大写啊! ACCEPT :该封包可接受 DROP :该封包直接丢弃,不会让 client 端知道为何被丢弃。在本机方面的预设政策中,假设你对于内部的使用者有信心的话, 那么 filter 内的 INPUT 链方面可以定义的比较严格一点,而 FORWARD 与 OUTPUT 则可以订定的松一些!
范例:将本机的 INPUT 设定为 DROP ,其他设定为 ACCEPT [root@www ~]# iptables -P INPUT DROP [root@www ~]# iptables -P OUTPUT ACCEPT [root@www ~]# iptables -P FORWARD ACCEPT
封包的基础比对:IP, 网域及接口装置:
[root@www ~]# iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 来源IP/网域] [-d 目标IP/网域] -j [ACCEPT|DROP|REJECT|LOG] 选项与参数: -AI 链名:针对某的链进行规则的 "插入" 或 "累加" -A :新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则, 使用 -A 就可以加上第五条规则! -I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。 例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号 链 :有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关,请看底下。 -io 网络接口:设定封包进出的接口规范 -i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合; -o :封包所传出的那个网络接口,需与 OUTPUT 链配合; -p 协定:设定此规则适用于哪种封包格式 主要的封包格式有: tcp, udp, icmp 及 all 。 -s 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括网域, 例如: IP :192.168.0.100 网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。 若规范为『不许』时,则加上 ! 即可,例如: -s ! 192.168.100.0/24 表示不许 192.168.100.0/24 之封包来源; -d 目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域。 -j :后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
TCP, UDP 的规则比对:针对端口设定:
[root@www ~]# iptables [-AI 链] [-io 网络接口] [-p tcp,udp] [-s 来源IP/网域] [--sport 埠口范围] [-d 目标IP/网域] [--dport 埠口范围] -j [ACCEPT|DROP|REJECT] 选项与参数: --sport 埠口范围:限制来源的端口口号码,端口口号码可以是连续的,例如 1024:65535 --dport 埠口范围:限制目标的端口口号码。注:因为仅有 tcp 与 udp 封包具有端口,因此你想要使用 --dport, --sport 时,得要加上 -p tcp 或 -p udp 的参数才会成功喔
iptables 外挂模块:mac 与 state:
[root@www ~]# iptables -A INPUT [-m state] [--state 状态] 选项与参数: -m :一些 iptables 的外挂模块,主要常见的有: state :状态模块 --state :一些封包的状态,主要有: INVALID :无效的封包,例如数据破损的封包状态 ESTABLISHED:已经联机成功的联机状态; NEW :想要新建立联机的封包状态; RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关 mac :网络卡硬件地址 (hardware address) --mac-source :就是来源主机的 MAC 啦!
ICMP 封包规则的比对:针对是否响应 ping 来设计:
小知识:ICMP 协定当中我们知道 ICMP 的类型相当的多,而且很多 ICMP 封包的类型都是为了要用来进行网络检测用的!所以最好不要将所有的 ICMP 封包都丢弃!如果不是做为路由器的主机时,通常我们会把 ICMP type 8 (echo request) 拿掉而已,让远程主机不知道我们是否存在,也不会接受 ping 的响应就是了。[root@www ~]# iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT 选项与参数: --icmp-type :后面必须要接 ICMP 的封包类型,也可以使用代号, 例如 8 代表 echo request 的意思。
IPv4 的核心管理功能: /proc/sys/net/ipv4/*
echo "1" > /proc/sys/net/ipv4/tcp_syncookies 阻断式服务 (DoS) 攻击法当中的一种方式,就是利用 TCP 封包的 SYN 三向交握原理所达成的, 这种方式称为 SYN Flooding,上面指令就是启用核心的 SYN Cookie 模块来防止这种情况。 echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 让核心自动取消 ping 的响应。/proc/sys/net/ipv4 内的 icmp_echo_ignore_broadcasts (仅有 ping broadcast 地址时才取消 ping 的回应) 及 icmp_echo_ignore_all (全部的 ping 都不回应)。
/proc/sys/net/ipv4/conf/网络接口/*
rp_filter:称为逆向路径过滤 (Reverse Path Filtering), 可以藉由分析网络接口的路由信息配合封包的来源地址,来分析该封包是否为合理。举例来说,你有两张网卡,eth0 为 192.168.1.10/24 ,eth1 为 public IP 。那么当有一个封包自称来自 eth1 ,但是其 IP 来源为 192.168.1.200 , 那这个封包就不合理,应予以丢弃。这个设定值建议可以启动的。 log_martians:这个设定数据可以用来启动记录不合法的 IP 来源, 举例来说,包括来源为 0.0.0.0、127.x.x.x、及 Class E 的 IP 来源,因为这些来源的 IP 不应该应用于 Internet 啊。 记录的数据默认放置到核心放置的登录档 /var/log/messages。 accept_source_route:或许某些路由器会启动这个设定值, 不过目前的设备很少使用到这种来源路由,你可以取消这个设定值。 accept_redirects:当你在同一个实体网域内架设一部路由器, 但这个实体网域有两个 IP 网域,例如 192.168.0.0/24, 192.168.1.0/24。此时你的 192.168.0.100 想要向 192.168.1.100 传送讯息时,路由器可能会传送一个 ICMP redirect 封包告知 192.168.0.100 直接传送数据给 192.168.1.100 即可,而不需透过路由器。因为 192.168.0.100 与 192.168.1.100确实是在同一个实体线路上 (两者可以直接互通),所以路由器会告知来源 IP 使用最短路径去传递数据。但那两部主机在不同的 IP 段,却是无法实际传递讯息的!这个设定也可能会产生一些轻微的安全风险,所以建议关闭他。 send_redirects:与上一个类似,只是此值为发送一个 ICMP redirect 封包。 同样建议关闭。
事例
以下介绍是基于一台服务器,系统为centos7:#!/bin/bash #网卡信息,环境变量 EXTIF="eno1" #公网网卡接口 INIF="eno16777736" #内部LAN接口 INNET="192.168.1.0/24" #内部网 FILEDIR="/usr/local/erdangjiade/iptables/" #allow、deny文件的存放路径 export EXTIF INIF INNET FILEDIR #设定核心的网络功能 echo "1" > /proc/sys/net/ipv4/tcp_syncookies echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do echo "1" > $i done for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,send_redirects}; do echo "0" > $i done #设定规则 PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH iptables -F iptables -X iptables -Z iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p TCP -m state --state NEW -i $INIF -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #允许内网ping iptables -A INPUT -i $INIF -p icmp -j ACCEPT #个别设定 if [ -f ${FILEDIR}iptables.deny ]; then sh ${FILEDIR}iptables.deny fi if [ -f ${FILEDIR}iptables.allow ]; then sh ${FILEDIR}iptables.allow fi #防止大量ping #AICMP="0 3 3/4 4 11 12 14 16 18" #for tyicmp in $AICMP #do # iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT #done #对某些服务开放端口 #SSH iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT #WWW iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT #保存以上修改 service iptables save参考文章:《鸟哥的私房菜,服务器篇》
转载请标明原文出处:http://blog.csdn.net/u012367513/article/details/40628197
评论暂时关闭