Linux防火墙之iptables常用扩展处理动作

  前文我们讲了iptables的扩展匹配,一些常用的扩展模块以及它的专有选项的使用和说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12285152.html;今天我们来说说iptables的处理动作;iptables的处理动作分基本处理动作和扩展处理动作,基本处理动作有ACCEPT和DROP 这两个动作很好理解,一个表示放行操作,一个表示丢弃操作。扩展处理动作有REJECT,这个动作表示拒绝,通常情况下建议都用DROP 去丢弃不想通过的报文,REJECT这个处理动作,它表示明确的拒绝,并且它会给拒绝的报文一个回应消息;RETURN表示返回,RETURN常用于自定义链上,用于返回主链。接下来我们一一来介绍LOG、SNAT、DNAT、MASQUERADE、REDIRECT这些扩展处理动作的用法,以及一些常用选项的说明;

  基本处理动作这里就不多说了,无外乎就是放行和丢弃操作。想必大家都会用,这里着重介绍扩展处理动作的用法,废话不多说,下面我们来看看扩展处理动作的用法。

  1、LOG,此处理动作用于记录日志,它可以帮我们哪些报文来请求过我们服务器,并通过日志的形式记录到日志文件中。默认情况LOG处理动作将日志记录在/var/log/messages系统日志中(事实上它是把日志交给rsyslog,如果我们没有更改rsyslog的配置,默认是记录到/var/log/messages);它是非中断处理动作,也就是说它本身不做允许或拒绝操作,为了能匹配更多的报文,我们可以把此处理动作规则放在那些允许和拒绝规则之前,这样一来就可以记录来访我们服务器的报文在允许或拒绝之前的所有报文,方便日后分析日志。

  --log-level level ,此选项表示定义日志的级别,这个日志级别同rsyslog的日志级别类似,日志级别有debug、info、notice、warning、error、crit、alert、emerg,有关日志级别的说明请参考https://www.cnblogs.com/qiuhom-1874/p/12091118.html

  --log-prefix prefix,此选项表示定义日志的前缀信息,用于区别不同的日志,最多29个字符

  示例,记录来访本机的80端口的报文日志,日志级别是info,日志前缀为“web log”

