iptables-总结

ubuntu下获取内核源码:
sudo apt install linux-source下载内核源码到/usr/src目录下
.tar.bz2格式解压为tar -jxvf xx.tar.bz2

iptables命令说明

以下大部分内容总结来源于:http://www.zsythink.net/archives/tag/iptables
每一节前附原博客连接,此处文总结用于温故

=1iptables详解(1):iptables概念=

(1) iptables基本概念

空空如也。。。

=2iptables详解(2):iptables实际操作之规则查询=

(2)小结-规则查询

好了,我们已经会使用命令简单的查看iptables表的规则了,为了方便以后回顾,我们将上文中的相关命令总结一下。

iptables -t 表名 -L

查看对应表的所有规则,-t选项指定要操作的表,省略"-t 表名"时,默认表示操作filter表,-L表示列出规则,即查看规则。

iptables -t 表名 -L 链名

查看指定表的指定链中的规则。

iptables -t 表名 -v -L

查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出"计数器"的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables -t 表名 -vL

iptables -t 表名 -n -L

表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。

iptables --line-numbers -t 表名 -L

表示查看表的所有规则,并且显示规则的序号,–line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为–line,注意,简写后仍然是两条横杠,仍然是长选项。

iptables -t 表名 -v -x -L

表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值。

实际使用中,为了方便,往往会将短选项进行合并,所以,如果将上述选项都糅合在一起,可以写成如下命令,此处以filter表为例。

iptables --line -t filter -nvxL

当然,也可以只查看某张表中的某条链,此处以filter表的INPUT链为例

iptables --line -t filter -nvxL INPUT

=3 iptables详解(3):iptables规则管理=

(3)小结-规则管理(增删改存)

上文已经详细的举例并描述了怎样进行iptables规则管理,为了以后能够快速的回顾,我们把上述命令总结一下。

###添加规则

注意点:添加规则时,规则的顺序非常重要

在指定表的指定链的尾部添加一条规则,-A选项表示在对应链的末尾添加规则,省略-t选项时,表示默认操作filter表中的规则

命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作

示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP

在指定表的指定链的首部添加一条规则,-I选型表示在对应链的开头添加规则

命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作

示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT

在指定表的指定链的指定位置添加一条规则

命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作

示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT

设置指定表的指定链的默认策略(默认动作),并非添加规则。

命令语法:iptables -t 表名 -P 链名 动作

示例:iptables -t filter -P FORWARD ACCEPT

上例表示将filter表中FORWARD链的默认策略设置为ACCEPT

###删除规则

注意点:如果没有保存规则,删除规则时请慎重

按照规则序号删除规则,删除指定表的指定链的指定规则,-D选项表示删除对应链中的规则。

命令语法:iptables -t 表名 -D 链名 规则序号

示例:iptables -t filter -D INPUT 3

上述示例表示删除filter表中INPUT链中序号为3的规则。

按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。

命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作

示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP

上述示例表示删除filter表中INPUT链中源地址为192.168.1.146并且动作为DROP的规则。

删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则,执行时需三思。

命令语法:iptables -t 表名 -F 链名

示例:iptables -t filter -F INPUT

删除指定表中的所有规则,执行时需三思。

命令语法:iptables -t 表名 -F

示例:iptables -t filter -F

###修改规则

注意点:如果使用-R选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。

修改指定表中指定链的指定规则,-R选项表示修改对应链中的规则,使用-R选项时要同时指定对应的链以及规则对应的序号,并且规则中原本的匹配条件不可省略。

命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作

示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT

上述示例表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT, -s 192.168.1.146为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0。

其他修改规则的方法:先通过编号删除规则,再在原编号位置添加一条规则。

修改指定表的指定链的默认策略(默认动作),并非修改规则,可以使用如下命令。

命令语法:iptables -t 表名 -P 链名 动作

示例:iptables -t filter -P FORWARD ACCEPT

上例表示将filter表中FORWARD链的默认策略修改为ACCEPT

###保存规则

保存规则命令如下,表示将iptables规则保存至/etc/sysconfig/iptables文件中,如果对应的操作没有保存,那么当重启iptables服务以后

service iptables save

