Linux iptables 详解

2021年1月28日 作者 menhsours.alan

Linux iptables 详解

(一)- 四表/五链、数据包匹配流程、编写 iptables 规则

1.Linux 防火墙基础

Linux防火墙主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,典型的包过滤防火墙,基于内核编码实现,具有非常稳定的性能和高效率。

  • iptables:用来管理 Linux 防火墙的命令程序,位于/sbin/iptables目录下,属于用户空间的防火墙管理体系。
  • netfilter:Linux 内核中实现包过滤防火墙的内部结构,一般不以程序或文件的形式存在,属于内核空间的防火墙管理体系。

iptables 的作用:为包过滤机制的实现提供规则,通过各种不同的规则,来告诉netfilter对来自某些源以及前往某些目的或具有某些协议特征的数据包是如何进行处理的。

2.iptables 的表、链结构

每个规则表,其实就相当于一个内核空间的容器,按照规则集的不同用途进行划分为默认的四个表,在每个规则表中包含不同的规则链,处理数据包的不同时机分为五种链,决定是否过滤或处理数据包的各种规则并按照先后顺序存放在各规则链中。

  • 规则的作用:对数据包进行过滤或处理;
  • 链的作用:容纳多种防火墙规则;

规则表

iptables管理着四个不同的规则表,分别由独立的内核模块实现。

  • filter 表:用来对数据包进行过滤,具体的规则要求决定如何处理一个数据包。

对应的内核模块为:iptable_filter,其表内包括三个链:input、forward、output;

  • nat 表:nat 全称:network address translation 网络地址转换,主要用来修改数据包的 IP 地址、端口号信息。

对应的内核模块为:iptable_nat,其表内包括三个链:prerouting、postrouting、output;

  • mangle 表:主要用来修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等。

对应的内核模块为:iptable_mangle,其表内包括五个链:prerouting、postrouting、input、output、forward;

  • raw 表:主要用来决定是否对数据包进行状态跟踪。

对应的内核模块为:iptable_raw,其表内包括两个链:output、prerouting;

规则链

  • input 链:当收到访问防火墙本机地址的数据包时,将应用此链中的规则;
  • output 链:当防火墙本机向外发送数据包时,将应用此链中的规则;
  • forward 链:当收到需要通过防火中转发给其他地址的数据包时,将应用此链中的规则;
  • prerouting 链:在对数据包做路由选择之前,将应用此链中的规则;
  • postrouting 链:在对数据包做路由选择之后,将应用此链中的规则;

input output 链主要用在主机型防火墙,是针对服务器本机进行保护的防火墙;

forward 链、prerouting 链、postrouting 链主要用在网络型防火墙,是针对公司内网与 Internet 之间进行安全控制。

3.数据包过滤的匹配流程

规则表之间的顺序

当数据包到达防火墙时,如果对应的链内有规则存在,将按照顺序依次从raw 表→mangle 表→nat 表→filter 表。

规则链之间的顺序

  • 入数据流向:如果是外边的数据包到达防火墙后,要先通过prerouting 链:对数据包做路由选择之后,将应用此链中的规则,然后将进行路由选择,确认数据包的目标地址是否是防火墙本机,结合内核传送给input链做处理,确认通过之后,便可以交给服务器端来进行响应。
  • 转发数据流向:如果是外边的数据包到达防火墙后,要先通过prerouting 链做相关处理,随后进行路由选择,数据包的目标地址是任何其他地址的话,则将通过内核传给forward来进行处理是否需要通过或直接丢弃,最后将交给postrouting 链来查看是否有需要修改的数据包信息来进行处理。
  • 出数据流向:出流量,其实就是防火墙本机向外的地址发送数据包,首先被output 链处理,然后选择路由,然后在postrouting 链查看是否修改数据包的信息来进行处理。

规则链内部各条防火墙规则之间的顺序

数据包经过每条规则链时,将按照第一条规则、第二条规则……的顺序进行匹配和处理。

链内的过滤原则

  • 将按照从匹配到停止的方式,如找到一条匹配的规则,将不再执行本链中后续的其他规则;
  • 如果对比整个链也找不到与数据包相匹配的规则时,将按照该规则链的默认策略进行处理;

