iptables

防火墙:是一种位于内部网络与外部网络之间的网络安全系统,工做于网络或主机的边缘(通讯报文的进出口),对于进出本网络或主机的报文根据事先定义的检查规则做匹配检测,对于可以被规则匹配到的报文作出相应的处理

Alt text

防火墙分类:

1:网络防火墙:整个网络的报文入口,出口 
2:主机防火墙:单台主机的报文入口,出口html


(二)防火墙入门web

前言:

Alt text

  • 什么是Netfilter
1:Netfilter是Linux 2.4.x引入的一个子系统,能够简单的将其看作内核的一个特殊的功能模块,它做为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的链接跟踪成为了可能。
 
2:netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每一个检测点上登记了一些处理函数进行处理。
 
3:netfilter的hooks 有5个,任何报文进入主机必须通过一个钩子函数或多个钩子
刚刚到达本机,没有通过路由的:prerouting
路由完毕以后,要到达本机内部的:input
经由本机转发的,不到本机内部的:forward
由本机内部发出的:output
即将由本机发出的:postrouting

Alt text

  • 什么是iptables
1:iptables就是在各个钩子上定义的规则,让每个钩子在处理报文的时候,有不一样的处理规则
 
2:iptables对于运维工程师而言,只是一个写规则的命令行工具
  • 报文进入主机以后,流经的路径
1:流入本机:prerouting –> input –> 用户空间请求报文
 
2:流出本机:用户空间响应报文 –> output –> postrouting
 
3:由本机转发的:prerouting –> forward –> postrouting
  • 防火墙规则的分类(也能够称之为功能表的分类)
1:filter:实现过滤,防火墙(默认)
 
2:mangle:将报文拆解,修改以后再封包
 
3:nat:网络地址转换,只拆解修改其地址的那一部分,通常是IP层地址和传输层地址
 
4:raw:关闭在nat表上启用的链接追踪机制
  • 防火墙链分类
1:内置链 (与netfilter的hooks函数一一对应,每个内置链对应于一个hooks函数,在内核中直接实现)
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
 
2:自定义链
对内置链进行扩充的,而定义在自定义链上的规则只有经过内置链的调用才能实现,能够实现更加灵活的规则管理机制
  • 防火墙功能表与防火墙内置链的对应关系(这里的表就是指下面的四种功能)
1:filter:INPUT , FORWARD , OUTPUT
 
2:mangle:PREROUTING , INPUT , FORWARD , OUTPUT , POSTROUTING
 
3:nat:PREROUTING ,INPUT, OUTPUT , POSTROUTING
 
4:raw:PREROUTING , OUTPUT

Alt text

  • 数据包过滤匹配流程
当报文从一个网络到达本地主机的网卡的时候,以及经过本地网卡须要发送出去的时候,会通过这么几个链
全部的报文到达网卡首先通过的是PREROUTING ,PREROUTING 而对应的会有三种功能,分别是 raw,mangle,nat(从上到下)。通过这三个功能以后,由路由进行选择,要么到达本机内部,要么通过本机转发,若是到达本机内部会到达 INPUT,而INPUT只能实现两种功能,mangle,filter。若是是通过本机转发的,会到达FORWARD,两种功能,mangle,filter。若是是由本机内部发出,会到达OUTPUT,四种功能,raw, mangle , nat, filter 。再经过路由选择出去到达OUTPUT,两种功能mangle, nat 。可是每个链上的规则可能只有一个或两个
  • 防火墙规则
组成部分:根据规则的匹配条件匹配报文,对应匹配到的报文使用定义的处理动做进行处理
匹配条件:
基本匹配
扩展匹配
 
处理动做:
基本的常见的处理动做
扩展处理动做
自定义处理动做

(三)TCP三次握手与四次断开(了解)算法

前言:

  • TCP 首部

Alt text

  • IP 首部

Alt text

  • 三次握手和四次断开

Alt text

(四)iptables 工具的使用详解(掌握)centos

试验建议:关闭CentOS 7 或 CentOS 6的防火墙 (systemctl stop firewalld ; systemctl disable firewalld 或 service iptables stop ; chkconfig iptables off)

