前文咱们讲了iptables的扩展匹配,一些经常使用的扩展模块以及它的专有选项的使用和说明,回顾请参考http://www.javashuo.com/article/p-vfhrxjrp-bc.html;今天咱们来讲说iptables的处理动做;iptables的处理动做分基本处理动做和扩展处理动做,基本处理动做有ACCEPT和DROP 这两个动做很好理解,一个表示放行操做,一个表示丢弃操做。扩展处理动做有REJECT,这个动做表示拒绝,一般状况下建议都用DROP 去丢弃不想经过的报文,REJECT这个处理动做,它表示明确的拒绝,而且它会给拒绝的报文一个回应消息;RETURN表示返回,RETURN经常使用于自定义链上,用于返回主链。接下来咱们一一来介绍LOG、SNAT、DNAT、MASQUERADE、REDIRECT这些扩展处理动做的用法,以及一些经常使用选项的说明;html
基本处理动做这里就很少说了,无外乎就是放行和丢弃操做。想必你们都会用,这里着重介绍扩展处理动做的用法,废话很少说,下面咱们来看看扩展处理动做的用法。前端
一、LOG,此处理动做用于记录日志,它能够帮咱们哪些报文来请求过咱们服务器,并经过日志的形式记录到日志文件中。默认状况LOG处理动做将日志记录在/var/log/messages系统日志中(事实上它是把日志交给rsyslog,若是咱们没有更改rsyslog的配置,默认是记录到/var/log/messages);它是非中断处理动做,也就是说它自己不作容许或拒绝操做,为了能匹配更多的报文,咱们能够把此处理动做规则放在那些容许和拒绝规则以前,这样一来就能够记录来访咱们服务器的报文在容许或拒绝以前的全部报文,方便往后分析日志。node
--log-level level ,此选项表示定义日志的级别,这个日志级别同rsyslog的日志级别相似,日志级别有debug、info、notice、warning、error、crit、alert、emerg,有关日志级别的说明请参考http://www.javashuo.com/article/p-wobakswo-m.htmlweb
--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端口的报文centos
[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端口的报文日志,这是为何呢?防火墙规则写的不对吗?咱们来看看咱们防火墙规则是否匹配到报文?bash
提示:咱们查看防火墙规则,咱们刚才写的规则是匹配到有规则呀,可是/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的报文
二、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会话表里的数据,来自动做源地址转换。
三、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地址时,就作源地址转换,这个源地址具体转换成那个,这个就要看报文经过时扫描出来的对外地址是多少就转换成多少。
四、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端口的服务都是同样的内容。