4.编写防火墙规则

iptables 的基本语法命令格式

iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

  • 表名、链名:指定iptables命令所操作的表和链,未指定表名时将默认使用filter表;
  • 管理选项:表示iptables规则的操作方式,比如:插入、增加、删除、查看等;
  • 匹配条件:指定要处理的数据包的特征,不符合指定条件的数据包不在处理;
  • 控制类型:指数据包的处理方式,比如:允许、拒绝、丢弃等;

iptables 防火墙最常用的控制类型

  • accept:允许数据包;
  • drop:丢弃数据包,且不给任何回应信息;
  • reject:拒绝数据包,必要时会给数据发送端一个响应信息;
  • log:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一个地址;

iptables 防火墙的最常用基本操作

iptables 命令的常用管理选项

-A:在指定链的末尾添加一条新的规则
-D:删除指定链中的某一条规则,可删除指定序号或具体内容
-I:在指定链中插入一条新规则,未指定序号时默认作为第一条规则
-R:修改、替换指定链中的某一条规则,可指定规则序号或具体内容
-L:列出指定链中所有的规则,未指定链名,则列出表中的所有链
-F:清空指定链中所有的规则,未指定链名,则清空表中的所有链
-P:设置指定链的默认策略
-n:使用数字形式显示输出结果
-v:查看规则列表时显示详细的信息
-h:查看命令帮助信息
–line-numbers:查看规则列表时,同时显示规则在链中的顺序好

添加新的规则

添加新的防火墙规则时,可使用管理选项-A:用来追加规则-l:用来插入规则;

在filter 表 INPUT 链的末尾添加一条规则,可使用-p协议名来做匹配条件;

# iptables -t filter -A INPUT -p tcp -j ACCEPT

使用管理选项-I,允许同时制定添加规则的顺序号,未指定序号时默认作为第一条规则;

添加两条规则分别位于filter表的第一条、第二条,将使用默认的filter表;

# iptables -I INPUT -p udp -j ACCEPT
# iptables -I INPUT 2 -p icmp -j ACCEPT

查看规则列表

查看防火墙规则时,需使用管理选项-L并结合–line-numbers选项显示各条规则在链内的顺序号;

查看filter 表 INPUT 链中的所有规则,并显示规则序号;

# iptables -L INPUT –line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     udp  —  anywhere             anywhere            
2    ACCEPT     icmp —  anywhere             anywhere            
3    ACCEPT     all  —  anywhere             anywhere            state RELATED,ESTABLISHED 
4    ACCEPT     icmp —  anywhere             anywhere            
5    ACCEPT     all  —  anywhere             anywhere            
6    ACCEPT     tcp  —  anywhere             anywhere            state NEW tcp dpt:ssh 
7    REJECT     all  —  anywhere             anywhere            reject-with icmp-host-prohibited 
8    ACCEPT     tcp  —  anywhere             anywhere            

防火墙规则多时,可以以数字形式显示地址和端口信息,减少地址解析的过程,加快命令的执行速度。

以数字形式查看默认表INPUT 链中的所有规则,可结合参数-nL或者拆分-n -L的方式来操作;

# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  —  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp —  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  —  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     icmp —  0.0.0.0/0            0.0.0.0/0           
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 
REJECT     all  —  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           

删除、清空规则

删除filter 表 INPUT 链中的第三条规则,可使用管理选项-D来删除一条防火墙规则;

# iptables -D INPUT 3
# iptables -n -L INPUT

清空指定链或表中的所有防火墙规则,可使用管理选项-F;

# iptables -F INPUT
# iptables -n -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination  

省略链名而清空指定表所有链的规则,可使用管理选项-F;

# iptables -F
# iptables -t nat -F
# iptables -t mangle -F

设置默认策略

默认策略的控制类型分为:accept、drop两种。

将filter 表中的FORWARD 链的默认策略设置为:丢弃,OUTPUT 链的默认策略设置为:允许;

# iptables -t filter -P FROWARD DROP
# iptables -P OUTPUT ACCEPT

5.规则的匹配条件