# 在表的对应链上添加规则
iptables [-t table] {-A|-C|-D} chain rule-specification
# ipv6
ip6tables [-t table] {-A|-C|-D} chain rule-specification
# 在链中插入规则
iptables [-t table] -I chain [rulenum] rule-specification
# 修改对应链的规则
iptables [-t table] -R chain rulenum rule-specification
# 删除对应链上的规则
iptables [-t table] -D chain rulenum
# 显示链上的规则
iptables [-t table] -S [chain [rulenum]]
# 将链上的规则所有清除
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
# 增长一条自定义链
iptables [-t table] -N chain
# 删除一条自定义链
iptables [-t table] -X [chain]
# 修改链上的默认策略
iptables [-t table] -P chain target
# 重命名自定义链
iptables [-t table] -E old-chain-name new-chain-name
# 规则的格式
rule-specification = [matches...] [target]
# 匹配的格式
match = -m matchname [per-match-options]
# 处理的格式
target = -j targetname [per-target-options]
  • iptables命令格式(记牢,若是你在这里有点蒙的话,请不要急。稍后带你玩一玩你就懂了)
# -t 指定功能表,SUBCOMMAND其实就是各类选项,做用在哪一条链上 matches表示匹配规则,target表示处理的动做
 
iptables [-t table] SUBCOMMAND chain [matches...] [ -j target]
  • 将iptables命令逐一拆解分析
1:-t table 指定功能表
功能表有:raw , mangle , nat , filter,若是不指定,默认就是filter
 
 
2:SUBCOMMAND:指定在对应链上的增、删、改、查
(1)查看规则
-L:表示列出功能表对应链上的全部的规则
-n:以数字格式显示地址和端口,若是不加n选项,会反解主机名和端口对应的服务名
-v:显示详细格式
-x:显示计数器的精确值,每一条规则都有两类计数器,一类用于显示被匹配到的报文的个数,一类用于显示size
--line-numbers:显示链上的规则编号
 
(2)规则管理
-A :表示append 追加,默认为最后一个
-I: 表示insert插入,默认为第一个
-D:delete,删除
1:rule specification
2: rule number
-R: replace, 替换
-F:flush, 清刷链上的规则
-Z:zero,置0
-S:显示指定链的全部的规则,以iptables-save命令的格式显示
 
iptables的每一条规则有两类计数器
(1)由本规则匹配到的全部的packets
(2)由本规则匹配到的全部的bytes
 
 
(3)链管理
-N :新增一条自定义链
-X:删除自定义的空链
-E:rename,重命名自定义链的未被引用的链(引用计数器为0)
 
例如:iptables -N uplooking
例如:iptables -E uplooking mychain
例如:iptables -P FORWARD DROP
 
(4)默认策略管理
-P:设置默认策略
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
 
例如:iptables -P FORWARD DROP
例如:iptables -P INPUT DROP
  • 示例
例如:iptables -vnL -- line-numbers 查看filter表做用的链
 
例如:iptables -t nat - nL查看nat表对应的链
 
例如:iptables - N uplooking 增长一个自定义链
 
例如:iptables - E uplooking mychain 将自定义链 uplooking 更名为 mychain
 
例如:iptables -X mychain 删除自定义链,注意只有是空的链才能删除
 
例如:iptables -P FORWARD DROP 将FARWARD链的默认策略改成DROP
 
例如:iptables -P INPUT DROP 将INPUT的默认链改成DROP,这样的话,报文没法进入内核,不能被用户空间的服务接受,如ssh协议没法实现,远程没法链接
  • match匹配条件(实操第一部分:基本匹配)(很是重要,请务必认真听讲)
1:基本匹配: netfilter的hooks函数自带的匹配机制
[!] -s, --source address[/mask][,...]: 原地址匹配, ! 表示取反,表示不被匹配之意
[!] -d, --destination address[/mask][,...] :目标地址匹配,! 表示取反,表示不被匹配之意
[!] -i, --in-interface name:限制报文流入的接口匹配(入栈报文),只能因为:PREROUTING,INPUT,FORWARD
[!] -o, --out-interface name:限制报文流出的接口匹配(出栈报文),只能因为:OUTPUT,POSTROUTING, FORWARD
 
