kernel版本不同 防火墙机制不同--2004年以后的distributions 已经都为2.6的kernel
Version 2.0:使用 ipfwadm 这个防火墙机制;
Version 2.2:使用的是 ipchains 这个防火墙机制;
Version 2.4 与 2.6 :主要是使用 Netfilet机制的iptables 这个软件,不过在某些早期的 Version 2.4 版本也同时支持 ipchains (编译成为模块)。不过,不建议在 2.4 之后的核心版本使用 ipchains !
table
表格 防火墙可以有多个表格 :定义默认政策与规则
Linux的iptables至少有三个表格
管理本机进出的 filter表格
管理后端主机 (防火墙内部的其他计算机) 的 nat 表格
管理特殊旗标使用的 mangle表格 (较少使用)
chain
链 表格中可以有多个链
filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table!
INPUT:主要与想要进入我们 Linux 本机的封包有关;
OUTPUT:主要与我们 Linux 本机所要送出的封包有关;
FORWARD:这个咚咚与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与nat table 相关性较高。
nat (地址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源IP与目的 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关。
PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT:与发送出去的封包有关
mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以单纯的环境当中,较少使用 mangle table。
[root@www ~]# iptables [-t tables] [-L] [-nv]选项与参数:
-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L :列出目前的 table 的规则
-n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
本机的iptables语法
列出filter table 的三条链规则
[root@bird ~]# iptables -L -n
Chain INPUT (policy ACCEPT) INPUT链预设政策为放行
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 规则1
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 规则2
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:23
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8888
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,尚有 DROP (丢弃) 的项目!
prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;
opt:额外的选项说明
source :代表此规则是针对哪个『来源 IP』进行限制
destination :代表此规则是针对哪个『目标 IP』进行限制
以上的信息结合iptables-save命令查看比较清晰
[root@bird ~]# iptables-save -t filter
# Generated by iptables-save v1.4.7 on Wed Nov 16 21:01:07 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [11661:2912327]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 23 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Nov 16 21:01:07 2016
修改防火墙规则前 一般都清除本机防火墙(filter)的所有规则 然后逐条添加 这三条规则不会改变预设政策policy
一下只是临时清除
[root@bird ~]# iptables -F 清除所有的已定制的规则
[root@bird ~]# iptables -X 杀掉所有使用者 自定义的tables
[root@bird ~]# iptables -Z 将所有的chaind的计数与流量统计都归零
定义预设政策policy
当你的封包不在你设定的规则之内时,则该封包的通过与否,是以 链的Policy 的设定为准
将本机filter表格的INPUT链设置为DROP
[root@bird ~]# iptables -P INPUT DROP
封包的规则配置
[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)
封包的基础规则比对:IP,网域及接口装置(网卡)的配置
没有指定的选项 则表示该选项完全接受
设定lo为受信任的装置 即进入lo的封包都接受
[root@bird ~]# iptables -A INPUT -i lo -j ACCEPT
来自内网的封包都接受
[root@bird ~]# iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
指定具体ip
[root@bird ~]# iptables -A INPUT -i eth0 -s 192.168.0.x -j DROP
记录某个规则 (只是记入日志/var/log/messages中 会继续依据后续规则对比)
[root@bird ~]# iptables -A INPUT -s 192.168.x.x -j 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 端口范围:限制目标的端口号码。
端口21的封包全部拒绝
[root@bird ~]# iptabels -A INPUT -i eth0 -p tcp --dport 21 -j DROP
只要来自 192.168.1.0/24 的 1024:65535 端口的封包,且想要联机到本机的 ssh port 就予以拒绝
[root@bird ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 -dport ssh -j DROP
TCP 还有特殊的旗标flags!针对主动联机的 SYN 旗标的限制规则
[root@bird ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.129.124/23 --sport 1:1023 -dport 1:1023 --syn -j DROP
iptables的外挂模块: state 与 mac
ipchains 没有所谓的封包状态模块,因此我们必须要针对封包的进、出方向进行管控
iptables 免除了这个困扰!他可以透过一个状态模块来分析 这个想要进入的封包是否为刚刚我发出去的响应
[root@www ~]# iptables -A INPUT [-m state] [--state 状态]选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
state :状态模块
mac :网络卡硬件地址 (hardware address)
--state :一些封包的状态,主要有:
INVALID :无效的封包,例如数据破损的封包状态
ESTABLISHED:已经联机成功的联机状态;
NEW :想要新建立联机的封包状态;
RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关
只要是已建立或相关封包就予以通过 只要是不合法的封包就丢弃 这样就无需对“响应封包”单独撰写规则了
[root@bird ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@bird ~]# iptables -A INPUT -m state --state INVALID -j DROP
针对网卡的接受与拒绝
[root@bird ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
ICMP 封包规则的比对:针对是否响应 ping 来设计
通常我们会把 ICMP type 8 (echo request) 拿掉而已,让远程主机不知道我们是否存在,也不会接受 ping 的响应就是了
[root@bird ~]# iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP
因为客户端需要检测网络是否畅通 所以局域网的路由器主机 建议不要关闭为好
类别代号 | 类别名称与意义 |
0 | Echo Reply (代表一个响应信息) |
3 | Destination Unreachable (表示目的地不可到达) |
4 | Source Quench (当 router 的负载过高时,此类别码可用来让发送端停止发送讯息) |
5 | Redirect (用来重新导向路由路径的信息) |
8 | Echo Request (请求响应消息) |
11 | Time Exceeded for a Datagram (当数据封包在某些路由传送的现象中造成逾时状态,此类别码可告知来源该封包已被忽略的讯息) |
12 | Parameter Problem on a Datagram (当一个 ICMP 封包重复之前的错误时,会回复来源主机关于参数错误的讯息) |
13 | Timestamp Request (要求对方送出时间讯息,用以计算路由时间的差异,以满足同步性协议的要求) |
14 | Timestamp Reply (此讯息纯粹是响应 Timestamp Request 用的) |
15 | Information Request (在 RARP 协议应用之前,此讯息是用来在开机时取得网络信息) |
16 | Information Reply (用以响应 Infromation Request 讯息) |
17 | Address Mask Request (这讯息是用来查询子网 mask 设定信息) |
18 | Address Mask Reply (响应子网 mask 查询讯息的) |
设置了一个本地虚拟机的规则
规则归零:清除所有已经存在的规则 (iptables -F...)
预设政策:除了 INPUT 这个自定义链设为 DROP 外,其他为预设 ACCEPT;
信任本机:由于 lo 对本机来说是相当重要的,因此 lo 必须设定为信任装置;
回应封包:让本机主动向外要求而响应的封包可以进入本机 (ESTABLISHED,RELATED)
信任用户:这是非必要的,如果你想要让区网的来源可用你的主机资源时
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/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 -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT (可以主动请求外部)
iptables -A INPUT -I eht0 -s 192.168.0.124/24 -j ACCEPT 开放了本机ip(宿主是手动设置的DHCP ip)
[root@bird shell]# chmod 744 firewall.sh
[root@bird shell]#./firewall.sh
[root@bird shell]# /etc/init.d/iptables status
表格:filter
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 ACCEPT all -- 192.168.129.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@bird shell]# /etc/init.d/iptables save
其实直接修改/etc/sysconfig/iptables 然后 /etc/init.d/iptables restart也可以
IPv4的核心管理功能: /proc/sys/net/ipv4/*
阻断式服务 (DoS) ***法当中的一种方式,就是利用 TCP 封包的 SYN 三向交握原理所达成的,称为 SYN Flooding
可以启用核心的 SYN Cookie模块来预防SYN Flooding
SYN Cookie 可以在系统用来启动随机联机的端口 (1024:65535) 即将用完时自动启动。
但不适合负载已经很高的服务器内 会延迟 比如SMTP
当启动 SYN Cookie 时,主机在发送 SYN/ACK 确认封包前,会要求 Client 端在短时间内回复一个序号,这个序号包含许多原本 SYN 封包内的信息,包括 IP、port 等。若 Client 端可以回复正确的序号,那么主机就确定该封包为可信的,因此会发送 SYN/ACK 封包,否则就不理会此一封包。
启动SYN Cookie模块
[root@bird ~]# echo "1" > /proc/sys/net/ipv4/tcp_syncookies
数台主机同时不断携带大数据ping你的主机使主机带宽被吃光,或系统会当 称为 ping flooding
可以用防火墙来抵挡也可以用核心模块来自动取消 ping 的响应
[root@bird ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 仅有 ping broadcast 地址时才取消 ping 的回应
[root@bird ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all 全部的 ping 都不回应 不建议使用
/proc/sys/net/ipv4/conf/网络接口/*
核心还可以针对不同的网络接口进行不一样的参数设定
可以使用 echo "1" > /proc/sys/net/ipv4/conf/???/rp_filter
建议直接修改文件 /etc/sysctl.conf +sysctl -p
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 封包。 同样建议关闭。