通用匹配:称为常规匹配,可独立使用,不依赖于其他条件或扩展模块。

协议匹配

编写规则时使用-p 协议名的形式指定;

用来检查数据包所使用的网络协议,可用的协议类型文件位于:/etc/procotols中。

# iptables -I INPUT -p icmp -j DROP
# iptables -A FORWARD ! -p icmp -j ACCEPT

地址匹配

编写iptables规则时使用-s 源地址或-d 目标地址的形式指定;

用来检查数据包的源地址或目标地址。(IP地址、网段地址)

不建议使用主机名、域名地址;

比方说:若要拒绝转发源地址为 192.168.123.123 的数据,但允许转发源地址位于 192.168.1.0/24 网段的数据;

# iptables -A FORWARD -s 192.168.123.123 -j REJECT
# iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

比方说:若要检测到来自某个网站的频繁扫描、登录时,可添加防火墙规则进行封锁;

# iptables -I INPUT -s 192.168.123.0/24 -j DROP
# iptables -I FORWARD -s 192.168.123.0/24 -j DROP

网络接口匹配

编写iptables规则时使用-i 接口名和-o 接口名的形式指定;

用来检查数据包从防火墙的哪一个接口进或出的,并且分别对应入站/出站网卡;

比方说:若要丢弃从外网接口访问防火墙本机且源地址为私有地址的数据包;

# iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
# iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
# iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP

隐含匹配:以指定的协议匹配作为前提条件,对应的功能由iptables在需要时自动隐含载入内核。

常见的隐含匹配:端口匹配、TCP匹配、ICMP匹配;

端口匹配

编写iptables规则时使用–sport 源端口或者–dport 目标端口的形式指定;

针对的协议类型为:TCP、UDP

用来检查数据包的源端口或目标端口。

单个端口号或者以冒号:分隔的端口范围是可以接受的,但不连续的多个端口是不可以采用的。

比方说:允许为网段 192.168.123.0/24 转发 http 查询数据包;

# iptables -A FORWARD -s 192.168.123.0/24 -p udp –dport 80 -j ACCEPT
# iptables -A FORWARD -d 192.168.123.0/24 -p udp –dport 80 -j ACCEPT

比方说:搭建 ftp 服务时,开放 20、21 端口,以及用于被动模式的端口范围为 24 100~25 200;

# iptables -A INPUT -p tcp –dport 20:21 -j ACCEPT
# iptables -A INPUT -p tcp –dport 24100:25200 -j ACCEPT

ICMP 匹配

编写iptables规则时使用–icmp-type ICMP 类型的形式指定;

针对的协议:ICMP,用来检查 ICMP 数据包的类型。

ICMP 类型使用字符串或数字显示

  • echo-request:8(ICMP 协议请求)
  • echo-reply:0(ICMP 协议回显)
  • destination-unreachable:3(ICMP 协议目标不可达)

比方说:若要禁止从其他主机 ping 本机,但是允许本机 ping 其他主机。

# iptables -A INPUT -p icmp –icmp-type 8 -j DROP
# 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 -j DROP

更多可用的 ICMP 协议类型,可执行iptables -p icmp -h进行查看;

显示匹配

该匹配方式需要有额外的内核模块提供支持,以-m 模块名称的形式调用相应的模块,然后设置匹配条件。

常见的显示匹配:多端口匹配、IP 范围匹配、MAC 地址匹配、状态匹配;

多端口匹配

编写iptables规则时使用-m multiport –dports 端口列表、-m multiport –sports 端口列表的形式指定;

用来检查数据包的源端口、目标端口、多个端口之间以逗号进行分隔;

比方说:若要允许本机开放端口:80、443、110 等等,提供相关服务;

# iptables -A INPUT -p tcp -m multiport –dport 80,443,110 -j ACCEPT

IP 范围匹配

编写iptables规则时使用-m iprange –src-range IP 范围、-m iprange –dst-range IP 范围的形式指定;

用来检查数据包的源地址、目标地址;

IP 范围:起始地址-结束地址的形式表示;

比方说:要禁止转发源 IP 地址位于 192.168.8.100 与 192.168.8.123 之间的 TCP 数据包;

