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
如果想将上述事例的防火墙设置开机启动,可以将事例文档的路径写入/etc/rc.d/rc.local(只需将路径写入,不用在前面加bash执行),注:rc.local默认是不可执行的,需要将它开启:chmod +x /etc/rc.d/rc.local
参考文章:《鸟哥的私房菜,服务器篇》
转载请标明原文出处:http://blog.csdn.net/u012367513/article/details/40628197