例如: iptables -A INPUT -s 192.168.10.223 -d 192.168.10.222 -j DROP 在INPUT链中添加一个规则,使得192.168.10.223的报文丢弃
例如: iptables -A INPUT -s 192.168.10.223 -d 192.168.10.222 -j ACCEPT 将192.168.10.223的报文接受,可是若是对于一个IP的规则只能作出一个动做,若是想从新设置须要将规则清空,使用iptables -F
  • match匹配条件(实操第二部分:隐式扩展匹配)(很是重要,请务必认真听讲)
2:扩展匹配:扩展模块匹配引入的匹配机制,-m matchname
隐式扩展:能够不使用-m选项专门的加载相应的模块,可是要加-p选项,指明使用哪一种协议
[!] -p {tcp|udp|icmp|icmpv6|esp|ah|sctp|mh|all}:限制协议,就不须要用-m指定加载的扩展模块
例如:iptables -A INPUT -s 192.168.10.223 -d 192.168.10.222 -p tcp -j ACCEPT 代表若是是tcp协议的放行
 
 
 
① tcp:隐含了-m tcp。 有专用选项
[!] --source-port,--sport port[:port]:匹配报文中的TCP首部的源端口,能够是端口范围
[!] --destination-port,--dport port[:port]:匹配报文中的TCP首部的目标端口,能够是端口范围
[!] --tcp-flags mask comp: 检查报文中的指明mask的TCP标志位,要这些标志位中comp必须为1,了解便可
[!] --syn:至关于--tcp-flags syn,fin,ack,rst syn,匹配三次握手的第一次,了解便可
 
例如: --tcp-flags syn,fin,ack,rst syn:指明这四个标志位中的syn必须为 1,而其余的为0,也就是TCP的第一次握手
例如:--tcp-flags syn,fin,ack,rst syn,fin:就是四次断开中的第一次
 
示例 1:指明开放tcp协议的80端口,也就是web服务
iptables -A INPUT -s 0/0 -d 192.168.10.222 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -s 192.168.10.222 -d 0/0 -p tcp --sport 80 -j ACCEPT
 
示例 2:指明开放TCP的22端口,也就是ssh服务
iptables -A INPUT -s 0/0 -d 192.168.10.222 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 192.168.10.222 -d 0/0 -p tcp --sport 22 -j ACCEPT
 
 
② udp:隐含了-m udp。有专用选项
[!] --source-port,--sport port[:port] :匹配报文中的udp首部的源端口,能够是端口范围
[!] --destination-port,--dport port[:port]:匹配报文中的udp首部的目标端口,能够是端口范围
 
 
③ icmp:隐含指明了”-m icmp”。有专用选项
[!] --icmp-type {type[/code]|typename}
type/code有两种类型:
0/0 :echo reply 指明应答的类型
8/0:echo request 指明请求的类型
示例 1:开放别人能够ping本身
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -s 192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT
示例 2:开放本身能够ping别人
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -s 192.168.10.222 -p icmp --icmp-type 8 -j ACCEPT
  • match匹配条件(实操第三部分:显示扩展匹配)(很是重要,请务必认真听讲)
显示扩展:必须使用-m加载扩展模块
 
1:multiport :多端口匹配,离散的方式定义的多端口匹配,最多能够指定15个端口
[!] --source-ports,--sports port[,port|,port:port]...:指定源端口
[!] --destination-ports,--dports port[,port|,port:port]...:指定目标端口
[!] --ports port[,port|,port:port]...:能够指定源端口和目标端口
 
例如:同时开放 22和80端口
iptables -I INPUT -s 0/0 -d 192.168.10.222 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 192.168.10.222 -d 0/0 -p tcp -m multiport --sports 22,80 -j ACCEPT
 
 
2:iprange :指明一段连续的IP地址范围,做为源地址或目标地址的匹配
[!] --src-range from[-to]:指定源地址范围
[!] --dst-range from[-to]:指定目标地址范围
 
例如:指定客户端 ip在192.168.10.1-192.168.10.254范围内的才能访问telnet服务
iptables -A INPUT -d 192.168.10.222 -p tcp --dport 23 -m iprange --src-range 192.168.10.1-192.168.10.254 -j ACCEPT
iptables -A OUTPUT -s 192.168.10.222 -p tcp --sport 23 -m iprange --dst-range 192.168.10.1-192.168.10.254 -j ACCEPT
 