# iptables -A FORWARD -p tcp -m iprange –src-range 192.168.8.100-192.168.8.123 -j ACCEPT

MAC 地址匹配

编写iptables规则时使用-m mac –mac-source MAC 地址的形式指定;

用来检查数据包的源 MAC 地址,只适用于内部网络;

比方说:要根据 MAC 地址封锁主机,禁止其访问本机的任何应用;

# iptables -A INPUT -m mac –mac-source MAC 地址 xxx -j DROP

状态匹配

编写iptables规则时使用-m state –state 连接状态的形式指定;

基于iptables的状态跟踪机制用来检查数据包的连接状态;

常见的连接状态包括:new(与任何连接无关)、established(响应请求或已建立连接)、related(与有连接相关性的);

比方说:要禁止转发与正常 TCP 连接无关的非 –syn 请求数据包;

# iptables -A FORWARD -m state –state NEW -p tcp ! –syn -j DROP

只开放本机的 WEB 服务,但对发给本机的 TCP 数据包进行放行,其他入数据包丢弃;

# iptables -I INPUT -p tcp -m multiport –dport 80 -j ACCEPT
# iptables -I INPUT -p tcp -m state –state ESTABLISHED -j ACCEPT
# iptables -P INPUT DROP


(二)- SNAT / DNAT 策略及应用

SNAT 策略概述

SNAT全称为:Source Network Address Translation 源地址转换

SNAT 是 Linux 防火墙的一种地址转换操作,iptables 命令中的一种数据包控制类型;

SNAT作用:根据指定条件修改数据包的源 IP 地址。

随着 IP 地址资源逐渐减少,使企业难以申请公网 IP 地址,或只能承认一个或者少数几个公网 IP 地址的费用,所以在大部分企业中将面临着局域网内的主机接入 Internet 的需求。采用小型的企业网络,通过在网关中应用 SNAT 策略,可解决局域网共享上网的问题。

Linux 网关服务器需通过两块网卡 eth1、eth2分别连接 Internet 和 局域网,来分析局域网主机访问 Internet 的情况。

局域网各主机正确设置 IP 地址 / 子网掩码 / 默认网关地址

Eth1: 192.168.3.111/24  Gw : 192.168.3.1
Eth2: 192.168.1.7/24  (连接内网网卡不配置网关)

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:f9:55:5b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.7/24 brd 192.168.1.255 scope global eth2
    inet6 2409:8a00:30f8:4d70:20c:29ff:fef9:555b/64 scope global dynamic 
       valid_lft 259010sec preferred_lft 172610sec
    inet6 fe80::20c:29ff:fef9:555b/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:f9:55:65 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.111/24 brd 192.168.3.255 scope global eth1
    inet6 fe80::20c:29ff:fef9:5565/64 scope link 
       valid_lft forever preferred_lft forever

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.3.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth2
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth2

关闭防火墙和 selinux

# service iptables stop
iptables:将链设置为政策 ACCEPT:filter                    [确定]
iptables:清除防火墙规则:                                 [确定]
iptables:正在卸载模块:                                   [确定]
# setenforce 0

只开启路由转发,未设置地址转换的情况

作为网关的 Linux 服务器必须打开路由转发,才能与多个网络进行连通。

未使用地址转换策略时,从局域网 PC 192.168.1.123 访问 Internet 的数据包经过网关转发后其源 IP 低至保持不变,当 Internet 中的主机收到这样的请求数据包后,响应数据包将无法正确返回,从而导致访问失败。(私网地址不能在 Internet 中正常路由)

开启路由转发,并设置 SNAT 转换的情况

在网关服务器中正确应用 SNAT 策略,数据包转发情况就不一样了。

局域网 PC 访问 Internet 的数据包到达网关服务器时,先进行路由选择,若发现该数据包需要从外网接口 eth1 向外转发,则将其源 IP 地址 192.168.1.123 修改为网关的外网接口地址 192.168.3.111,然后才发送给目标主机 192.168.3.112。

从网关服务器的公网 IP 地址提交数据访问请求,目标主机可正确返回响应数据包,来实现局域网 PC 共享同一个公网 IP 地址接入 Internet。

