Linux 网络安全

网络传输流程

当一个安全配置的服务器要接收外来数据时,可以分为以下阶段:

  • 防火墙的分析

    Linux 系统内建防火墙机制,因此首先连接要通过防火墙。

  • 服务的基本功能

    在应用层面来看,某些软件带有控制访问功能。例如 httpd.conf 配置文件内可以规定某些 IP 来源不能使用 httpd 这个服务来取得主机的数据。

  • SELinux 对网络服务的权限控制

    为了避免前一个步骤的权限误用,或者是程序有问题所造成的安全问题,SELinux 可以针对网络服务的权限设置一些规则,让程序能够拥有的功能有限。这样即使 httpd 真的被攻击取得 root 的使用权,所能操作的范围也被控制在 /var/www/html 里面,无法对系统造成进一步威胁。

  • 使用主机的文件系统资源

    主要是文件系统的权限设置,如果文件权限错误,用户依然可能无法获得网页数据。

常见攻击手段

下面介绍一些常见的网络攻击手法。完善防火墙规则、定期自动更新软件和定时检查日志是应对网络攻击的基本工作。同时要时刻保持警惕,及时采取措施来保护系统和数据的安全。

暴力破解密码

假如有人知道了你的主机地址,可以利用端口扫描工具(如 NMAP)来扫描主机,得出主机上运行的服务,例如邮箱服务。接下来使用脚本来尝试常用管理员账号(如 admin)的密码,通过密码字典就能破解一些简单密码,获取管理权限。

不过现在很多软件都有密码输入次数限制,连续输入错误到一定次数会限制攻击者的访问。此时攻击者可以使用代理池来更换 IP 地址继续破解,不过这样会耗时耗力,因此现在比较少见了。

对于这种攻击,设置一个不易破解的密码是最重要的。其次可以制定密码修改策略,提高密码破解的难度。

本地提权

如果已经拥有本机账号,在登录以后可以设法提升权限。例如利用下面这些具有 SUID 的二进制文件:

[root@server2 ~]$ find / -perm 4775 -uid 0

目前系统已经很少有能如此利用二进制文件了。

缓冲区溢出攻击

入侵程序的目的是取得 root 执行权,或是通过 root 所执行的程序指向自己。缓冲区溢出攻击的目的在于干扰具有某些特权运行的程序功能,使得攻击者取得程序控制权。如果程序由 root 所执行,那么整个主机就有可能被控制。

从程序角度看,是在寻求改变程序的执行流程,使之跳转到攻击代码,例如溢出一个没有边界检查的缓冲区。

主要防范方法是编写程序时注意安全检查。

利用程序漏洞主动攻击

程序 Bug 可能造成安全问题,导致系统权限被攻击者掌握。由于程序问题被公开后,网上会出现针对漏洞的攻击程序代码,很容易被别有用心的人拿来使用,因此这类攻击比较常见。

针对解决方法也很简单:保持系统更新,关闭掉不需要的软件和服务即可。

利用社会工程学欺骗

社会工程学欺骗方式很多,有些甚至完全不需要懂电脑技术,例如通过邮件和仿制网站钓鱼,来骗取用户账号密码。

只要记住不要随便透露账号密码信息,多留意下网站网址或交流对象身份即可。

利用程序功能的被动攻击

在一些利用浏览器漏洞的网站上,只是打开页面就能运行网站上插入的恶意代码,进而使主机遭受攻击。

作为应对,记得更新浏览器和设置好不要自动下载运行文件。

蠕虫和木马的 Rootkit

蠕虫会让主机一直发送数据包向外攻击。木马则是在主机中开启一个后门(端口),来进一步控制主机。

Rootkit 是指可以获取 root 权限的一组工具,主要也是通过主机的程序漏洞进行攻击。很多 Rootkit 本身就是蠕虫或木马,主要通过下载安装带有 Rootkit 的软件来传播,一旦被绑架非常难以追踪与清除。

作为防范最重要的一点是不要下载安装来路不明的程序,另外可以安装防范扫描 Rootkit 的软件,确保安全。

DDoS 攻击

DDoS(Distributed Denial of Service)叫分布式拒绝服务,是通过分散在世界各地的僵尸计算机进行高频率的请求,从而使正常请求无法处理的攻击方式。