3:string:对报文中的应用层数据作字符串匹配检测
--algo {bm|kmp}
[!] --string pattern :给定要检查的字符串模式
[!] --hex-string pattern:给定要检查的字符串模式,十六进制编码
例如:只要页面中包含admin的页面都不能访问
iptables -I OUTPUT -s 192.168.10.222 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "admin" -j REJECT
 
4:time:收到报文的时间/日期与指定到的时间/日期作匹配
--datestart YYYY[-MM[- DD[Thh[:mm[:ss]]]]]:起始日期时间
--datestop YYYY[-MM[- DD[Thh[:mm[:ss]]]]]:结束日期时间
--timestart hh:mm[: ss]:以天为单位的起始时间
--timestop hh:mm[: ss]:以天为单位的起始时间
[!] --monthdays day[,day...]:匹配一个月中的哪天
[!] --weekdays day[,day...]:匹配一个周中的哪天
例如:指定客户端 IP范围和访问时间才能访问
iptables -I INPUT -d 192.168.10.222 -p tcp --dport 23 -m iprange --src-range 192.168.10.1-192.168.10.254 -m time --timestart 08:00:00 --timestop 018:00:00 -j ACCEPT
 
5:connlimit:根据每一个客户端主机作并发并发链接数量限制,就是每一个客户端最多发起的链接数量
--connlimit-upto n:链接数量小于等于n,则匹配
--connlimit-above n:链接数量大于n,则匹配
例如:
iptables -A INPUT -s 0/0 -d 192.168.10.222 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
iptables -A OUTPUT -s 192.168.10.222 -d 0/0 -p tcp --sport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
 
6:limit:基于令牌桶算法对报文的速率作匹配。
--limit rate[/second|/minute|/hour|/day] :限制等待的速率, 也就是接受或响应数据包的速率
--limit-burst number:第一次能够有多少个不须要等待的
例如:这里是限制每分钟只能入栈 20个icmp的报文,而且第一次入栈容许5个不须要等待,后续的报文每次须要等待2秒
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 5 -j ACCEPT
iptables -A OUTPUT -s 192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT
 
7:state:用于对报文状态判断
[!] --state state:匹配报文的状态
INVALID :没法识别的链接
ESTABLISHED:链接追踪模块中存在记录的链接
NEW:链接追踪模板当中不存在的链接请求
RELATED:相关联的链接
UNTRACKED:未追踪的链接
例如 1:容许本身ping别人
iptables -A OUTPUT -s 192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
 
例如 2:容许别人ping本身
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.10.222 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
 
8:对于链接追踪还需了解的知识
已经追踪到的并记录下来的链接保存在 /proc/net/nf_conntrack里面
若是追踪的记录满载了,就会显示链接超时
链接追踪功能所可以记录的最大链接数量保存在 (可调整)/proc/sys/net/nf_conntrack_max
这里能够经过命令调节内核中的参数
sysctl -w net.nf_conntrack_max= 300000 将最大的追踪记录调节到300000个
conntrack所能追踪的链接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定,已经追踪的链接位于/proc/net/nf_conntrack文件中,超时的链接会被删除,当模板满载,后续的新链接有可能会超时。解决办法:
1)加大nf_conntrack_max的值
2)下降nf_conntrack条目的超时时长
不一样协议的链接追踪时长定义在/proc/sys/net/netfilter下
  • target处理动做(实操第四部分:处理动做)(很是重要,请务必认真听讲)
-j ACTION [per-target-options]
ACCETP , DROP , REJECT
RETURN :返回调用的链
REDIRECT:端口重定向
LOG:日志
MARK:防火墙标记
DNAT:目标地址转换
SNAT:原地址转换
MASQUERADE:地址假装

(五)防火墙规则书写注意点小结(掌握)安全

 

  • 书写规则时的几个注意点
1)匹配规则越严格的须要放在越上面,越松散的放在越下面
2)规则的检查次序:规则在链上的次序即为检查时生效的次序,所以,其优化使用有必定的法则
1:同类规则(访问同一个应用),匹配范围小的放在前面,用于特殊处理
2:不一样类的规则(访问不一样的应用),匹配范围大的放在前面,也就是规则被报文匹配次数多的放在前面
3:应该将那些由一条规则描述的多个规则合并为一个规则,这样使得规则查询的效率提升
  • 防火墙规则优化实战示例