注意点:centos7中使用默认使用firewalld,如果想要使用上述命令保存规则,需要安装iptables-services,具体配置过程请回顾上文。

或者使用如下方法保存规则

iptables-save > /etc/sysconfig/iptables

可以使用如下命令从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则。

iptables-restore < /etc/sysconfig/iptables

=4 iptables匹配条件总结之一=

(4)小结-匹配条件(一)

这篇文章中,我们主要总结了一些常用的"基础匹配条件",并且初步的认识了两个"扩展模块"以及这两个扩展模块中一些常用的扩展条件,为了方便以后回顾,我们将它们总结如下。

首先我们要明确一点,当规则中同时存在多个匹配条件时,多个条件之间默认存在"与"的关系,即报文必须同时满足所有条件,才能被规则匹配。

###基本匹配条件

-s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。

#示例如下 <br>
iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP <br>
iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT <br>
iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT

-d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。

#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT

-p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh)。

#示例如下
iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT

-i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。

#示例如下
iptables -t filter -I INPUT -p icmp -i eth4 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP

-o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。

#示例如下
iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP

###扩展匹配条件

我们来总结一下今天认识的两个扩展模块,以及其中的扩展条件(并非全部,只是这篇文章中介绍过的)

  • ####tcp扩展模块

常用的扩展匹配条件如下:

-p tcp -m tcp --sport用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

-p tcp -m tcp --dport用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

:22 匹配0~22端口

80: 匹配80~65535端口

  • ####multiport扩展模块

常用的扩展匹配条件如下:

-p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开

-p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开

#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

=5 iptables匹配条件之二(常用扩展模块)=

(5)小结-匹配条件(二)- 常用扩展模块

  • ###iprange模块

包含的扩展匹配条件如下

–src-range:指定连续的源地址范围

–dst-range:指定连续的目标地址范围

#示例
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP
iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP
  • ###string模块

常用扩展匹配条件如下

–algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。

–string:指定需要匹配的字符串

#示例
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
  • ###time模块

常用扩展匹配条件如下

–timestart:用于指定时间范围的开始时间,不可取反

–timestop:用于指定时间范围的结束时间,不可取反

–weekdays:用于指定"星期几",可取反

–monthdays:用于指定"几号",可取反

–datestart:用于指定日期范围的开始日期,不可取反

–datestop:用于指定日期范围的结束时间,不可取反

#示例
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT
  • ###connlimit 模块

常用的扩展匹配条件如下

–connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。

–connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对"某类IP段内的一定数量的IP"进行连接数量的限制,如果不明白可以参考上文的详细解释。

#示例
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT
  • ###limit模块

常用的扩展匹配条件如下

–limit-burst:类比"令牌桶"算法,此选项用于指定令牌桶中令牌的最大数量,上文中已经详细的描述了"令牌桶"的概念,方便回顾。

–limit:类比"令牌桶"算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。

#示例 #注意,如下两条规则需配合使用,具体原因上文已经解释过,忘记了可以回顾。
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT

=6 iptables扩展匹配条件之‘-tcp-flags’=

(6)小结-tcp扩展模块

结合之前的文章,我们把tcp模块的常用扩展匹配条件再总结一遍,方便以后回顾。

tcp扩展模块常用的扩展匹配条件如下:

--sport

[!] --source-port port[:port]

用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

#示例
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:25 -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

--dport

[!] --destination-port port[:port]

用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

#示例
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT

--tcp-flags

[!] --tcp-flags mask comp

用于匹配报文的tcp头的标志位

取值范围:(Flags: SYN ACK FIN RST URG PSH ALL NONE)

#示例
iptables -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
iptables -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT

上例中的"SYN,ACK,FIN,RST,URG,PSH SYN"表示,需要匹配报文tcp头中的"SYN、ACK、FIN、RST、URG、PSH"这些标志位,其中SYN标志位必须为1,其他的5个标志位必须为0。等价于"ALL SYN"

--syn

用于匹配tcp新建连接的请求报文,相当于使用"–tcp-flags SYN,RST,ACK,FIN SYN"

#示例
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT

=7 iptables扩展匹配条件之‘udp’和‘icmp’=

(7)小结-‘udp’和‘icmp’扩展模块

  • udp扩展

常用的扩展匹配条件