[root@test ~]# iptables -nvL
Chain INPUT (policy DROP 241 packets, 19880 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  772  108K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
   65  3920 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,3306,41319 state NEW
   35 13283 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 2 packets, 144 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  847  269K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
   23  1604 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
[root@test ~]# iptables -I INPUT 1 -p tcp --dport 80 -j LOG --log-level info --log-prefix "web log" 
[root@test ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 LOG flags 0 level 6 prefix "web log"
 1000  124K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
   65  3920 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,3306,41319 state NEW
   35 13283 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  993  284K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
   23  1604 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
[root@test ~]#

  测试:我们用本机访问80端口,看看/var/log/messages系统日志会不记录我们访问80端口的报文

[root@test ~]# curl -I http://192.168.0.99/loganalyzer
HTTP/1.1 301 Moved Permanently
Date: Sun, 09 Feb 2020 05:58:40 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Location: http://192.168.0.99/loganalyzer/
Content-Type: text/html; charset=iso-8859-1

[root@test ~]# curl -I http://192.168.0.99/loganalyzer
HTTP/1.1 301 Moved Permanently
Date: Sun, 09 Feb 2020 05:58:48 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Location: http://192.168.0.99/loganalyzer/
Content-Type: text/html; charset=iso-8859-1

[root@test ~]# tail  /var/log/messages
Dec 24 21:43:07 test systemd: Started System Logging Service.
Dec 24 23:26:04 test systemd: Stopping System Logging Service...
Dec 24 23:26:04 test rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-41.el7_7.2" x-pid="16136" x-info="http://www.rsyslog.com"] exiting on signal 15.
Dec 24 23:26:04 test systemd: Stopped System Logging Service.
Dec 24 23:26:04 test systemd: Starting System Logging Service...
Dec 24 23:26:04 test rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-41.el7_7.2" x-pid="16359" x-info="http://www.rsyslog.com"] start
Dec 24 23:26:04 test rsyslogd: action '*' treated as ':omusrmsg:*' - please use ':omusrmsg:*' syntax instead, '*' will not be supported in the future [v8.24.0-41.el7_7.2 try http://www.rsyslog.com/e/2184 ]
Dec 24 23:26:04 test systemd: Started System Logging Service.
Dec 24 23:26:04 test rsyslogd: error during parsing file /etc/rsyslog.conf, on or before line 76: warnings occured in file '/etc/rsyslog.conf' around line 76 [v8.24.0-41.el7_7.2 try http://www.rsyslog.com/e/2207 ]
Dec 24 23:26:13 test-node1 qiuhom: i am test-node1
[root@test ~]# 

  提示:我们访问两次,在/var/log/messages系统日志文件中却没有记录我们访问80端口的报文日志,这是为什么呢?防火墙规则写的不对吗?我们来看看我们防火墙规则是否匹配到报文?

    提示:我们查看防火墙规则,我们刚才写的规则是匹配到有规则呀,但是/var/log/messges日志文件中为什么没有记录呢?我们在来看看rsyslog的配置文件吧

     提示:看了rsyslog的配置文件终于明白了,防火墙把日志交给rsyslog,rsyslog它的配置文件中定义了把任何设施级别为info的日志都存放在数据库里了。那我们来看看数据库里是否有呢

    提示:本人用的是rsyslog的前端展示工具loganalyzer,这个工具本质就是把rsyslog日志从数据库里读出来,然后展示给用户。我们从上面的信息可以看到我们用本机去访问80端口的报文日志,以及我们定义的日志前缀。从上面的日志信息我们还了解到,我们数据报文所走的流入接口是lo,日志的facillity是KERN(内核)。

  当然我们还可以基于某种报文的状态来记录日志,例如,我们就只想记录状态为NEW的报文

[root@test ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  368 71198 LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 LOG flags 0 level 6 prefix "web log"
 4227  656K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
  127  7438 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,3306,41319 state NEW
   35 13283 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 20 packets, 1430 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 4130 1134K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
   53  3418 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
[root@test ~]# iptables -R INPUT 1 -p tcp -m state --state NEW -j LOG --log-level info --log-prefix "status NEW"  
[root@test ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW LOG flags 0 level 6 prefix "status NEW"
 4304  662K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
  127  7438 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,3306,41319 state NEW
   35 13283 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 4196 1141K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
   53  3418 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
[root@test ~]# 

  提示:我们把原来的规则给更改成状态为NEW的是访问我本机说明服务都给记录下来

  测试,我们用192.168.0.151 去访问我们的web服务,我们在loganalyzer里看看,有没有记录到状态为NEW的报文日志

    提示:从上面的信息看,我们是匹配到了两个包,我们在loganalyzer里在看看呢

    提示:可以看到loganalyzer里是记录了我们用192.168.0.151 访问80端口且状态为NEW的报文

   2、NAT它的全称是network address translation,意思是网络地址转换,不难理解此处理动作用于转换地址所用的处理动作,它通常用于PREROUTING,INPUT,OUTPUT,POSTROUTING这四个主链上。我们可以用iptables -t nat -nvL 命令来查看nat表所在的所有链的规则情况,从而知道nat表的规则只用于这四个主链上。

  SNAT,此处理动作表示源地址转换,通常在POSTROUTING链上做SNAT,主要作用是让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装。

    提示:SNAT的TOP图如上所示,内网主机要上互联网,必须通过防火墙将其源地址更改为能够访问互联网的ip地址FWIP0。报文走向流程是这样的,内网主机向远端服务器发送请求,其报文段源IP是内网主机本身的ip,目标ip是远端服务器的ip,当报文到达防火墙时,防火墙一看,目标地址不是自己,然后它就把报文通过路由从FORWARD链上给转发出去了,在报文通过FORWARD链后,我们就要在防火墙的POSTROUTING链上明确说明,源地址为172.16.0.0/16的报文,访问外部主机,必须给修改成192.168.0.11,也就是防火墙能够上互联网的IP ,这样一修改后,从防火墙出去的报文源IP就是防火墙的外网IP(FWIP0),通过互联网的层层路由报文终于到达了目标服务器,目标服务器收到报文,一看是访问它本机的,然后它就把报文给拆了,拿到客户端请求的内容,然后它就开始响应客户端,响应时,它把自己的SIP当源地址,FWIP0即防火墙外网ip当目标ip给封装好,从自己的网卡发出去,同样回来的报文,通过互联网的层层路由,相应报文到达防火墙后,一看是自己的报文,然后它就把响应报文给收下了,然后它会去查它本机自动维护的一个NAT表,这个表记录着那个客户端的源地址,源端口,和目标地址,目标端口等信息的一个对应表,它一看源IP为172.16.0.10源端口为55114的客户端主机,请求了192.168.0.20的80端口,然后对比自己收到的报文,它就把自己刚才收到的源地址为192.168.0.20源端口为80的报文给修改成源地址为192.168.0.20,源端口为80,目标地址为172.16.0.10目标端口为55114,然后通过FORWARD链把报文发送给客户端,客户端收到防火墙发来的报文,然后拆开数据包拿到服务器的响应。这就是SNAT报文从客户端到远端服务端,服务端响应回来的报文过程。这里需要注意一点的是,服务端响应回来的数据包到达防火墙,防火墙修改目标地址的过程是NAT自身的功能,我们不需要做额外的配置,换句话说我们只关心出去的报文就行,回来的报文NAT会自动维持一个NAT会话表,自动把响应报文修改成我们客户端的ip发送给客户端。

  了解了SNAT的报文走向,接下来我们来配置防火墙,让其内部主机能够通过SNAT去访问远端服务器

    提示:在内网主机上我们ping远端服务器上ping 不通的

    提示:在防火墙主机上是可以正常访问远端服务器

  接下来我们要在防火墙主机上打开转发,并在其防火墙的POSTROUTING做SANT ,把172.16.0.0/16的源地址更改为192.168.0.11

[root@test-centos6-node1 ~]# cat /proc/sys/net/ipv4/ip_forward    
0
[root@test-centos6-node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@test-centos6-node1 ~]# cat /proc/sys/net/ipv4/ip_forward
1  
[root@test-centos6-node1 ~]# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@test-centos6-node1 ~]# iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -j SNAT --to-source 192.168.0.11 
[root@test-centos6-node1 ~]# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  *      *       172.16.0.0/24        0.0.0.0/0           to:192.168.0.11 

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@test-centos6-node1 ~]# 

  提示:SNAT 只能在nat表上做,我们开启了防火墙的核心转发,同时在POSTROUTING链上的nat表上添加了一条 源地址为172.16.0.0/16网段的主机通过时,我们就将其源地址更给为192.168.0.11,接下来我们在内网主机上访问远端服务器看看是不是能够访问呢

    提示:可以看到内网主机上可以正常的访问远端服务器了

  我们在防火墙上抓包看看,数据报文的走向

    提示:我们可以看到,当报文到达eth1时,源ip和目标ip都未发生改变。经过eht1到达eth0时,报文段源ip变成了192.168.0.11,目标ip没有发生变化还是192.168.0.20.服务端收到报文响应回来在防火墙,eth0相应报文段源ip是192.168.0.20,目标IP是192.168.0.11,响应报文通过eth0后,到达eth1响应报文的源ip没有发生变化还是192.168.0.20,目标ip却变成了172.16.0.10,通过这一过程,想必大家对SNAT的工作机制有了很好的了解。

  --to-source [ipaddr[-ipaddr]][:port[-port]],此选项表示指定SNAT后的源地址,它可以说一个网络地址范围,当防火墙上有多个外网ip时 我们可以指定其一个网络地址范围;如下

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9

  提示:以上规则表示在POSTROUTING 链上的nat标上增加一条源地址为10.0.1.0/24的ip地址 目标地址非10.0.1.0/24的ip地址,都做源地址转换,转换源地址为172.18.1.6-172.18.1.9,这样设置规则后,当报文匹配到后,防火墙会在172.18.1.6-172.18.1.9中顺序去转换源地址,也就说第一个报文来了,它会把源地址更改为172.18.1.6,第二个报文来了它会把源地址更改为172.18.1.7,依次轮循。

  --random 此选项会任意的从地址池里任意挑选一个给客户端请求报文做源地址转换。

  --persistent 此选项会从地址池中轮询的方式给客户端固定其转换后的源地址,比如第一个客户端报文来了,第一次防火墙会把172.18.1.6这个地址做SNAT给第一个客户端,其后只要是同一客户端,它都会拿这个地址给做SNAT,同理第二个客户端第一次做地址转换后的地址是172.18.0.7,那么它后面不管第几次来,都会被转换成172.18.0.7这个地址。通常情况--random和--persistent这两个选项用得很少。

  DNAT,此处理动作表示目标地址转换,通常在PREROUTING链上做DNAT,主要作用是把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP。

      提示:DNAT的TOP图如上所示,客户端要访问远端服务器,通过互联网层层路由,到达服务器所在网络的防火墙上,当防火墙收到来自客户端的请求报文,在入站的一瞬间,我们需要在防火墙的PREROUTING链上配置其目标地址为192.168.0.11,目标端口为21的报文,把其目标地址更改为172.16.0.12,端口更改为80。(这里的端口可以修改也可不修改,这个要看自己的环境,我这里以要修改端口为例)因为在入站的最开始就把目标地址给转换为后端服务器的地址后,修改后的报文就不会到防火墙的INPUT链上去了,它会直接通过FORWARD链从POSTROUTING链出去,最后报文到达对应的服务器网卡上,服务器收到来自客户端的请求报文,一看是自己的ip,然后就拆报文,然后响应客户端,封装回应报文,此时,服务器会把自己的IP地址封装成源ip,客户端的ip封装成目标ip然后发出去,当响应报文来到防火墙时,防火墙收到服务端的响应报文,一看源地址是服务端的,这个时候它会像SANT一样,它本身也维护了一张nat会话表,这个表记录了源ip 源端口 目标ip 目标端口 更改后的目标地址ip 更改后的目标端口等等信息,防火墙一查自己的NAT会话表,一看有一条源地址是192.168.0.10 源端口为52113 目标地址为192.168.0.11 目标端口为21的记录,然后对比自己刚才收到的报文,它就会把响应报文修改源地址和源端口,把响应报文的源地址,修改成之前客户端请求的目标地址,把响应报文里的源端口修改成客户端之前请求的目标端口,然后再发送给客户端,当客户端收到响应报文时,一看目标地址是自己,然后客户端就开始拆包,从而得到服务端的响应内容。DNAT和SNAT是类似的,回来的响应报文做源地址转换时DNAT自己根据记录的nat会话表更改,这个是NAT自身的连接追踪功能呢,我们不需要手动配置。也就是说做目标地址转换我们只关心把目标地址更换成那个,后续的响应报文会自动的做源地址转换。

  了解了DNAT的报文流向,接下来我们就以上面的TOP图来准备环境,实现DNAT

   在没有配置防火墙规则时,我们客户端直接访问192.168.0.11看看能不能访问到后端服务?

  提示:在防火墙上没有配置DNAT规则时,我们可以看到客户端主机上没有办法访问到后端服务的,防火墙是可以正常访问后端服务的

  在防火墙上添加规则,访问 192.168.0.11的报文都把其目标地址更改为172.16.0.12

[root@test-centos6-node1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:c8:fe:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fec8:fe46/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:c8:fe:50 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.11/16 brd 172.16.255.255 scope global eth1
    inet6 fe80::20c:29ff:fec8:fe50/64 scope link 
       valid_lft forever preferred_lft forever
[root@test-centos6-node1 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 3 packets, 180 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

Chain OUTPUT (policy ACCEPT 1 packets, 60 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@test-centos6-node1 ~]# iptables -t nat -A PREROUTING -d 192.168.0.11 -j DNAT --to-destination 172.16.0.12
[root@test-centos6-node1 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       all  --  *      *       0.0.0.0/0            192.168.0.11        to:172.16.0.12 

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

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@test-centos6-node1 ~]# 

  测试:用客户端访问 192.168.0.11 看看能不能访问到后端的服务?

    提示:可以看到在防火墙添加规则后,客户端就可以访问到后端的服务了,我们在防火墙上抓包看看,报文的走向

    提示:可以看到当客户端向服务端发起请求时,客户端请求报文到达防火墙的eth0时源ip是192.168.0.10 目标ip是192.168.0.11,当报文到达eth1时,报文的源ip还是192.168.0.10 目标ip却变成了172.16.0.12,当然服务端响应报文的到达eth1时,它的源ip是172.16.0.12 目标ip是192.168.0.10,当响应报文从eth1到eth0时,它的源ip变成了192.168.0.11,目标ip变成了192.168.0.10。这就是我们说的DNAT 它响应报文会根据自己维护的nat会话表里的数据,来自动作源地址转换。

  3、MASQUERADE:此处理动作用于源地址转换的场景,在做源地址转换时,我们转换后端源地址经常发生变化,如动态IP,如拨号网络。在这样的网络环境中我们做源地址转换就可以使用这个动作,它的工作流程是没做一次源地址转换它就要去扫描一下可用的IP和端口,然后再做源地址转换。

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE

  提示:以上规则表示,在POSTROUTING链上的nat表上增加一条规则,匹配源地址为10.0.1.0/24网络里的ip地址,且目标地址不是10.0.1.0/24的网段的ip地址时,就做源地址转换,这个源地址具体转换成那个,这个就要看报文通过时扫描出来的对外地址是多少就转换成多少。

  4、REDIRECT,此动作用于PREROUTING OUTPUT 链上的nat表上,主要用于通过改变目标IP和端口,将接受的包转发至不同端口,通常用于端口映射。

  --to-ports port[-port],此选项表示指定要使用的目标端口或端口范围,如果不指定,目标端口是不会发生变化的,并且这个仅用于协议为tcp、udp、dccp、sctp

   测试,把本机httpd服务监听端口更改为8080,然后客户端通过访问80,在其防火墙上对来访的80端口的报文加以更改目标端口为8080

    提示:在防火墙上没有添加任何规则是,我们客户端只能通过8080去访问服务端,现在我们在防火墙上增加一条规则,让其来访80的端口的报文,去访问8080

[root@test ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 8 packets, 396 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 5 packets, 300 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

Chain POSTROUTING (policy ACCEPT 4 packets, 336 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@test ~]# iptables -t nat -A PREROUTING  -d 192.168.0.99 -p tcp --dport 80 -j REDIRECT --to-ports 8080
[root@test ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            192.168.0.99         tcp dpt:80 redir ports 8080

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@test ~]# 

  测试:用客户端去访问192.168.0.99的80端口,看看是不是能够访问到8080所对应的服务

    提示:可以看到客户端去访问80端口和访问8080端口的服务都是一样的内容。

posted @ 2020-02-09 22:52  Linux-1874  阅读(1143)  评论(0编辑  收藏  举报