SNAT 转换地址的过程中,网关服务器会根据之前建立的 SNAT 映射,将响应数据包正确返回局域网中的源主机。只要连接的第一个包被 SNAT 处理了,这连接及对应数据流的其他包会自动的被进行 SNAT 处理。Internet 中的服务器其实不知道局域网 PC 的 IP 地址,其中间的转换完全由网关主机完成,可起到内网保护的作用。

SNAT 策略应用

SNAT 策略应用:是为局域网共享上网提供接入策略,处理数据包的切入时机是在路由选择后进行,是将局域网外发数据包的源 IP 地址修改为网关服务器的外网接口 IP 地址。

SNAT 策略用在 nat 表的 postrouting 链。

编写 SNAT 策略时,需使用 iptables 命令结合–to-source IP 地址选项来指定修改后的源 IP 地址。

共享固定 IP 地址上网

  • Linux 网关服务器通过两块网卡eth1、eth2分别连接 Internet 和 局域网。
  • 所有局域网 PC 的默认网关设置为:192.168.1.7,且已经设置了 DNS 服务器。
  • 要求 192.168.3.0/24 网段的 PC 能够通过共享方式正常访问 Internet。

打开网关的路由转发

IP 转发是实现路由功能的关键,对应 /proc 文件系统中的 ip_forward 设置。

当值为 1 时表示开启,为 0 时表示关闭。

使用 Linux 主机作为网关设备,可修改sysctl.conf 配置文件,需永久开启路由转发功能。

# vi /etc/sysctl.conf 
7 net.ipv4.ip_forward = 1                   # 将第 7 行的配置由原来的 0 改为 1
# sysctl -p                                 # 读取修改后的配置

测试过程中,可临时开启路由转发。

# echo 1 > /proc/sys/net/ipv4/ip_forward 
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

正确设置 SNAT 策略

针对局域网 PC 访问 Internet 的数据包采用 SNAT 策略,并将源地址改为网关的公网 IP 地址,设置防火墙规则,保持 SNAT 策略长期有效,并将相关命令写入到rc.local配置文件,方便开机后自动设置。

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT–to-source 192.168.3.111

测试 SNAT 策略共享接入结果

使用局域网中的 PC 便可以正常访问 Internet 中的网站了。

被访问的网站服务器,会认为是网关主机 192.168.3.111 在访问获取 web 日志,而并不知道是否是实际企业内网的 PC 地址 192.168.3.123 在访问。

启动一台 Windows 设备,根据实际情况配置 IP 地址,并测试连通性;

在 Windows 操作系统上安装 IIS 服务,选择 Internet 信息服务选项即可;

安装完毕之后,打开浏览器输入本机的 IP 地址即可访问;

共享动态 IP 地址上网

iptables 提供了一个名为 masquerade 的数据包控制类型,可用来修改数据包源 IP 地址,能够自动获取外网接口的 IP 地址,不需要使用–to-source指定固定的 IP 地址。

若要使用 MASQUERADE 伪装策略,只需去掉 SNAT 策略中的 –to-source IP 地址,然后使用 -j MASQUERADE 指定数据包控制类型。

ADSL 宽带链接,通常连接名称为:ppp0、ppp1等等;

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

如果网关使用固定的公网 IP 地址,最好选择 SNAT 策略而不是 masquerade 策略,以减少不必要的系统开销。 

DNAT 策略及应用

DNAT 全称为:Destination Network Address Translation (目标地址转换)

DNAT 是Linux 防火墙的另一种地址转换操作,是iptables命令中的一种数据包控制类型;

作用:根据指定条件修改数据包的目标 IP 地址和目标端口。

DNAT 策略概述

DNAT:用来修改目标 IP 地址和目标端口,用在 nat 表的 PREROUTING 链和 OUTPUT 链中。

与 SNAT 相似,SNAT 用来修改源 IP 地址,用在 nat 表的 POSTROUTING 链。

在 Internet 环境中,所注册的网站域名必须对应合法的公网 IP 地址,Internet PC 将无法访问公司内网的服务器,除非在网关服务器中正确设置 DNAT 策略。