1:开放ssh、web、telnet服务
 
# 因为 ESTABLISHED会常常被访问,所以写在第一个
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
 
# 特定的服务开放
iptables -A INPUT -d 192.168.10.222 -p tcp -m multiport --dports 22,80,23 -m state --state NEW -j ACCEPT
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
 
# 全部的入栈报文,出栈所有被容许
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
 
 
 
 
 
2:开放ftp、ssh、web、telnet服务
思考:对于ftp服务来讲,有两个端口, 20、21,若是想使用RELATED关联追踪,应该让内核加载nf_conntrack_ftp模块
 
# 内核加载nf_conntrack_ftp模块
modprobe nf_conntrack_ftp
 
# 放行了ftp协议的数据链接的端口,因为端口是随机的,因此不要给定端口号,而且指明链接追踪是related和established
iptables -A INPUT -d 192.168.10.222 -m state --state RELATED,ESTABLISHED -j ACCEPT
 
# 特定的服务开放
iptalbes -A INPUT -d 192.168.10.222 -p tcp -m miltiport --dports 22,23,80,21 -m state --state NEW -j ACCEPT
iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
 
# 全部的入栈报文,出栈所有被容许
iptables -A OUTPUT -s 192.168.10.222 -m state --state ESTABLISHED -j ACCEPT

(六)如何保存写好的防火墙规则(掌握)服务器

 

  • 保存规则的方法
CentOS 6:
1)service iptables save
2)iptables-save > /etc/sysconfig/iptables (也能够重定向保存至任意位置)
 
 
CentOS 7:
1)iptables -S > 指定保存规则的文件路径
2)iptables-save > 指定保存规则的文件路径
  • 让内核加载写好的规则
CentOS 6和CentOS 7:
iptables-restore < 指定保存规则的文件路径
 
CentOS 6:会自动从/etc/sysconfig/iptables重载规则
service iptables restart
  • 若是自动生效规则文件中的规则
1)把iptables命令放在脚本文件中,让脚本文件开机自动运行
/etc/rc.d/rc .local 中写入执行iptables的命令的脚本
 
2)将保存的规则经过脚本命令自动开机重载
/etc/rc.d/rc .local 中 写入 iptables-restore < 指定保存规则的文件路径

(七)如何搭建网络防火墙(掌握)网络

 

Alt text

(八)另外几个规则处理动做(了解)架构

 

  • LOG
--log-level level :设定日志级别
emerg, alert, crit, error, warning, notice, info or debug.
--log-prefix prefix :添加日志行前缀
 
例如:iptables -I FORWARD -s 192.168.23.0/24 -p tcp -m multiport --dports 80,22,21,23 -m state --state NEW -j LOG --log-prefix "firewall connection:"
开启日志功能,而且制定日志行的前缀
 
日志记录的文件为/var/log/messages 内核日志
  • RETURN
返回调用者:不少时候均可以不用写明,其会隐含的
应用场景:就是内置链调用外链的时候,外链没有匹配到规则会直接返回
 
例如:
iptables -N in_stack
iptables -N out_stack
iptables -A in_stack -p icmp --icmp-type 8 -j ACCEPT
iptables -A out_stack -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -j in_stack
iptables -A OUTPUT -j out_stack
 
其余主机ping下本主机
  • REDIRECT
这个只能用在nat表上的PREROUTING和OUTPUT链上,可以实现指明的端口完成映射
--to-ports port[-port]:将端口转变为其余的端口
 
例如:iptables -t nat -A PREROUTING -d 192.168.10.223 -p tcp --dport 80 -j REDIRECT --to-ports 8000 这里将prerouting链上的80端口转发为8080端口,使得监听在8000的httpd服务能够监听到,这就是一个简单的引用场景

(九)NAT(掌握)并发