--sport:匹配udp报文的源地址

--dport:匹配udp报文的目标地址

#示例
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT
#可以结合multiport模块指定多个离散的端口
  • icmp扩展

常用的扩展匹配条件

--icmp-type:匹配icmp报文的具体类型

#示例
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT
iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT
# 匹配报文描述
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

--icmp-type 8/0表示匹配type为8,code为0的ICMP报文

附ICMP报文类型
在这里插入图片描述

=8 iptables扩展 模块之state扩展=

(8)小结-‘state’扩展模块

[!] --state [INVALID|ESTABLISHED|NEW|RELATED|UNTRACKED][,...]

对于state模块的连接而言,报文状态可以分为NEWESTABLISHEDRELATEDINVALIDUNTRACKED
NEW:连接中的第一个包
ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED
RELATED:从字面上理解RELATED译为关系,可以理解为后续正常的你来我往的报文
INVALID:包没有办法被识别
UNTRACKED:报文的状态为untracked时,表示报文未被追踪,无法找到相关的连接

一说到连接,你可能会下意识的想到tcp连接,但是,对于state模块而言的"连接"并不能与tcp的"连接"画等号,在TCP/IP协议簇中,UDP和ICMP是没有所谓的连接的,但是对于state模块来说,tcp报文、udp报文、icmp报文都是有连接状态的,我们可以这样认为,对于state模块而言,只要两台机器在"你来我往"的通信,就算建立起了连接。

# 示例
iptables -F
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -j REJECT
# 上述规则配完,只能我找别人,不允许别人找我

=9 iptables的黑白名单机制=

(9)小结-黑白名单机制

默认策略为ACCEPT是,拒绝规则就是黑名单
默认策略为DROP或REJECT时,通过规则就是白名单

=10 iptables自定义链=

(10)小结-自定义链

自定义链需要被连接使用,若没有被引用则不会生效
在这里插入图片描述

  • 创建自定义链
#示例:在filter表中创建IN_WEB自定义链
iptables -t filter -N IN_WEB
  • 引用自定义链
#示例:在INPUT链中引用刚才创建的自定义链
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
  • 重命名自定义链
#示例:将IN_WEB自定义链重命名为WEB
iptables -E IN_WEB WEB
  • 删除自定义链
    删除自定义链需要满足两个条件
    1、自定义链没有被引用
    2、自定义链中没有任何规则
#示例:删除引用计数为0并且不包含任何规则的WEB链
iptables -X WEB

=11 iptables之网络防火墙=

(11)小结-网络防火墙

1. 防火墙主机开启forward功能

#如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文。
#使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启
cat /proc/sys/net/ipv4/ip_forward
#使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效。
方法一:echo 1 > /proc/sys/net/ipv4/ip_forward
方法二:sysctl -w net.ipv4.ip_forward=1
#使用如下方法开启核心转发功能,重启网络服务后永久生效。
配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中将 net.ipv4.ip_forward设置为1

2. 网络防火墙主机配置FORWARD规则

#由于iptables此时的角色为"网络防火墙",所以需要在filter表中的FORWARD链中设置规则。
#可以使用"白名单机制",先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则。
#配置规则时需要考虑"方向问题",针对请求报文与回应报文,考虑报文的源地址与目标地址,源端口与目标端口等。
#示例为允许网络内主机访问网络外主机的web服务与sshd服务。
iptables -A FORWARD -j REJECT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT
 
#可以使用state扩展模块,对上述规则进行优化,使用如下配置可以省略许多"回应报文放行规则"。
iptables -A FORWARD -j REJECT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

一些注意点:

  1. 当测试网络防火墙时,默认前提为网络已经正确配置。
  2. 当测试网络防火墙时,如果出现问题,请先确定主机防火墙规则的配置没有问题。

=12 iptables动作总结之一=

(12)小结-动作总结之一 (ACCEPT、DROP、REJECT、LOG)

  • REJECT
    在这里插入图片描述

  • LOG
    在这里插入图片描述

# 示例
iptables -N hzw_input
iptables -I hzw_input -p tcp --dport 22 -m state --state NEW -j LOG --log-level 4 --log-prefix "hzw22 "

在这里插入图片描述

=13 iptables动作总结之二=