最常见的是 SYN Flood 攻击,发送带有 SYN 的 TCP 数据包请求连接,但将服务器的回复确认数据包丢弃,造成服务器一直处于等待状态。一旦此类数据包过多,服务器的端口被占满,就无法继续提供服务。

现在的云服务提供商和 CDN 服务提供商都具有一定的抵御 DDoS 攻击能力,会自动阻断异常请求和流量,因此可以根据需要进行购买。

IPv4 内核管理功能

/proc/sys/net/ipv4/ 目录中还有许多内核网络功能的设置,可以通过将其值设置为 1 来启用。如果希望在开机时自动启用这些设置,可以将其写入 /etc/sysctl.conf 文件,并运行 sysctl -p 命令。

tcp_syncookies

SYN Cookie 模块用于抵御 DoS 攻击,在系统使用的端口(1024~65535)即将耗尽时会自动启用。

启用 SYN Cookie 后,在主机发送 SYN/ACK 确认数据包之前,会要求客户端在短时间内回复一个序列号。这个序列号包含了原始 SYN 数据包中的许多信息,包括 IP 和端口等。如果客户端能够正确回复序列号,主机会确认该数据包是可信的,并发送 SYN/ACK 数据包。否则,数据包将被丢弃。

由于 SYN Cookie 的设置违反了 TCP 的三次握手规定,所以可能会导致某些服务的延迟问题,例如 SMTP。因此,它不适用于负载已经很高的服务器,因为在负载过高的主机上,内核有时会错误地判断遭受 SYN Flood 攻击。

icmp_echo_ignore

使用大量的大尺寸 Ping 包发送到服务器可能会导致服务器带宽满载或无响应,这种攻击方式被称为 Ping Flooding 和 Ping of Death。

可以通过防火墙取消对 ICMP 类型 8 的 ICMP 数据包的回应,也可以调整内核参数来取消 ICMP 回应。有两个设置文件可供使用:icmp_echo_ignore_all(拒绝所有 Ping 回应)和 icmp_echo_ignore_broadcasts(仅在收到 Ping 广播地址时取消 Ping 回应)。