Internet PC 提交的 HTTP 请求到企业的网关服务器时,网关服务器首先判断数据包的目标地址和目标端口,发现数据包需要访问本机的 80 端口,则将其目标 IP 地址修改为内网中的网站服务器 IP 地址,然后发送给内部的网站服务器。

网关服务器会根据之前建立的 DNAT 映射,修改返回的 HTTP 应答数据包的源 IP 地址,再返回给 Internet PC 。

Internet PC 其实不知道企业网站服务器的局域网地址,中间转换是由网关主机完成,通过设置的 DNAT 策略,企业内部的服务器就可以面向 Internet 提供服务。

DNAT 策略应用

DNAT 应用:是在 Internet 中发布企业内部的服务器,处理数据包的切入时机是在路由选择之前进行。将访问网关外网接口 IP 地址的数据包的目标地址修改为实际提供服务的内部服务器的 IP 地址。

使用 iptables 命令设置 DNAT 策略时,需要结合–to-destination IP 地址选项来指定内部服务器的 IP 地址。

发布企业内部的 web 服务器

  • 公司需注册网站域名,IP 地址为 192.168.3.111
  • 公司的网站服务器位于局域网内,IP 地址为 192.168.3.112
  • 要求能够从 Internet 中通过访问网站域名来查看公司的网站内容

打开网关的路由转发

# vi /etc/sysctl.conf 
7 net.ipv4.ip_forward = 1                   # 将第 7 行的配置由原来的 0 改为 1
# sysctl -p                                 # 读取修改后的配置

正确设置 DNAT 策略

针对 Internet 中的任意主机访问网关 80 端口的数据包,将目标地址修改为位于内网的网站服务器 IP 地址。

# iptables -t nat -A PREROUTING -i eth2 -d 192.168.1.7 -p tcp –dport 80 -j DNAT –to-destination 192.168.3.112
# iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  —  eth2   *       0.0.0.0/0            192.168.1.7         tcp dpt:80 to:192.168.3.112 

Chain POSTROUTING (policy ACCEPT 1 packets, 136 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1 packets, 136 bytes)
 pkts bytes target     prot opt in     out     source               destination 

测试 DNAT 发布结果

在网站服务器 192.168.3.112 中正确设置,启动 web 服务,测试网页,可自定义修改首页文件,然后通过 Internet 中的客户机访问网站,不做 DNS 解析,也可直接访问。

发布企业内部的 OpenSSH 服务器

DNAT 策略:用来修改数据包的目标 IP 地址,但在需要时也可修改目标端口号。

配置 OpenSSH 服务

在网关,网站服务器中开启 OpenSSH 服务,分别使用 2345、22 端口。

网关的 sshd 服务因直接面向 Internet,因此不使用默认端口。

打开网关的路由转发

# vi /etc/sysctl.conf 
7 net.ipv4.ip_forward = 1                   # 将第 7 行的配置由原来的 0 改为 1
# sysctl -p                                 # 读取修改后的配置

正确设置 DNAT 策略

网关本机的 sshd 服务直接面向 Internet,不需要地址转换,但网站服务器位于内网,需通过 DNAT 策略进行发布。

网关设置防火墙规则,修改访问外网的 IP 地址 2346 端口的数据包,及修改目标地址和端口,便于转发给网站服务器。

# iptables -t nat -A PREROUTING -i eth2 -d 192.168.1.7 -p tcp –dport 2346 -j DNAT –to-destination 192.168.3.112:22

测试 DNAT 发布结果

使用ssh -p 2345 / 2346 用户名@eth2 IP 地址即可登录网关服务器

(三)- 规则的导出 / 导入、使用防火墙脚本程序

1、防火墙规则的备份及还原

防火墙规则的批量备份、还原两个命令,分别是:iptables-save和iptables-restore,用来保存和恢复。

1.1 iptables-save 命令

iptables-save 命令:用来批量导出 Linux 防火墙规则。

直接执行iptables-save 命令时,将显示出当前启用的所有规则。