前言1:经过路由功能使得报文在非本地局域网内通讯时,报文到达时,显示的是报文的原始IP地址。在正常路由模型下,报文外封装一个http首部,再封装一个TCP首部(主要是源端口和目标端口),再封装一个IP首部(主要是源IP和目标IP),若是须要路由转发,会在外面封装一个Mac地址(源Mac和目标Mac),那么整个路由的过程就是一个Mac地址解封装的过程,知道最后一个目标Mac的主机,发现目标IP是本身,目标端口也是本身,所以,拆包以后,源端口和目标端口以及源IP和目标IP都不变,这就是路由的地址转换模型
前言2 :整个互联网就是经过一个一个的公网地址组成的局域网经过层层路由器链接而成的,那么一个私网的IP访问公网的IP时,能够经过层层的路由器到达公网的IP上,必定会有网关将其转发到公网上的,其网关必定有一个接口是公网地址,可是公网的IP响应私网的IP是不会进行公网的路由的,公网IP只会其内部的局域网寻找这台私网的IP主机,若是找不到就会丢弃的,那么私网的客户端就没法得到公网响应的报文。那么若是解决这个问题呢?因为私网IP的网关必定有一个接口是公网地址,那么在离公网最近的网关上把报文的原地址改成公网接口的地址,而目标地址不变,所以在目标主机收到报文的时候发现原地址是公网地址,所以能够经过路由转发出去,目标IP就会响应给公网地址,而不会私网地址,在响应报文到达公网地址的时候(进入公网的网关)会将响应报文里面的目标地址改成私网的地址,原地址不变,响应给私网地址。这就实现了私网地址能够访问公网了,这就是SNAT,原地址转换
前言3:若是客户端请求访问的是本地的服务器,那么在客户端与本地服务器之间须要经过目标地址转换,来隐藏本地服务器地址,当客户端访问本地主机的时候,并非直接访问本地主机的,请求报文中的源IP为客户端IP,目标IP为一个公网的IP,这个公网IP的主机上还会有一个私网的IP,私网的IP就经过nat机制,将目标地址改成了服务器的IP地址。那么当服务器接到请求以后,就会将响应报文的原地址为服务器本身的地址,目标地址为外网防火墙主机的地址,当报文到达公网的网关后,网关就会发现这是改过的地址,将报文的原地址改成网关本身的地址,目标地址为客户端地址,就是现实了本地主机的地址的隐藏,那么这一台公网地址转发的服务器就是负载均衡器,这就是DNAT,目标地址转换

Alt text

  • SNAT:source NAT
修改 IP报文中的源IP地址
让本地网络中的主机可使用同一的地址与外部通讯,从而实现地址假装
请求:由内网主机发起,修改源 IP,如何修改由管理员定义
响应:修改目标 IP,由nat自动根据会话表中的追踪机制实现相应的修改
  • DNAT:destination NAT
修改 IP报文中的目标IP地址
让本地网络中的服务器使用统一的地址向外提供服务,可是隐藏了本身的真实地址
请求:由外网主机发起,管理员负责修改其目标地址
响应:修改原地址,由nat自动根据会话表中的追踪机制实现相应的修改
PNAT:port NAT
现实端口转发
  • 实现SNAT规则
This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
 
--to-source [ipaddr[-ipaddr]][:port[-port]] :指定修改的源 IP(外网IP地址)
 
例如:这里指明了通过路由以后的源 IP地址
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -d 0/0 -j SNAT --to-source 192.168.10.222
  • 实现MASQUERADE
This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: 当外网地址是拨号上网的时候,外网地址持续变化,用户替换的时候,用于替换SNAT,所以, SNAT只用于静态IP
 
例如:若是用户外网地址是动态的,可使用MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE

小结:SNAT和MASQUERADE都是实现了内网的客户端能够上网,访问公网的主机,若是关闭的话,内网客户端的请求到达了公网IP也不会被路由回来了,由于公网的路由不会转发目标地址是私网的报文app


  • 实现DNAT规则
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
 
 
--to-destination [ipaddr[-ipaddr]][:port[-port]] : 指定须要改变的目标 IP(内网IP地址)
 
 
例如:
iptables -t nat -A PREROUTING -s 0/0 -d 192.168.10.222 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22
或者修改 IP和端口:
iptables -t nat -A PREROUTING -s 0/0 -d 192.168.10.222 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
相关文章
相关标签/搜索