1. 前言
iptables是一个用于Linux操作系统的防火墙软件,它可以对网络流量进行过滤、修改和重定向,从而控制网络通信。iptables是Linux内核中的一个子系统,它可以通过在命令行输入规则来配置网络防火墙。iptables可以对入站和出站的流量进行控制,允许或阻止特定的IP地址、协议和端口。它是Linux系统中最常用的网络安全和防火墙软件之一。
Linux 的iptables在企业应用中非常有用,举例如下:
1.中小企业与网吧里有 iptables 作为企业的NAT路由器,可以用来代替传统路由器,而节约成本。
2.IDC机房一般没有硬件防火墙,IDC机房的服务器可以用 Linux 防火墙代替硬件防火墙。
3.iptables 可以结合 squid 作为企业内部上网的透明代理。传统代理需要在浏览器里配置代理服务器信息,而 iptables+squid 的透明代理则可以把客户端的请求重定向到代理服务器的端口。客户端不要作任何设置,而感觉不到代理的存在。
4.将 iptables 作为企业NAT路由器时,可以使用 iptables 的扩展模块屏蔽 P2P 流量,还可以禁止非法网页。
5.iptables 可以用于外网 IP 向内网IP映射。
6.iptables 可以轻松防止轻量级 DOS 攻击,比如 ping 攻击及 SYN 洪水攻击。
所以,Iptables 主要有两种应用模式:主机防火墙,NAT路由器。
2. netfilter与iptables
Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
1.网络地址转换(Network Address Translate)
2.数据包内容修改
3.数据包过滤防火墙
Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
。
Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables
、链chains
、规则rules
组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。
3.iptables的基本组件
3.1 规则四表
规则四表分别是: filter表、nat表、mangle表、raw表。
3.1.1 filter表
主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:
INPUT
链:INPUT针对那些目的地是本地的包
FORWARD
链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的
OUTPUT
链:OUTPUT是用来过滤所有本地生成的包
3.1.2 nat表
主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个规则链:
PREROUTING
链:作用是在包刚刚到达防火墙时改变它的目的地址
OUTPUT
链:改变本地产生的包的目的地址
POSTROUTING
链:在包就要离开防火墙之前改变其源地址
3.1.3 mangle表
主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD
3.1.4 raw表
是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING。
3.2 规则五链
在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链
INPUT
链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
OUTPUT
链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
FORWARD
链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
PREROUTING
链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。
POSTROUTING
链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。
INPUT、OUTPUT链主要应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制。
FORWARD、PREROUTING、POSTROUTING链主要的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。
4.数据包路由原理
这个Xtables表是怎么在内核协议栈的数据包路由中起作用的呢?
工作流程:
网口数据包由底层的网卡NIC接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,经过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。
找到了一张很好的图,如下:
从上图中,我们可以总结出以下规律
1.当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的"路由模块"根据"数据包目的IP"以及"内核中的路由表"判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)
2.如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会-收到它
3.本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
4.如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)
在写iptables规则的时候,可以按照这张路由次序图,根据所在Hook点的不同,灵活配置规则。
5.iptables编写规则
命令格式:
示例:
iptables -I INPUT -s 0/0 -d 192.168.42.153 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
iptables -t filter -I INPUT -d 192.168.42.153 -p tcp --dport 80 -j ACCEPT
5.1 table + command
[-t 表名]
:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter
-
-A
:新增一条规则,到该规则链列表的最后一行-I
:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1-D
:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除-R
:替换某条规则,规则替换不会改变顺序,而且必须指定编号。-P
:设置某条规则链的默认动作-nL
:-L
、-n
,查看当前运行的防火墙规则列表
5.2 chain + parameter
chain名
:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等
-
[规则编号]
:插入、删除、替换规则时用,--line-numbers
显示号码[-i|o 网卡名称]
:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出[-p 协议类型]
:可以指定规则应用的协议,包含tcp、udp和icmp等[-s 源IP地址]
:源主机的IP地址或子网地址[--sport 源端口号]
:数据包的IP的源端口号[-d目标IP地址]
:目标主机的IP地址或子网地址[--dport目标端口号]
:数据包的IP的目标端口号
5.2.1 -m
-m
:extend matches,这个选项用于提供更多的匹配参数,如:
-
- -m state --state ESTABLISHED,RELATED
- -m tcp --dport 22
- -m multiport --dports 80,8080
- -m icmp --icmp-type 8
5.3 target
<-j 动作>
:处理数据包的动作,包括ACCEPT、DROP、REJECT等
-
ACCEPT
:允许数据包通过DROP
:直接丢弃数据包,不给任何回应信息-
REJECT
:拒绝数据包通过,必要时会给数据发送端一个响应的信息。 -
SNAT
:源地址转换。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。MASQUERADE
,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上 -
DNAT
:目标地址转换。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。(感谢网友提出之前这个地方与SNAT写反了)REDIRECT
:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。 -
LOG
:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
除去最后一个LOG
,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。
5.3.1 SNAT 和 DNAT
Linux防火墙在很多时候承担着连接企业内、外网的重任,除了提供数据包过滤功能以外,有时还需要提供一些基本的网关应用。在配置 SNAT 和 DNAT 之前,需要开启 Linux 系统中的地址转发功能,否则数据无法通过防火墙转发出去。
修改/etc/sysctl.conf配置文件件,将ip_forward的值设置为1即可。
[root@localhost /]#vim /etc/sysctl.conf
......//省略部分内容
net.ipv4.ip_forwaed=1 //将此行中的0改为1
[root@localhost /]#sysctl -p //重新读取修改后的配置
也可以开启临时的路由转发,可以执行以下操作。
[root@localhost /]#echo 1> /proc/sys/net/ipv4/ip_forward
或者
[root@localhost /]#sysctl -w net.ipv4.ip_forward=1
5.3.1.1 SNAT的策略及应用
SNAT:源地址转换,是Linux防火墙的一种地址转换操作,也是 iptables 命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址。
SNAT 策略只能用在nat表的POSTROUTING链中,使用iptables命令编写SNAT策略时,需要结合“--to-source IP地址”选项来指定修改后的源IP地址。
场景举例:Linux网关服务器通过eth0和eth1分别连接Internet和局域网,其中eth0的IP地址为218.29.30.31,eth1的IP地址为192.168.1.1。现在要求在Linux网关服务器上配置规则,使用局域网内的所有用户可以通过共享的方式访问互联网。可执行以下操作:
1)开启路由转发,见上一个小节。
2)在iptables的POSTROUTING中编写SNAT规则。
[root@localhost /]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
3)在某些情况下,网关的外网IP地址可能不是固定的,列如使用ADSL宽带接入时,针对这这种需求,iptables提供了一个名为MASQUERASE(伪装)的数据包控制类型,MASQUERADE相当于SNAT的一个特列,同样同来修改数据包的源IP地址只过过它能过自动获取外网接口的IP地址。
参照上一个SNAT案例,若要使用MASQUERADE伪装策略,只需要去掉SNAT策略中的“--to-source IP地址”。然而改为“-j MASQUERADE”指定数据包的控制类型。对于ADSL宽带连接来说,连接名称通常为ppp0,ppp1等。操作如下
[root@localhost /]#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
4)测试SNAT共享接入的结果
同过上面的配置,这时内部局域网访问互联网所使用的IP地址是网关服务器的外网接口地址了。我们可以在往外客户端执行“tcpdump -i eth0”监听访问本机的数据流,然后在内网ping外网客户端,然后查看外网客户端监听的状态,会发现,访问外网客户机的IP地址是网关服务器的外网接口地址,而不是内部局域网的地址。
5.3.1.2 DNAT策略及应用
DNAT:目标地址转换,是Linux防火墙的另一种地址转换操作,同样也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP地址,目标端口。
DNAT策略与SNAT策略非常相似,只不过应用方向反过来了。
SNAT用来修改源地址IP,而DNAT用来修改目标IP地址,目标端口;
SNAT只能用在nat表的POSTROUTING链,而DNAT只能用在nat表的PREROUTING链和OUTPUT链中。
例子1:借助上述网络环境,公司内部局域网内搭建了一台web服务器,IP地址为192.168.1.7,现在需要将其发布到互联网上,希望通过互联网访问web服务器。那么我们可以执行如下操作
[root@localhost /]#iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.7:80
例子2:公司的web服务器192.168.1.7需要通过互联网远程管理,由于考虑到安全问题,管理员不希望使用默认端口进行访问,这时我们可以使用DNAT修改服务的默认端口。操作如下
[root@localhost /]#iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.7:22
这样做完后,外网客户端浏览器中访问网关服务器的外网接口,可以发现访问的居然是内网192.168.1.7的web服务器的网页。而在使用sshd连接2346端口时,居然可以远程连接到192.168.1.7服务器上。
6.示例
6.1 一则需求的配置方法
需求:
1. 网口at0(10.0.0.1)是一个伪AP的网口,目标客户端连接到伪AP网口at0之后会发
起DHCPDISCOVER过程,监听在at0上的DHCPD会进行回应,
为客户端分配10.0.0.100的IP地址,并设置客户端的默认网关为10.0.0.1(即at0的IP地址)、
默认DNS服务器为10.0.0.1(即at0的IP地址)
2. 需要将网口at0(10.0.0.1)的入口流量牵引到真正连接外网的网卡接口
eth0(192.168.159.254)上,做一个NAT服务
3. 对网口at0(10.0.0.1)的DHCP流量(目的端口67的广播数据包)予以放行,
因为我们需要在伪AP所在的服务器上假设DHCP服务器
4. 对网口at0(10.0.0.1)的DNS流量(目的端口53)予以放行,
因为我们需要在伪AP所在的服务器上假设DNS服务器
配置思路:
开启Linux路由转发开关,由于本机对数据包进行转发
echo "1" > /proc/sys/net/ipv4/ip_forward
将客户端的HTTP流量进行NAT,改变数据包的SrcIP
注意,是在POSTROUTING(数据包即将发送出去之前进行修改)
iptables -t nat -A POSTROUTING -p tcp -s 10.0.0.0/24 --dport 80 -j SNAT --to-source 192.168.159.254
将远程WEB服务器返回来的HTTP流量进行NAT,回引回客户端。注意,是在PREROUTING(数据包刚进入协议栈之后马上就修改)
iptables -t nat -A PREROUTING -p tcp -d 192.168.159.254 -j DNAT --to 10.0.0.100
我们在DHCP服务器中指定客户端的默认DNS服务器是10.0.0.1(本机),即伪DNS,但我目前还没有在本机架设DNS,所以目前还需要将53号端口的DNS数据包NAT出去,牵引到谷歌的DNS: 8.8.8.8上去
iptables -t nat -A PREROUTING -p udp -s 10.0.0.0/24 --dport 53 -j DNAT --to 8.8.8.8
iptables -t nat -A POSTROUTING -p udp -s 10.0.0.0/24 --dport 53 -j SNAT --to-source 192.168.159.254
iptables -t nat -A PREROUTING -p udp -d 192.168.159.254 --sport 53 -j DNAT --to 10.0.0.100
iptables -t nat -A POSTROUTING -p udp -s 8.8.8.8 --sport 53 -j SNAT --to-source 10.0.0.1
6.2 编写iptables拒绝通过icmp的数据包(协议匹配)
iptables -A INPUT -p icmp -j DROP
6.3 编写iptables拒绝转发192.168.1.0/24到202.106.123.0/24的数据包(地址匹配)
编写iptables规则时使用“-s源地址”或“-d目标地址”的形式指定,用来检查数据包的源地址或目标地址。
iptables -A FORWARD -s 192.168.1.0/24 -d 202.106.123.0/24 -j DROP
6.4 拒绝从防火墙的eth1网卡接口ping防火墙主机(网络接口匹配)
编写iptables规则时使用“-i 接口名”和“-o 接口名”的形式,用于检查数据包从防火墙的哪一个接口进入或发出,分别对应入站网卡(--in-interface),出站网卡(--out-interface)。
iptables -A INPUT -i eth1 -p icmp -j DROP
6.5 编写iptables规则允许FTP数据包通过(端口匹配)
编写iptable规则时使用“--sport 源端口”或“--dport”的形式,针对的协议为TCP或UDP,用来检查数据包的源端口或目标端口。单个端口或者以“:”分隔的端口范围都是可以接受的,但不支持多个不连续的端口号。
[root@localhost /]#iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
6.6 拒绝外网卡接口(eth1)直接访问防火墙本机的TCP请求,但其他主机发给防火墙的TCP响应等数据包应允许(TCP标记匹配)
编写iptables规则时使用“--tcp-flags 检查范围 被设置的标记”的形式,针对的协议为TCP,用来检查数据包的标记位。其中“检查范围”指出需要检查数据包的那几个标记位,“被设置的标记”则明确匹配对应值为1的标记,多个标记之间以逗号进行分隔。
[root@localhost /]#iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
6.7 要禁止从其他主机ping防火墙本机,但允许防火墙本机ping其他主机(ICMP类型匹配)
编写iptables规则时使用“--icmp-type ICMP类型”的形式,针对的协议为ICMP,用来检查ICMP数据包的类型。ICMP类型使用字符串或数字代码表示,如“Echo-quest”(代码为8),“Echo-Reply”(代码为0),“Destination-Unreachable”(代码为3),分别对应ICMP协议的请求,回显,目标不可达。
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
6.8 允许本机开放25,80,110,143等端口,以便提供电子邮件服务(多端口匹配)
编写iptables规则时使用“-m multiport --dport 端口列表”或“-m multiport --sport 端口列表”的形式,用来检查数据包的源端口,目标端口,多端口之间以逗号进行分隔。
[root@localhost /]#iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
6.9 允许转发源地址IP位于192.168.4.21与192.168.4.28之间的TCP数据包(IP地址范围匹配)
编写iptables规则时使用“-m iprange --src-range IP范围”,“-m -iprange --dst-range IP地址范围”的形式,用来检查数据包的源地址,目标地址,其中IP范围采用“起始地址-结束地址”的形式表示。
[root@localhost /]#iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
6.10 根据MAC地址封锁主机,禁止其访问本机的任何应用(MAC地址匹配)
编写iptables规则时使用“-m mac --mac-source MAC地址”的形式,用来检查数据包的源MAC地址。由于MAC地址本身的局限性,此类匹配条件一般只适用于内部网络。
[root@localhost /]#iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
6.11 只开放本机的80端口服务,对于发送给本机的TCP应答数据包给予放行,其他入站数据包均拒绝(状态匹配)
编写iptables规则时使用“-m state --state 连接状态”的形式,基于iptables的状态跟踪机制用来检查数据包的连接状态。常见的连接状态包括NEW(如任何连接无关的),ESTABLISHED(相应请求或者一建立连接的),RELATED(与已有连接有相关性的,如FTP数据连接)。
[root@localhost /]#iptables -A INPUT -p tcp -m multiport --dport 80 -j ACCEPT
[root@localhost /]#iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
6.12 一则完整的例子
我们假定接口ppp0通往Internet,接口eth0通往内部网络。
ppp0的IP地址是128.138.101.4,eth0的IP地址是10.1.1.1,两个接口的子网掩码都是255.255.255.0。
这个例子使用无状态包过滤机制来保护IP地址为10.1.1.2的Web服务器,这是保护Internet服务器的标准方法。
在这个例子的后面部分,我们将展示如何使用有状态的过滤机制来保护桌面用户。
在您使用iptables之前,必须启用IP forwarding(IP转发)功能,并且确保内核里已经加载了各个iptables模块。见本文5.3.1节的配置
带有iptables的所有发行版本也都有能够完成启用和加载的启动脚本。
1. 第一组规则是对filter表进行初始化。
首先,冲洗掉表中所有的链,
然后将INPUT和FORWARD链的默认目标设为DROP。
和其他任何网络防火墙一样,最安全的策略就是丢弃您没有明确允许的任何包。
# iptables -F
# iptables -P INPUT DROP // 如果是用SSH连接进行设置,不要用这条命令,会导致SSH断开;
# iptables -P FORWARD DROP
2. 规则是按照它们出现在链中的顺序来进行匹配的,所以我们将用得最多的规则放在最前面 。
FORWARD链中的前3条规则让去往10.1.1.2上网络服务的连接通过防火墙。
确切地说,我们允许SSH(端口22)、HTTP(端口80)和HTTPS(端口443)能够连到我们的Web服务器。
第一条规则允许来自可信网络的所有连接通过防火墙。
# iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 22 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 443 -j ACCEPT
3. 我们允许流到防火墙主机(10.1.1.1)的唯一TCP流量是SSH,它用于管理防火墙。
下面列出的第二条规则允许环回(loopback)流量,它留在防火墙主机的本地。
我们的系统管理员在他们不能ping到默认路由时会感到紧张,
所以这里的第三条规则允许从内部IP地址来的ICMP ECHO_REQUEST包。
# iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -i lo -d 127.0.0.1 -p ANY -j ACCEPT
# iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT
4. 为了能让任何TCP/IP主机在Internet正常工作,必须允许某些类型的ICMP包通过防火墙。
下面的8条规则就是让ICMP包既能送到防火墙主机,也能送到在它之后的网络的最小集合。
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 5 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 0 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 3 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 5 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 11 -j ACCEPT
5. 接下来向NAT表的PREROUTING链加入规则。虽然NAT表的目的并不是做包过滤,
但是它的PREROUTING链对于反IP欺骗的过滤来说特别有用。
如果我们在PREROUTING链中加入DROP项,它们就不需要出现在INPUT和FORWARD链里了,
因为PREROUTING链会应用到所有进入防火墙主机的包上。
将控制项放到一个地方比重复放置它们的做法条理性要好得多。
# iptables -t nat -A PREROUTING -i ppp0 -s 10.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 172.16.0.0/12 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 192.168.0.0/16 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 127.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 224.0.0.0/8 -j DROP
6. 最后,我们用一条禁止所有没有得到明确许可的包的规则来结束INPUT和FORWARD链。
虽然我们在前面已经用iptables -P命令实施过这个做法,但是LOG目标(target)能让我们看到谁正在从Internet上敲我们的大门。
# iptables -A INPUT -i ppp0 -j LOG
# iptables -A FORWARD -i ppp0 -j LOG
7. 我们还可以设置IP NAT来伪装在内部网络里使用的私用地址空间。
8. Netfilter带给Linux防火墙最强大的功能之一就是有状态包过滤机制。
针对连到Internet的客户机的防火墙不是允许特定的传入服务,而是允许根据客户机的请求而传入的响应。
下面这条简单的有状态FORWARD链允许离开我们网络的所有流量通过,但只允许和我们的主机发起的连接有关的入流量通过。
# iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
要跟踪复杂的网络会话,比如FTP和IRC,必须加载某些内核模块来启动iptables。
如果没有加载这些模块,iptables就会简单地禁止那些连接。虽然有状态包过滤器能够提高站点的安全性,
但是它们也增加了网络的复杂性。所以在防火墙上实现它之前,要确信您的确需要有状态功能。
7. 规则的导出、导入以及编写脚本
这些iptables规则只是临时生效的,当防火墙关闭或者服务器关机,重启之后所有的规则将会清空。因此我需要将编写好的iptables规则保存下来,以便在防火墙关闭或重新启动系统后,iptables规则还可以使用,而不需要再次编写。
iptables规则的批量备份,还原需要用到两个命令iptables-save、iptables-restore,分别用来保存和恢复。
7.1 备份保存iptables规则
iptables-save命令用来批量导出iptables防火墙规则,直接执行iptables-save时,将显示出当前启用的所有规则,按照raw、mangle、nat、filter表的顺序依次列出;若只希望显示出某一个表,应添加“-t表名”作为命令选项,然后结合重定向输入“>”将输出内容重定向到某个文件中。
列如:备份所有表的规则,操作如下:
[root@localhost /]#iptables-save > /opt/iprules_all.txt
或者
[root@localhost /]#service iptables save
后者默认将所有规则保存到“/etc/sysconfig/iptables”文件中。
7.2 恢复iptables规则
iptables-retore命令用来批量导入Linux防火墙规则,如果已经有使用iptable-save命令导出的备份文件,则恢复规则的过程也就是一瞬间的事。与iptables-save命令相对的,iptables-restore命令应结合重定向输入来指定备份文件的位置。
列如:将上所备份的规则恢复到iptables中,操作如下:
[root@localhost /]#iptables-restore < /opt/iprules_all.txt
或者
[root@localhost /]#service iptables start
后者默认将“/etc/sysconfig/iptables”文件中的内容加载到iptables中,也就是说,如果备份使用的是“service iptables save”那么恢复的时候就应该使用“service iptables start”。
7.3 使用iptables服务
开启或关闭iptables服务使用以下命令
[root@localhost /]#service iptables start //开启iptables服务
[root@localhost /]#service iptables stop //关闭iptables服务
前者开启iptables服务,默认加载“/etc/sysconfig/iptables”中的规则,后者关闭iptables服务,默认将会清空所有的iptables规则。
7.4 编写脚本的例子
在生产环境中,我很少会一条一条的去编写iptables规则,最普遍的做法就是,将其写到shell脚本,进行一次性处理。常见的防火墙脚本中,通常包括变量定义、模块加载、/proc调整、规则设置等多个部分,某些简单的防火墙脚本可能只包括规则设置部分。下面通过一个“网络型”防火墙脚本实例来了解如何编写脚本。
[root@loaclhost /]#vim /opt/myipfw.sh
#!/bin/bash
# 1.定义基本变量
INET_IF="eth0" //外网接口
INET_IP="218.29.30.31" //外网接口地址
LAN_IF="eth1" //内网接口
LAN_IP="192.168.1.1" //内网接口地址
LAN_NET="192.168.1.0/24" //内网网段
LAN_WWW_IP="192.168.1.7" //网站服务器的内部地址
IPT="/sbin/iptables" //iptables命令的路径
MOD="/sbin/modprobe" //modprode命令的路径
CTL="/sbin/sysctl" //sysctl命令的路径
# 2.加载内核模块
$MOD ip_tables //iptables基本模块
$MOD ip_conntrack //连接跟踪模块
$MOD ipt_REJECT //拒绝操作模块
$MOD ipt_LOG //日志记录模块
$MOD ipt_iprange //支持IP范围匹配
$MOD xt_tcpudp //支持tcp、udp协议
$MOD xt_state //支持状态匹配
$MOD xt_multiport //支持多端口匹配
$MOD xt_mac //支持MAC地址匹配
$MOD ip_nat_ftp //支持TFP地址转换
$MOD ip_conntrack_ftp //支持TFP连接跟踪
# 3.调整/porc参数
$CTL -w net.ipv4.ip_forward=1 //打开路由转发功能
$CTL -w net.ipv4.ip_default_ttl=128 //修改ICMP响应超时
$CTL -w net.ipv4.icmp_echo_ignore_all=1 //拒绝响应ICMP请求
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts //拒绝响应ICMP广播
$CTL -w net.ipv4.tcp_syncookies=1 //启用SYN Cookie机制
$CTL -w net.ipv4.tcp_syn_retries=3 //最大SYN请求重试次数
$CTL -w net.ipv4.tcp_synack_retries=3 //最大ACK确认重试次数
$CTL -w net.ipv4.tcp_fin_timeout=60 //TCP连接等待超时
$CTL -w net.ipv4.tcp_max_syn_backlog=3200 //SYN请求的队列长度
# 4.设置具体的防火墙规则
# 4.1删除自定义链、清空已有规则
$IPT -t filter -X //清空各表中定义的链
$IPT -t nat -X
$IPT -t mangel -X
$IPT -t raw -X
$IPT -t filter -F //清空各表中已有的规则
$IPT -t nat -F
$IPT -t mangel -F
$IPT -t raw -F
# 4.2定义默认规则
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCETP
# 4.3设置nat表中的各种策略
$IPT -t nat -A POSTROUTING -s $LAN_NAT -o $INET_IF -j SNAT --to-source $INET_IP
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
# 4.4设置filter表中的各种规则
$IPT -A INPUT -m state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp -m multiport --dport 20,21,25,80,110,143,443 -j ACCEPT
$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --dport 80 -j ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --sport 80 -j ACCEPT
8.最后
参考资料:
https://www.cnblogs.com/zllong/p/7236881.html
防火墙_http://192.168.52.14/_擒贼先擒王的博客-CSDN博客