(13)小结-动作总结之二 (SNAT、DNAT、MASQUERADE、REDIRECT)

不管是SNAT还是DNAT,在报文交互过程中都存在SNAT和DNAT动作,那我们怎么区分整个过程是SNAT还是DNAT呢?

整个过程前半段使用哪个动作,整个过程就按哪个分类。前半段使用DNAT,那整个过程就称为DNAT;前半段使用SNAT,那整个过程就称为SNAT

  • 开启Linux主机的核心转发功能
# 开启转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 生效
sysctl -p

echo 1 > /proc/sys/net/ipv4/ip_forward
  • SNAT (Source Network Address Translation 源网络地址转换)

配置SNAT,可以隐藏网内主机的IP地址,也可以共享公网IP,访问互联网,如果只是共享IP的话,只配置如下SNAT规则即可

iptables -t nat -N hzw-nat
iptables -t nat -A POSTROUTING -j hzw-nat
iptables -t nat -I hzw-nat -s 192.168.33.0/24 -j SNAT --to-source 192.168.32.132

在这里插入图片描述
上图规则会将来自192.168.33.0/24网段的报文源地址改为192.168.32.132

  • MASQUERADE

如果公网IP是动态获取的,不是固定的,则可以使用MASQUERADE进行动态的SNAT操作,如下命令表示将192.168.40网段的报文源IP修改为eno33554984网卡中的可用地址

iptables -t nat -A HZWPOST -s 192.168.40.0/24 -o eno33554984 -j MASQUERADE
  • DNAT (Destination Network Address Translation 目标网络地址转换)

配置DNAT,可以通过公网IP访问局域网内的服务。
注:理论上来说,只要配置DNAT规则,不需要对应的SNAT规则即可达到DNAT效果。
但是在测试DNAT时,对应SNAT规则也需要配置,才能正常DNAT,可以先尝试只配置DNAT规则,如果无法正常DNAT,再尝试添加对应的SNAT规则,SNAT规则配置一条即可,DNAT规则需要根据实际情况配置不同的DNAT规则。

iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 公网端口 -j DNAT --to-destination 私网IP:端口号
iptables -t nat -I PREROUTING -d 公网IP -p tcp --dport 8080 -j DNAT --to-destination 192.168.50.133:80
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -j SNAT --to-source 公网IP
  • REDIRECT
    在本机进行目标端口映射时可以使用REDIRECT
# 本机80端口,会被映射到8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

&& SNAT和DNAT实战

环境准备

  • 拓扑结构
    在这里插入图片描述
    说明:拓扑中有两个网络段192.168.40.0/24和192.168.50.0/24,A和D两个主机分属于40和50网段无法直接通信,B主机作为网关有两个网卡一个网卡配置在40网段另一个网卡配置在50网段,A和D都可以和B通信,A和D若想通信就需要B的转发能力。
  • 网络配置
    在这里插入图片描述
    在这里插入图片描述

路由配置 B主机

# 创建自定义nat链: HZWPOST
[root@vm132 network-scripts]# iptables -t nat -N HZWPOST
# 在POSTROUTING链尾部引用HZWPOST
[root@vm132 network-scripts]# iptables -t nat -A POSTROUTING -j HZWPOST
# 配置SNAT策略,40网段的源报文更改源地址为B主机50网段地址
[root@vm132 network-scripts]# iptables -t nat -I HZWPOST -j SNAT -s 192.168.40.0/24 --to-source 192.168.50.132
# 开启转发功能
[root@vm132 network-scripts]# echo 1 > /proc/sys/net/ipv4/ip_forward

echo 1 > /proc/sys/net/ipv4/ip_forward
这样的设置只是一次性的。我们可以永久的设置成打开。如下:
将文件设置/etc/sysctl.conf:
net.ipv4.ip_forward = 1
如果已经将ip forwarding由0设置为1。为了使它生效。我们执行如下的命令。
sysctl -p /etc/sysctl.conf

RedHat中执行如下:
service network restart

Ubuntu/Debian系统则重启procps服务
/etc/init.d/procps.sh restart

抓包:
红框为40.131 ping 50.133(源地址有被转换),绿框为50.133 ping 40.131(源地址未被转换,为什么能成功??)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值