# iptables-save
# Generated by iptables-save v1.4.7 on Mon Oct  7 20:09:30 2019
*nat
:PREROUTING ACCEPT [134:12724]
:POSTROUTING ACCEPT [10:645]
:OUTPUT ACCEPT [10:645]
-A PREROUTING -d 192.168.1.4/32 -i eth2 -p tcp -m tcp –dport 80 -j DNAT –to-destination 192.168.3.112 
COMMIT
# Completed on Mon Oct  7 20:09:30 2019
# Generated by iptables-save v1.4.7 on Mon Oct  7 20:09:30 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [257:22057]
-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 -j REJECT –reject-with icmp-host-prohibited 
-A FORWARD -j REJECT –reject-with icmp-host-prohibited 
COMMIT
# Completed on Mon Oct  7 20:09:30 2019

上述输出的各项含义:

  • # 号开头的内容表示注释;
  • *表名:表示所在的表;例如:*nat
  • :链名 默认策略:表示相应的链及默认策略,具体规则部分省略了iptables命令名;
  • COMMIT:表示提交前面的规则设置;

iptables-save 命令:只是把规则内容输出到屏幕上,当需要保存为固定的文件时,结合重定向输出的操作来完成备份。

将当前已设置的所有防火墙规则备份为iptables_beifen.txt文件,可执行如下命令即可,备份完成后,可查看所备份到的路径下是否存在该文件;

# iptables-save > /root/iptables_beifen.txt
# ll | grep iptables_beifen.txt 
-rw-r–r–. 1 root root   782 10月  7 20:26 iptables_beifen.txt

1.2 iptables-restore 命令

iptables-restore 命令:用来批量导入 Linux 防火墙规则,与iptables-save 命令相结合重定向输入来指定备份文件的位置。

# iptables-restore < /root/iptables_beifen.txt

2、使用 iptables 服务

iptables 服务使用的规则文件位于 /etc/sysconfig/iptables 文件中。

通过 iptables 系统服务,可快速启用、清空防火墙规则。

2.1 自动启用防火墙规则

使用iptables-save备份为默认的规则配置文件 /etc/sysconfig/iptables 然后可以通过 iptables 服务来调用。

将保存当前的防火墙规则,并设置在每次开机后根据已保存的规则内容自动进行重建。

# iptables-save > /etc/sysconfig/iptables
# chkconfig –level 2345 iptables on
# chkconfig –list iptables
iptables           0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭

启用 /etc/sysconfig/iptables 文件中的规则设置时,只需要启动 iptables 服务即可。

# service iptables start

2.2 清空所有防火墙规则

调试各种防火墙规则的过程中,为了排除其他规则的干扰,需清空某些表的规则。

需要依次清空所有表的规则时,停用 iptables 服务是最好的办法。

# service iptables stop
iptables:将链设置为政策 ACCEPT:nat filter                [确定]
iptables:清除防火墙规则:                                 [确定]
iptables:正在卸载模块:                                   [确定]
# service iptables status
iptables:未运行防火墙。

3、防火墙脚本的组成

有同学可能会有疑问,防火墙还有脚本应用?具体都有哪些内容组成呢?等等;

防火墙脚本的优势:便于使用 Shell 变量、程序控制逻辑、作为独立的文件在需要重用、移植使用时更方便;

3.1 定义基本变量

防火墙的网卡、IP 地址、局域网段、iptables 命令的路径等定义为变量,便于对脚本程序的维护和移植使用。

规则多时,一旦网络环境出现问题,只需对变量值进行修改就可以使用了。

# vi /opt/myiptables.sh
#!/bin/bash
#### 3.1 定义基本变量
INET_IF=”eth1″                     # 外网接口
INET_IP=”192.168.3.111″            # 外网接口地址
LAN_IF=”eth2″                      # 内网接口
LAN_IP=”192.168.1.4″               # 内网接口地址
LAN_NET=”192.168.1.0/24″           # 内网网段
LAN_WWW_IP=”192.168.3.112″         # 网站服务器的内部地址
IPT=”/sbin/iptables”               # iptables 命令路径
MOD=”/sbin/modprobe”               # modprobe 命令路径
CTL=”/sbin/sysctl”                 # sysctl 命令路径

设置好变量后,就可以直接引用了,添加必要的注释以外,变量名称最好使用一定含义的字符串。

