iptables防火墙——学会利用SNAT和DNAT 共享上网并发布内网服务器
本章展示:
-- 学会利用SNAT策略共享上网 -- 学会利用DNAT策略发布内网服务器 -- 学会编写简单的防火墙脚本
3.1 SNAT
策略及应用
Linux
防火墙在很多时候承担着连接企业内、外网的重任,除了提供数据包过滤功能以
外,还提供一些基本的网关应用。本章将学习
Linux
防火墙的
SNAT
和
DNAT
策略,分别
掌握两个典型的应用:局域网共享一个公网
IP
地址接入
Internet
;向
Internet
发布位于内网
的应用服务器。本章还将学习防火墙脚本的使用。首先介绍的是
SNAT
策略及应用。
SNAT
(
Source Network Address Translation
,源地址转换)是
Linux
防火墙的一种地
址转换操作,也是
iptables
命令中的一种数据包控制类型,其作用是根据指定条件修改数据
包的源
IP
地址。
3.1.1 SNAT
策略概述
随着
Internet
网络在全世界范围内的快速发展,
IPv4
协议支持的可用
IP
地址资源逐渐
变少,资源匮乏使得许多企业难以申请更多的公网
IP
地址,或者只能承受一个或者少数几
个公网
IP
地址的费用。而与此同时,大部分企业面临着将局域网内的主机接入
Internet
的
需求。
通过在网关中应用
SNAT
策略,可以解决局域网共享上网的问题。下面以一个小型的
企业网络为例。
Linux
网关服务器通过两块网卡
ens33
、
ens38
分别连接
Internet
和局域网
正常情况下,作为网关的
Linux
服务器必须打开路由转发,才能沟通多个网络。未使用
地址转换策略时,从局域网
PC
访问
Internet
的数据包经过网关转发
后其源
IP
地址保持不变,当
Internet
中的主机收到这样的请求数据包后,响应数据包将无
法正确返回(私有地址不能在
Internet
中正常路由),从而导致访问失败
2
.开启路由转发,并设置
SNAT
转换的情况
如果在网关服务器中正确应用
SNAT
策略,数据包转发情况就不一样了。当局域网
PC
访问
Internet
的数据包到达网关服务器时,会先进行路由选择,若发现该数据包需要从外网
接口(如
ens33
)向外转发,则将其源
IP
地址(如 pc
92.168.1.234
)修改为网关的外网接
口地址(如 192.168.248.55
),然后才发送给目标主机(如 server1 58.65.238.45
)。相当于从网关服
务器的公网
IP
地址提交数据访问请求,目标主机也可以正确返回响应数据包,如图
3.3
所
示。最终实现局域网
PC
共享同一个公网
IP
地址接入
Internet
。
在上述
SNAT
转换地址的过程中,网关服务器会根据之前建立的
SNAT
映射,将响应
数据包正确返回局域网中的源主机。因此,只要连接的第一个包被
SNAT
处理了,那么这
个连接及对应数据流的其他包也会自动地被进行
SNAT
处理。另一方面,
Internet
中的服务
器并不知道局域网
PC
的实际
IP
地址,中间的转换完全由网关主机完成,一定程度上也起
到了保护内部网络的作用。
3.1.2 SNAT
策略的应用
从上一小节的介绍中,我们大致可以了解,
SNAT
的典型应用是为局域网共享上网提供
接入策略,处理数据包的切入时机是在路由选择之后(
POSTROUTING
)进行。关键操作
是将局域网外发数据包的源
IP
地址(私有地址)修改为网关服务器的外网接口
IP
地址(公
有地址)。
SNAT
策略只能用在
nat
表的
POSTROUTING
链,使用
iptables
命令编写
SNAT
策略
时,需要结合
“--to-source IP
地址
”
选项来指定修改后的源
IP
地址(如
-j SNAT --to-source
192.168.248.55)。下面通过两个实例来说明
SNAT
策略的具体用法。
1
.共享固定
IP
地址上网
案例环境如图
3.1
所示,需求描述如下。
Linux
网关服务器通过两块网卡
ens33
、
ens37
分别连接
Internet
和局域网,其中
ens33
的
IP
地址为 192.168.248.55
,
ens37
的
IP
地址为
192.168.31.144
。
所有局域网
PC
的默认网关设为
192.168.31.144
,且已经设置了正确的
DNS
服务器。
要求
192.168.1.0/24
网段的
PC
能够通过共享方式正常访问
Internet
。
根据上述环境,推荐的操作步骤如下。
(
1
)打开网关的路由转发。
对于
Linux
服务器,
IP
转发是实现路由功能的关键所在,对应为
/proc
文件系统中的
ip_forward
设置,当值为
1
时表示开启,为
0
时表示关闭。若要使用
Linux
主机作为网关设
备,必然需要开启路由转发。例如,可以修改
sysctl.conf
配置文件,永久打开路由转发功
能。
[root@oo ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@oo ~]#
在测试过程中,若只希望临时开启路由转发,也可以执行以下操作。
[root@oo ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
(
2
)正确设置
SNAT
策略。
通过分析得知,需要针对局域网
PC
访问
Internet
的数据包采取
SNAT
策略,将源地址
更改为网关的公网
IP
地址,参考以下操作在网关中设置防火墙规则。若要保持
SNAT
策略
长期有效,应将相关命令写入到
rc.local
配置文件,以便开机后自动设置。
[root@oo ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to-source 192.168.248.55
(
3
)测试
SNAT
共享接入结果。
上述操作完成以后,使用局域网中的
PC
就可以正常访问
Internet
中的网站了。对于被
访问的网站服务器来说,将会认为是网关主机 192.168.248.55
在访问(可观察
Web
日志获知),
而并不知道实际上是企业内网的
PC 192.168.1.234
在访问。
2
.共享动态
IP
地址上网
在某些情况下,网关的外网
IP
地址可能并不是固定的,如使用
ADSL
宽带接入时。那
么在这种网络环境下,应该如何设置
SNAT
策略呢?针对这种需求,
iptables
命令提供了一
个名为
MASQUERADE
(伪装)的数据包控制类型,
MASQUERADE
相当于
SNAT
的一个
特例,同样用来修改(伪装)数据包源
IP
地址,只不过它能够自动获取外网接口的
IP
地址,
而无须使用
“--to-source”
指定固定的
IP
地址。
参照上一个
SNAT
案例,若要使用
MASQUERADE
伪装策略,只需去掉
SNAT
策略中
的
“--to-source IP
地址
”
,然后改用
“-j MASQUERADE”
指定数据包控制类型。对于
ADSL
宽
带连接,连接名称通常为
ppp0
、
ppp1
等。
[root@oo ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
当然,如果网关使用固定的公网
IP
地址,最好选择
SNAT
策略而不是
MASQUERADE
策略,以减少不必要的系统开销。
3.2 DNAT
策略及应用
DNAT
(
Destination Network Address Translation
,目标地址转换)是
Linux
防火墙的
另一种地址转换操作,同样也是
iptables
命令中的一种数据包控制类型,其作用是根据指定
条件修改数据包的目标
IP
地址和目标端口。
3.2.1 DNAT
策略概述
DNAT
策略与
SNAT
非常相似,只不过应用方向相反。
SNAT
用来修改源
IP
地址,而
DNAT
用来修改目标
IP
地址和目标端口;
SNAT
只能用在
nat
表的
POSTROUTING
链,而
DNAT
只能用在
nat
表的
PREROUTING
链和
OUTPUT
链(或被其调用的链)中。
下面仍以上一节的小型企业网络为例,考虑到应用的安全和稳定性,公司将对外的网站
服务器架设在一个内部网络中,如图
3.4
所示,公司对外只有一个公网
IP
地址,又需要使
在
Internet
环境中,企业所注册的网站域名(如
www.benet.com
)必须对应合法的公
网
IP
地址(如 192.168.248.212
)。在这种情况下,
Internet
中的客户机将无法访问公司内网的
服务器,除非在网关服务器中正确设置
DNAT
策略。
使用
DNAT
策略的效果如下:当
Internet
中的客户机提交的
HTTP
请求到达企业的网
关服务器时,网关首先判断数据包的目标地址和目标端口,若发现该数据包需要访问本机的
80
端口,则将其目标
IP
地址(如 192.168.212
)修改为内网中真正的网站服务器的
IP
地
址(如
192.168.1.6
),然后才发送给内部的网站服务器,如图
3.5
所示。
在上述
DNAT
转换地址的过程,网关服务器会根据之前建立的
DNAT
映射,修改返回
的
HTTP
应答数据包的源
IP
地址,最后再返回给
Internet
中的客户机。
Internet
中的客户
机并不知道企业网站服务器的真实局域网地址,中间的转换完全由网关主机完成。通过设置
恰当的
DNAT
策略,企业内部的服务器就可以面向
Internet
提供服务了。
3.2.2 DNAT
策略的应用
从上一小节的介绍中,我们大致可以了解
DNAT
的典型应用是在
Internet
中发布企业内
部的服务器,处理数据包的切入时机是在路由选择之前(
PREROUTING
)进行。关键操作
是将访问网关外网接口
IP
地址(公有地址)的数据包的目标地址修改为实际提供服务的内
部服务器的
IP
地址(私有地址)。
使用
iptables
命令设置
DNAT
策略时,需要结合
“--to-destination IP
地址
”
选项来指定内
部服务器的
IP
地址(如
-j DNAT --to-destination 218.29.30.31
)。下面将通过两个实例来说
明
DNAT
策略的用法。
1
.发布企业内部的
Web
服务器
案例环境如图
3.4
所示,需求描述如下。
公司注册的网站域名为
www.benet.com
,
IP
地址为 192.168.248.212
(网卡
ens37
)
公司的网站服务器位于局域网内,
IP
地址为
192.168.1.6
。
要求能够从
Internet
中通过访问
www.benet.com
来查看公司的网站内容。
根据上述环境,推荐的操作步骤如下。
(
1
)打开网关的路由转发。
[root@oo ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@oo ~]#
(
2
)正确设置
DNAT
策略。
通过分析得知,需要针对
Internet
中的任意主机访问网关
80
端口的数据包,将目标地
址修改为位于内网的网站服务器的
IP
地址,网关的防火墙参考规则如下所示
[root@oo ~]# iptables -t nat -A PREROUTING -i ens37 -d 192.168.248.212 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
[root@oo ~]#
(
3
)测试
DNAT
发布结果。
在网站服务器
192.168.1.6
中正确配置、启动
Web 服务,并提供测试网页。然后通过
Internet
中的客户机访问网站 http://www.benet.com
(如果没有做
DNS
解析,也可以直接访问
http://218.29.30.31 或者直接通过绑 host
方式实现),在浏览器中看到的将会是实际由网站服务器
192.168.1.6 提供的页面内容
2
.发布企业内部的
OpenSSH
服务器
大多数情况下,
DNAT
策略只是用来修改数据包的目标
IP
地址,但在需要时也可以修
改目标端口号。例如,在图
3.4
所示的案例结构中,为了方便服务器的远程管理,网关、网
第
9
页共
18
页
站服务器都配置了
OpenSSH
服务,分别授权给不同的用户从
Internet
远程登录。
在这种情况下,需要通过同一个公网
IP
地址 192.168.248.212
发布位于多台主机中的同一
种服务,为了避免发生冲突,就必须从端口上进行区分。案例环境如图
3.4
所示,需求描述
如下。
网关的公网
IP
地址为 192.168.248.212
,在
2345
端口启用
OpenSSH
服务。
网站服务器位于局域网内,
IP
地址为
192.168.1.6
,在
22
端口启用
OpenSSH
服务。
要求能够从
Internet
中远程管理网关服务器和网站服务器,访问
218.29.30.31
的
2345
端口时对应网关服务器,而访问 192.168.248.212
的
2346
端口时对应网站服务器。
上述需求中,通过公网
IP
地址 192.168.248.212
的
2345
、
2346
端口分别提供服务,均未
使用默认的
22
端口,安全性要更好一些。推荐的操作步骤如下。
(
1
)配置
OpenSSH
服务。
在网关、网站服务器中均开启
OpenSSH
服务,分别使用
2345
、
22
端口。其中网关的
sshd
服务因直接面向
Internet
,因此不使用默认端口。
(
2
)打开网关的路由转发。
[root@oo ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@oo ~]#
(
3
)正确设置
DNAT
策略。
通过分析得知,网关本机的
sshd
服务直接面向
Internet
,因此不需要地址转换,但网
站服务器位于内网,必须通过
DNAT
策略进行发布。在网关中设置防火墙规则,修改访问
外网
IP
地址
2346
端口的数据包,将目标地址改为
192.168.1.6
,将目标端口改为
22
,以
便转发给网站服务器。
[root@oo ~]# iptables -t nat -A PREROUTING -i ens37 -d 192.168.248.212 -p tcp --dport 2346 -j DNAT --to-destination 192.168.248.1:22
(
4
)测试
DNAT
发布结果。
前述步骤完成以后,可以在
Internet
中进行
SSH
登录测试。例如,可以使用
Linux
客
户机,通过
ssh
命令分别访问192.168.248.
的
2345
、
2346
端口,观察登录情况。
[12@oo ~]$ /sbin/ifconfig ens33 | grep inet
inet 192.168.248.55 netmask 255.255.255.0 broadcast 192.168.248.255
inet6 fe80::1b9c:e10:9b0e:bd67 prefixlen 64 scopeid 0x20
其中,
tsengyia
是网关服务器中的用户账号,
kylind
是网站服务器中的用户账号。
3.3
规则的导出、导入
在
Linux
系统中,
iptables
为我们提供了批量备份与恢复规则的命令,也提供了标准的
系统服务以便开启、关闭防火墙功能。
3.3.1
规则的备份及还原
防火墙规则的批量备份、还原用到两个命令,即
iptables-save
和
iptables-restore
,分
别用来保存(
Save
)和恢复(
Restore
)。
1
.
iptables-save
命令
iptables-save
命令用来批量导出
Linux
防火墙规则。直接执行
iptables-save
命令时,
将显示出当前启用的所有规则。
[root@ll ~]# iptables-save
# Generated by iptables-save v1.4.21 on Fri Dec 29 11:00:54 2023
*mangle
:PREROUTING ACCEPT [3174:3234919]
:INPUT ACCEPT [3174:3234919]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2410:326742]
:POSTROUTING ACCEPT [2452:331332]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Fri Dec 29 11:00:54 2023
# Generated by iptables-save v1.4.21 on Fri Dec 29 11:00:54 2023
*nat
:PREROUTING ACCEPT [30:2716]
:INPUT ACCEPT [30:2716]
:OUTPUT ACCEPT [190:14069]
:POSTROUTING ACCEPT [190:14069]
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
COMMIT
# Completed on Fri Dec 29 11:00:54 2023
# Generated by iptables-save v1.4.21 on Fri Dec 29 11:00:54 2023
*filter
:INPUT ACCEPT [3176:3235096]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2413:327711]
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
COMMIT
# Completed on Fri Dec 29 11:00:54 2023
[root@ll ~]#
在
iptables-save
命令的输出信息中,以
“#”
号开头的内容表示注释,
“*
表名
”
表示所在的
表,
“:
链名 默认策略
”
表示相应的链及默认策略,具体的规则部分省略了命令名
“iptables”
,
后面的
“COMMIT”
表示提交前面的规则设置。
由于
iptables-save
命令只是把规则内容输出到屏幕上,因此当需要保存为固定的文件
时,还应该结合重定向输出的操作以完成备份。例如,若要将当前已设置的所有防火墙规则
备份为
/opt/iprules_all.txt
文件,可以执行以下操作。
[root@ll ~]# iptables-save > /opt/iprules_all.txt //备份所有表的规则
2
.
iptables-restore
命令
iptables-retore
命令用来批量导入
Linux
防火墙规则,如果已经使用
iptables-save
命令
导出的备份文件,则恢复规则的过程在一瞬间就能完成。与
iptables-save
命令相对的
iptables-restore
命令应结合重定向输入来指定备份文件的位置。
[root@ll ~]# iptables-save < /opt/iprules_all.txt
3.3.2
使用
iptables
服务
通过名为
iptables
的系统服务,可以快速启用、清空防火墙规则。
iptables
服务使用的
规则文件位于
/etc/sysconfig/iptables
文件中,配置格式与
iptables-save
命令输出的一致。
1
.自动启用防火墙规则
在服务器中调试好各种
iptables
规则以后,使用
iptables-save
备份为默认的规则配置
文件
/etc/sysconfig/iptables
,然后就可以通过
iptables
服务来调用。例如,执行以下操作将
保存当前的防火墙规则,并设置在每次开机后根据已保存的规则内容自动进行重建。
[root@ll ~]# iptables-save > /etc/sysconfig/uptables
[root@oo ~]# systemctl enable iptables
[root@oo ~]# systemctl list-unit-files | grep iptables
iptables.service enabled
[root@oo ~]#
当需要启用
/etc/sysconfig/iptables
文件中的规则设置时,只需要启动
iptables
服务即可。
[root@oo ~]# systemctl start iptables
[root@oo ~]# service iptables start
Redirecting to /bin/systemctl start iptables.service
[root@oo ~]#
2
.清空所有防火墙规则
在调试各种防火墙规则的过程中,为了排除其他规则的干扰,有时候需要清空某些表的
规则。当需要一次清空所有表的规则时,停用
iptables
服务是最快捷的方法,也是最彻底的
方法。
[root@oo ~]# systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
Active: inactive (dead) since 五 2023-12-29 11:14:11 CST; 12s ago
Process: 10637 ExecStop=/usr/libexec/iptables/iptables.init stop (code=exited, status=0/SUCCESS)
Main PID: 6629 (code=exited, status=0/SUCCESS)
12月 29 08:57:21 oo systemd[1]: Starting IPv4 firewall with iptables...
12月 29 08:57:21 oo iptables.init[6629]: iptables: Applying firewall rules: [ 确定 ]
12月 29 08:57:21 oo systemd[1]: Started IPv4 firewall with iptables.
12月 29 11:14:11 oo systemd[1]: Stopping IPv4 firewall with iptables...
12月 29 11:14:11 oo iptables.init[10637]: iptables: Setting chains to policy ACCEPT:… ]
12月 29 11:14:11 oo iptables.init[10637]: iptables: Flushing firewall rules: [ 确定 ]
12月 29 11:14:11 oo iptables.init[10637]: iptables: Unloading modules: [ 确定 ]
12月 29 11:14:11 oo systemd[1]: Stopped IPv4 firewall with iptables.
Hint: Some lines were ellipsized, use -l to show in full.
[root@oo ~]#
3.4
使用防火墙脚本
本节将介绍防火墙脚本的应用,防火墙脚本实际上是一个
Shell
脚本程序。
3.4.1
防火墙脚本的构成
防火墙脚本的优势是便于使用
Shell
变量、程序控制逻辑,另外其作为独立的文件在需
要重用、移植使用时会非常方便,这也是作为
Shell
脚本的强大之处。
常见的
Linux
防火墙脚本中,通常包括变量定义、模块加载、
/proc
调整、规则设置等
多个部分(过于简化的脚本可能仅包括规则设置部分),下面分别进行介绍。
1
.定义基本变量
将防火墙的网卡、
IP
地址、局域网段、
iptables
命令的路径等定义为变量,便于对脚本
程序的维护和移植使用,特别是当规则较多的时候。一旦网络环境发生变化(如公网
IP
地
址变更),只需对变量值稍做修改就可以投入使用了。
[root@oo ~]# vim op.sh
INET_IF= "ens33" //外网接口
INET_IP="192.168.248.55" //外网接口地址
LAN_IF="ens38" //内网接口
LAN_IP= "192.168.31.144" //内网接口地址
LAN_NET="192.168.31.0/24" //内网网段
LAN_WWW_IP="192.168.1.6" //网站服务器的内部地址
IPT="/sbin/iptables" //iptables 命令的路径
MOD="/sbin/modprobe" //modprobe 命令的路径
CTL="/sbin/sysctl" //sysctl 命令的路径
设置好相关的变量以后,在后续的脚本内容中就可以直接引用了。为了提高脚本代码的
可读性,除了添加必要的注释之外,变量名称最好使用有一定含义的字符串。
第
14
页共
18
页
2
.加载内核模块
在
CentOS 7.3
系统中,
iptables
命令的大部分模块都可以根据需要动态载入内核,只
有个别模块需要手动进行加载(如与
FTP
发布相关的
ip_nat_ftp
、
ip_conntrack_ftp
)。但如
果需要启用的规则数量较多,为了提高规则设置的效率,保持防火墙的稳定性,建议将用到
的各种模块提前加载到内核中。
$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 //支持 FTP 地址转换
$MOD ip_conntrack_ftp //支持 FTP 连接跟踪
3
.调整
/proc
参数
/proc
是
Linux
或
UNIX
系统中的一种伪文件系统机制,提供了访问内核运行结构、改
变内核设置的实时数据。与
EXT3
、
FAT32
等本地文件系统不同,
/proc
中的数据存放在内
存中而不是硬盘上。
在文件夹
/proc/sys
下存放着与系统相关的一些可控参数,可以直接用来改变内核的行
为,通常作为
Linux
内核调优的实时入口。其中包括是否打开
IP
转发、是否响应
ICMP
广
播、设置好
TCP
响应超时等,使用
echo
、
sysctl
命令都可以修改相关参数,当然也可以写
到
/etc/sysctl.conf
文件(执行
sysctl -p
后生效)。
下面仅列出常用的几个
/proc
参数调整,更多细节、调优操作此处不做过多介绍,有兴
趣的同学请参阅其他资料。
$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 请求的队列长度
上述脚本内容中,
ICMP
相关的参数调整可使本机忽略其他主机的
ping
测试,
TCP
相
关的内核参数调整可适当提高本机抵抗
DoS
攻击的能力。
4
.设置具体的
iptables
规则
在脚本文件中,建议按照不同的表、链来分块组织各种防火墙规则,具体内容应根据用
户的实际需求决定。
(
1
)清理已有的规则。
为了避免已有的防火墙规则造成干扰,通常会预先安排一个
“
清理
”
操作,删除所有表中
用户自定义的链,清空所有链内的规则。
$IPT -t filter –X //删除各表中自定义的链
$IPT -t nat -X
$IPT -t mangle -X
$IPT -t raw -X
$IPT -t filter –F //清空各表中已有的规则
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t raw -F
(
2
)设置规则链的默认策略。
在实际生产环境中,防火墙过滤规则建议采取
“
默认拒绝
”
的策略,可以获得更好的安全
性。这就要求我们充分熟悉相关应用服务、网络协议,才能够识别合法数据包,制定出既防
护严格又行之有效的防火墙方案。
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
学习过程中建议采用
“
默认允许
”
的策略,将默认策略中的
DROP
改为
ACCEPT,
以免
在使用不完整的防火墙脚本时引起网络故障。
(
3
)设置
nat
表中的各种规则。
iptables
的
nat
表主要用在
Linux
网关服务器中,一般的主机型防火墙方案很少会用到
nat
表。根据实际情况编写相应的
SNAT
、
DNAT
规则(如局域网共享上网、发布内部
Web
服务器),如果没有则跳过此部分。
$IPT -t nat -A POSTROUTING -s $LAN_NET -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-dest
ination $LAN_WWW_IP
iptables
的
filter
表主要用来过滤数据包,无论是
Linux
网关还是一般的
Linux
服务器都
可能用到。主机型的防火墙主要使用
INPUT
、
OUTPUT
链,而对于网络型的防火墙主要使
用
FORWARD
链。
以
Linux
网关为例,在
“
默认拒绝
”
的前提下,若要实现共享上网,除了正常的
SNAT
策
略以外,还需要放行内网
PC
与
Internet
中
DNS
、
Web
、
FTP
等服务的通信
$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 --dport 80 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 20:21 -j ACCEPT
$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state --state ESTABLISHED, RELATED
-j ACCEPT
需要说明的是,在实际应用过程中,不要过于生硬地照搬他人脚本内容,应根据实际情
况进行有针对性的设计,并做好整体测试,避免因规则不当而导致网络通信故障。
脚本文件编写完成以后,为其添加
“x”
可执行权限,就可以用来批量设置防火墙规则了。
若要使脚本文件在每次开机后自动运行,可以将脚本路径写入
/etc/rc.local
文件中。
[root@oo ~]# chmod +x op.sh
[root@oo ~]# ./op.sh
[root@oo ~]# iptables -n -L FORWARD
3.4.2
防火墙脚本示例
熟悉了防火墙脚本的基本构成之后,下面将展示一个简单的防火墙脚本文件
——“
主机
型
”
防火墙脚本,主要针对具体的规则设置部分,内容仅供参考。
对于大多数的应用服务器,防火墙只需针对本机进行防护,因此
filter
表中的
INPUT
、
OUTPUT
链用得最多,特别是前者。例如,可将
OUTPUT
链的默认策略设为允许,不添加
其他规则;将
INPUT
链的默认策略设为拒绝,只放行对个别服务(如
Web
)的访问,以及
响应本机访问请求的数据包
[root@oo ~]# vi /opt/myipfw.hostonly
#!/bin/bash
# 1. 定义基本变量
IPT="/sbin/iptables" CTL="/sbin/sysctl" # 2. 调整/proc 参数
$CTL -w net.ipv4.tcp_syncookies=1
$CTL -w net.ipv4.tcp_syn_retries=3
$CTL -w net.ipv4.tcp_synack_retries=3
$CTL -w net.ipv4.tcp_fin_timeout=60
$CTL -w net.ipv4.tcp_max_syn_backlog=3200
# 3. 设置具体的防火墙规则
# 3.1 删除自定义链、清空已有规则
$IPT -t filter -X
$IPT -t nat -X
$IPT -t mangle -X
$IPT -t raw -X
$IPT -t filter -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t raw -F
# 3.2 定义默认策略
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
# 3.3 设置 filter 表中的各种规则
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
以上防火墙脚本示例中,仅列出其中最基础的一些规则。更多具体的规则设置取决于实
际的应用需求,还有待大家在实际工作中慢慢去体会,逐渐融会贯通。