conf/*/

在网口配置目录下有一些参数设置:

  • rp_filter:称为逆向路径过滤(Reverse Path Filtering),可以通过分析网口的路由信息,结合数据包的源地址来分析数据包是否合理。
  • log_martians:启用记录不合法的 IP 来源功能,例如来自 127.0.0.0 或 192.168.0.0 的 IP 不应应用于互联网。记录将写入 /var/log/messages 日志文件中。
  • accept_source_route:允许源路由。一般不设置。
  • accept_redirects:允许实体网络内不同 IP 网段之间的信息不通过路由器传递。不建议开启。
  • send_redirects:类似于上一个设置,该值用于发送 ICMP redirect 数据包。不建议开启。

访问控制列表

访问控制列表(TCP Wrappers)通过服务器程序的外挂(tcpd)进行处理。该机制主要用于管理服务器程序。系统会检查 /etc/hosts.allow/etc/hosts.deny 的配置,以过滤特定的 IP 和端口。

并非所有软件都可以通过配置文件进行管理,只有由 Super Daemon(Xinetd)管理的服务和支持 Libwrap.so 模块的服务才能使用访问控制列表。

对于 allowdeny 文件的优先规则如下:

  • 首先与 /etc/hosts.allow 进行匹配,符合规则的允许访问。
  • 其次与 /etc/hosts.deny 进行匹配,符合规则的阻止访问。
  • 如果不匹配这两个文件,则允许访问。

例如,如果要定义允许局域网 192.168.1.0/24 和 10.1.1.2 使用 rsync,而不允许其他来源使用 rsync。修改配置文件:

[root@server1 ~]$ vi /etc/hosts.allow
ALL: 127.0.0.1
rsync: 192.168.1.0/255.255.255.0 10.1.1.2
[root@server1 ~]$ vi /etc/hosts.deny 
rsync: ALL

防火墙

防火墙是一种通过定义一系列有序规则,并管理进入网络内的主机数据包的机制。只要能够分析与过滤进出管理的网络数据包的数据,就可以称为防火墙。防火墙最大的功能是限制某些服务的访问来源。

网络数据包一般包含四个基本信息,即源 IP、目标 IP、源端口和目标端口。防火墙即对数据包报头进行分析,根据设定的规则来对数据包进行放行或丢弃。防火墙在 OSI 七层协议中具体作用如下:

  • 第二层:可以针对来源与目标的 MAC 进行阻挡。
  • 第三层:主要针对来源与目标的 IP,以及 ICMP 的类别进行阻挡。
  • 第四层:针对 TCP/UDP 的端口进行阻挡,也可以针对 TCP 的状态来处理。

防火墙可以分为硬件防火墙和软件防火墙两种。硬件防火墙是由厂商设计的主机硬件,其操作系统主要以提供数据包数据的过滤机制为主,并将其他不必要的功能剔除。而软件防火墙本身就是一套保护系统网络安全的软件。

数据包过滤防火墙

所谓数据包过滤(IP Filtering 或 Net Filter),就是分析进入主机的网络数据包,将包头数据提取出来进行分析,以决定该连接是放行还是阻止的机制。数据包过滤防火墙简单地说就是 iptables 或 firewall 提供的防火墙功能,它主要分析 OSI 的第 2 到 4 层,控制 MAC、IP、ICMP、TCP 和 UDP 的端口与状态(SYN、ACK 等)。

防火墙由 Linux 内核处理,因此性能非常好。根据内核版本的不同,所用的防火墙软件也不同:

  • 版本 2.0:使用 ipfwadm 防火墙
  • 版本 2.2:使用 ipchains 防火墙
  • 版本 2.4 或 2.6:使用 iptables 防火墙

在这里主要以 iptables 为主。

规则顺序

防火墙规则有顺序关系,数据包会按照规则定义的顺序一条条进行对比。如果匹配到一条规则,就会执行后面定义的动作,并忽略之后的规则。如果没有匹配的规则,则使用默认策略来决定数据包的去向。

表与链

防火墙中可以定义多个表格(Table),每个表格都定义了自己的默认策略和规则链(Chain),以用于不同的目的。默认情况下,有三个功能的表格:管理本机进出的 Filter、管理后端主机(防火墙内部机器)的 NAT、管理特殊标志使用的 Mangle。

  • Filter(过滤器)

    主要与进入 Linux 本机的数据包有关,是默认的 table。

    • INPUT:与本机接收的数据包有关。
    • OUTPUT:与本机发送的数据包有关。
    • FORWARD:与本机无关,可以转发数据包到后端主机,与 NAT 的 table 相关性较高。
  • NAT(地址转换)

    NAT 是 Network Address Translation 的缩写,主要用于进行源地址和目标地址以及端口的转换。

    • PREROUTING:在进行路由判断之前要执行的规则(DNAT/REDIRECT)。
    • POSTROUTING:在进行路由判断之后要执行的规则(SNAT/MASQUERADE)。
    • INPUT:与接收的数据包有关。
    • OUTPUT:与发送的数据包有关。
  • Mangle(破坏者)

    与特殊数据包的路由标志有关,用于重组数据包,使用较少。

各表格之间的关系如下图所示:

链与表的相关性

从上图可以看出,iptables 可以控制三种数据包流向:

  • 路径 A:数据包进入 Linux 主机并使用资源。在路由判断后确定是向 Linux 主机请求的数据包,主机通过 Filter 的 INPUT 链来进行控制。
  • 路径 B:数据包通过 Linux 主机进行转发,不使用主机资源,目标是后端主机。在路由判断之前对数据包报头进行修订后,发现数据包目标地址是防火墙后端主机,数据包通过路径 B 移动。主要经过的链是 Filter 的 FORWARD 和 NAT 的 POSTROUTING、PREROUTING。
  • 路径 C:数据包由 Linux 本机发出,可能是响应客户端请求或主动发送的数据包。在路由判断后确定输出路径,然后通过 Filter 的 OUTPUT 链传送,最后经过 NAT 的 POSTROUTING 链。

规则查询

防火墙查询和设置都使用 iptables 命令,命令格式为:iptables [-t tables] [-L] [-nv]。与规则查询相关的选项如下:

选项 说明
-t 后面接 tables,例如 nat 或 filter。不带此参数默认查询 filter。
-L 列出当前表格的规则。
-n 不解析 IP 对应的主机名。
-v 列出详细信息,包括数据包传输状态和相关网口等。

例如,查询 nat table 中的 4 条链的规则:

[root@server1 ~]$ iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination  

其中,policy 表示默认策略,其他项目的解释如下:

  • target:代表执行的操作,ACCEPT 允许,REJECT 拒绝,DROP 丢弃。
  • prot:代表使用的数据包协议,TCP、UDP、ICMP。
  • opt:额外的选项说明。
  • source:规则匹配的来源 IP。
  • destination:规则匹配的目标 IP。

可以使用 iptables-save 命令来查询完整的规则:

[root@server1 ~]$ iptables-save -t filter
# Generated by iptables-save v1.4.21 on Fri Oct  8 23:48:44 2021
*filter
:INPUT ACCEPT [2470:186319]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1687:123767]
COMMIT
# Completed on Fri Oct  8 23:48:44 2021

其中,以星号 * 开头的是表格,以冒号 : 开头的是链。

清空规则

清除规则使用的命令格式:iptables [-t table] [-FXZ]

选项说明:

选项 说明
-F 清除所有已定义的规则。
-X 清除所有用户自定义的表格。
-Z 将所有链的计数和流量统计归零。

例如,清除所有 filter 表格的规则,但不改变默认策略:

[root@server1 ~]$ iptables -F;iptables -X;iptables -Z

定义默认策略

定义默认策略(Policy)使用命令:iptables [-t table] -P [INPUT, OUTPUT, FORWARD] [ACCEPT, DROP]

例如,将本机的 INPUT 设置为 DROP,其他设置为 ACCEPT:

[root@server1 ~]$ iptables -P INPUT DROP
[root@server1 ~]$ iptables -P OUTPUT ACCEPT
[root@server1 ~]$ iptables -P FORWARD ACCEPT
[root@server1 ~]$ iptables-save

自定义规则

使用 iptables 自定义规则的语法如下:

iptables [-AI 链名] [-io 网口] [-p 协议] [-s 源地址] [--sport 端口范围] [-d 目标地址] [--dport 端口范围] -j [ACCEPT|DROP|REJECT|LOG]

选项说明:

选项 说明
-A 在链的最后新增一条规则。
-I 插入一条规则,默认在链最前面插入。
-i 数据包接收的网口,例如 eth0。需要与 INPUT 链配合。
-o 数据包发送的网口,需要与 OUTPUT 链配合。
-p 设置规则适用的数据包格式,例如 tcp、udp、icmp、all。
-s 来源 IP/网络,可以指定具体 IP 或网段。
-d 目标 IP/网络,例如 192.168.1.104 或 192.168.1.0/24。
–sport 限制来源端口号码,可以设置连续端口,例如 1055:1100。
–dport 限制目标端口号码,针对端口操作需要与 -p 参数配合才能成功。
-j 后面接针对数据包的操作。

例如,将 lo 口设置为受信任设备,不管数据包来源与目标,只要来自 lo 口都予以接受:

[root@server1 ~]$ iptables -A INPUT -i lo -j ACCEPT
[root@server1 ~]$ iptables -L -nv
Chain INPUT (policy ACCEPT 86 packets, 7740 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   12   702 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0  

上面命令没有指定 -s-d 参数,则默认代表该项目完全接受。

设置接受来源 192.168.2.234 的包,拒绝 192.168.2.230 的包:

[root@server2 ~]$ iptables -A INPUT -i ens33 -s 192.168.2.234 -j ACCEPT
[root@server2 ~]$ iptables -A INPUT -i ens33 -s 192.168.2.230 -j DROP
[root@server2 ~]$ iptables-save 
# Generated by iptables-save v1.4.21 on Sat Oct  9 00:58:26 2021
*filter
:INPUT ACCEPT [74:6754]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [33:3160]
-A INPUT -s 192.168.2.234/32 -i ens33 -j ACCEPT
-A INPUT -s 192.168.2.230/32 -i ens33 -j DROP
COMMIT
# Completed on Sat Oct  9 00:58:26 2021

设置屏蔽本机端口 2021:

[root@server2 ~]$ iptables -A INPUT -i ens33 -p tcp --dport 2021 -j DROP

屏蔽 10000~20000 端口带 SYN 标记的 TCP 数据包:

[root@server2 ~]$ iptables -A INPUT -i ens33 -p tcp --sport 10000:20000 --dport 10000:20000 --syn -j DROP

删除规则

删除规则使用命令:iptables [-t table] -D [chain] line-numbers

首先需要获取规则在表链中的序号:

[root@server2 ~]$ iptables -L -t nat --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source            destination         
1    REDIRECT   tcp  --  10.1.1.0/24       anywhere     tcp dpt:http redir ports 3128

然后用行号删除指定规则:

[root@server2 ~]$ iptables -t nat -D PREROUTING 1

外挂模块

在早期版本的防火墙中,需要分别在 INPUT 和 OUTPUT 链中添加规则才能实现双向通信,这样规则会变得相当冗长。现在的 iptables 可以通过一个状态模块来分析数据包是否为响应包,如果是,则直接放行。这样就不用考虑向 INPUT 链添加对应规则了。

加载模块使用 -m 参数,常用的有 macstate 模块。指定 -m state 模块后可以使用 --state 接收数据包状态:

状态 说明
INVALID 无效数据包,例如数据破损的数据包状态。
ESTABLISHED 已经连接成功的连接状态。
NEW 想要新建立连接的数据包状态。
RELATED 表示数据包与发送出去的数据包有关。

例如设置只要已建立连接或已发出请求相关的数据包就予以通过:

[root@server2 ~]$ iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

针对局域网内网卡 MAC 地址进行限制:

[root@server2 ~]$ iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT 

NAT 服务器

网络地址转换是通过 iptables 修改 IP 数据包报头数据中来源或目标 IP 地址和端口。在 NAT 表中,POSTROUTING 链用于修改源 IP,PREROUTING 链用于修改目标 IP。

NAT 有两种,来源 NAT(SNAT,Source NAT)针对局域网访问互联网,目标 NAT(DNAT,Destination NAT)针对局域网内服务器服务互联网。

SNAT

当内网主机通过 NAT 服务器发送互联网请求包时,POSTROUTING 链将数据包报头来源的内网 IP 替换成 NAT 服务器的外网 IP,记录数据包序号和转换的 IP 地址信息后,将数据包发送出去。

当数据包返回通过 NAT 服务器时,iptables 会分析数据包的序号。如发现序号有记录,PREROUTING 链会将目标 IP 替换成对应的内网 IP,并转发给对应主机。

例如将内部 10.1.1.0/24 网段的 IP 伪装成外网口 ens37 的 IP:

[root@server2 iptables]$ iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -o ens37 -j MASQUERADE

也可以指定多个对外 IP 轮流使用:

[root@server2 iptables]$ iptables -t nat -A POSTROUTING -o ens37 -j SNAT --to-source 192.168.2.230-192.168.2.240

DNAT

当内网中有提供 HTTP 服务的服务器时,必须通过 NAT 服务器映射端口,也就是将自身 80 端口与 NAT 服务器 80 端口绑定。NAT 服务器接收到客户端发送的 HTTP 请求数据包后,PREROUTING 链会将目标 IP 替换成内网 HTTP 服务器 IP 并发送给它。

当内网 HTTP 服务器回应数据包通过 NAT 服务器时,通过 POSTROUTING 链将源 IP 替换成 NAT 服务器外网 IP,并发送出去。

例如将内网 HTTP 服务器 10.1.1.2 的端口指向外网端口 ens33

[root@server2 ~]$ iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to-destination 10.1.1.2:80

也可以将本机的 8080 端口转发到 80 端口:

[root@server1 ~]$ iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80

防火墙配置

常见的防火墙与网络布线配置有下面几种:

客户端防火墙

当 Linux 主机作为客户端且不提供网络服务时,基本防火墙设置如下:

  • 规则归零:清除所有已存在的规则。
  • 默认策略:除了将 INPUT 设为 DROP 外,其他默认为 ACCEPT。
  • 信任本机:由于 lo 对本机来说很重要,因此必须设置为信任设备。
  • 回应数据包:让本机通过主动向外发出请求而响应的数据包可以进入本机。
  • 信任用户:可在想要让本地网络的来源使用主机资源时设置。

可以将防火墙规则写入脚本中:

#!/bin/bash

# 1.清除规则
iptables -F
iptables -X
iptables -Z

# 2.设置默认策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# 3.定制各项规则
iptables -A INPUT -i ens37 -s 192.168.2.101 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i ens37 -m state --state RELATED,ESTABLISHED -j ACCEPT

# 4.保存配置
iptables-save

单一网络防火墙

防火墙至少有两个接口,将可信任的内部局域网与不可信任的外部因特网分开,由防火墙全权掌控到局域网内的所有数据包。

网络示例图:

单一网络防火墙

假设上面的 Linux 服务器作为防火墙和内部 LAN 的路由器使用,配置如下:

  • 对外网口 ens33,IP 配置 192.168.2.254/24,网关 192.168.2.1。
  • 对内网口 ens37,IP 配置 10.1.1.1/24。
  • 默认开放 HTTP、HTTPS、SSH 端口。

针对防火墙的脚本内容如下:

[root@server2 iptables]$ vi iptables.rules
#!/bin/bash

# 定义参数
OUTIF='ens33'
INIF='ens37'
INNET='10.1.1.0/24'
export OUTIF INIF INNET

# 针对互联网卡设置###################
# 1.设置内核参数
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

# 2.清除规则,设置默认策略及开放lo与相关设置值
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 -m state --state RELATED,ESTABLISHED -j ACCEPT

# 3.启动额外的防火墙script模块
if [ -f /root/iptables/iptables.deny ]; then
    sh /root/iptables/iptables.deny
fi
if [ -f /root/iptables/iptables.allow ]; then
    sh /root/iptables/iptables.allow
fi
if [ -f /root/iptables/iptables.http ]; then
    sh /root/iptables/iptables.http
fi

# 4.允许某些类型的ICMP数据包进入
AICMP="0 3 3/4 4 11 12 14 16 18"
for x in $AICMP; do
    iptables -A INPUT -i $OUTIF -p icmp --icmp-type $x -j ACCEPT
done

# 5.允许某些服务的进入
iptables -A INPUT -p TCP -i $OUTIF --dport 21 --sport 1:65534 -j ACCEPT  # FTP
iptables -A INPUT -p TCP -i $OUTIF --dport 22 --sport 1:65534 -j ACCEPT  # SSH
iptables -A INPUT -p TCP -i $OUTIF --dport 25 --sport 1:65534 -j ACCEPT  # SMTP
iptables -A INPUT -p TCP -i $OUTIF --dport 53 --sport 1:65534 -j ACCEPT  # DNS
iptables -A INPUT -p UDP -i $OUTIF --dport 53 --sport 1:65534 -j ACCEPT  # DNS
iptables -A INPUT -p TCP -i $OUTIF --dport 80 --sport 1:65534 -j ACCEPT  # HTTP
iptables -A INPUT -p TCP -i $OUTIF --dport 110 --sport 1:65534 -j ACCEPT # POP3
iptables -A INPUT -p TCP -i $OUTIF --dport 443 --sport 1:65534 -j ACCEPT # HTTPS

# 针对局域网网卡设置####################
# 1.先加载一些有用的模块
modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules; do
    testmod=$(lsmod | grep "^${mod} " | awk '{print $1}')
    if [ "$testmod" == "" ]; then
        modprobe $mod
    fi
done

# 2.清除NAT table的规则
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# 3.开启内网SNAT
if [ "$INIF" != "" ]; then
    iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" >/proc/sys/net/ipv4/ip_forward
    if [ "$INNET" != "" ]; then
        iptables -t nat -A POSTROUTING -s $INNET -o $OUTIF -j MASQUERADE
    fi
fi

# 4. NAT服务器内局域网中服务器端口转发
iptables -t nat -A PREROUTING -p tcp -i $OUTIF --dport 80 -j DNAT --to-destination 192.168.2.234:80

# 5. 保存规则
iptables-save

/root/iptables 目录下可以填写额外规则:

[root@server2 iptables]$ vi iptables.allow
#!/bin/bash
iptables -A INPUT -i $OUTIF -s 192.168.2.0/24 -j ACCEPT
[root@server2 iptables]$ vi iptables.deny
#!/bin/bash
iptables -A INPUT -i $OUTIF -s 192.168.2.230 -j DROP
[root@server2 iptables]$ chmod 700 iptables.*

可以将脚本写入 /etc/rc.d/rc.local 文件中来开机执行:

[root@server2 iptables]$ vi /etc/rc.d/rc.local
/root/iptables/iptables.rules

内网防火墙

一般情况下,局域网内部的防火墙并不需要过于严格的防备措施。但是,如果局域网内部存在高度机密的子网,可以考虑增设防火墙进行保护。

网络示例图:

内网防火墙

网络服务器防火墙

如果存在提供对外网络服务的服务器,可以将该服务器放置在两台防火墙之间,这样可以使服务器免受来自内部和外部网络的攻击。该服务器所处的区域也被称为非军事化隔离区(DMZ)。

网络示例图:

网络服务器防火墙