3.2 加载内核模块

iptables 命令的模块都可以根据需要动态载入内核,个别需要手动加载。

需启用的规则数量多时,可提高规则设置的效率,保持防火墙的稳定性,并将各模块提前加载到内核中。

#### 3.2 加载必要的内核模块
$MOD ip_tables                      # iptables 基本模块
$MOD ip_conntrack                   # 连接跟踪模块
$MOD ipt_REJECT                     # 拒绝操作模块
$MOD ipt_LOG                        # 日志记录模块
$MOD ipt_iprange                    # 支持 IP 范围匹配
$MOD xt_state                       # 支持状态匹配
$MOD xt_multiport                   # 支持多端口匹配
$MOD xt_mac                         # 支持 MAC 地址匹配
$MOD ip_nat_ftp                     # 支持 FTP 地址转换
$MOD ip_conntrack_ftp               # 支持 FTP 连接跟踪

3.3 调整 /proc 参数

/proc 是 Linux 或 UNIX 系统中的一种伪文件系统机制,提供访问内核运行结构、改变内核设置的实时数据。

/proc 中的数据存放在内存而不是硬盘上。

/proc/sys 存放着与系统相关的一些可控参数,可用来改变内核的行为,作为 Linux 内核调优的实时入口。

使用echo、sysctl 命令可以修改相关参数,也可以写到/etc/sysctl.conf文件中,(执行 sysctl -p 后生效)其主要包括是否打开 IP 转发、是否响应 ICMP 广播、设置好 TCP 响应超时等;

以下为最常见的 /proc 参数调整

icmp 相关参数:可使本机忽略其他主机的 ping 测试;

TCP 相关参数:可适当提高本机抵抗 DOS 攻击的能力;

#### 3.3 Linux 内核控制及调优
$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=1    # 拒绝响应 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 请求的队列长度

3.4 设置具体的 iptables 规则

清理已有的规则

避免已有的防火墙规则造成干扰,需先进行清理,删除所有表中用户自定义的链,清空所有链内的规则。

#### 3.4 具体的防火墙规则
$IPT -t filter -X                                 # 删除各表中自定义的链
$IPT -t nat -X
$IPT -t filter -F                                 # 清空各表中已有的规则
$IPT -t nat -F

设置规则链的默认策略

实际环境中,防火墙过滤规则需采取默认拒绝的策略,可提高安全性。

学习过程中,还是建议采取默认允许的策略,需将默认策略中的DROP改为ACCEPT。

$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

设置 nat 表中的各种规则

nat 表主要用在 Linux 网关服务器中,需根据实际情况编写相应的SNAT和DNAT规则。

$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-destination $LAN_WWW_IP

设置 filter 表中的各种规则

filter 表主要用来过滤数据包。

主机型防火墙主要使用INPUT和OUTPUT链。

网络型防火墙主要使用FORWARD链。

默认拒绝的情况下,要实现共享上网,除了设置SNAT策略外,还需放行内网 PC 与 Internet 中的 DNS、HTTPD 等相关服务通信;

注意:在实际工作中,建议大家还是根据实际网络情况进行设置相应的规则,并在测试环境中进行测试,确保规则无误,避免导致网络通信出现故障。

$IPT -A FOEWARD -s $LAN_NET -o $INET_IF -p udp 53 -j ACCEPT
$IPT -A FOEWARD -s $LAN_NET -o $INET_IF -p udp 80 -j ACCEPT
$IPT -A FOEWARD -d $LAN_NET -i $INET_IF -m state ESTABLISHED,RELATED -j ACCEPT

添加执行权限

# chmod +x /opt/myiptables.sh 

执行/opt/myiptables.sh脚本文件

# /opt/myiptables.sh 
net.ipv4.ip_forward = 1
net.ipv4.ip_default_ttl = 128
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_max_syn_backlog = 3200

查看防火墙规则

# iptables -nL FORWARD

将/opt/myiptables.sh脚本文件设置为开机自动执行

# vi /etc/rc.local
/opt/myiptables.sh

转载原文链接:https://www.eet-china.com/mp/a31036.html