天天看点

iptables基础详解与实例

一、iptables定义

iptables是一个工作于用户空间的防火墙应用软件,允许系统管理员可以调整设置X表(Xtables)提供相关的系统表格(目前主要位于iptables/netfilter)以及相关的“链”与“规则”来管理网络数据包的流动与转送的动作。因相关动作上的需要,iptables的操作需要用到超级用户的权限。在大部份的Linux系统上面,iptables是使用/usr/sbin/iptables来操作,文件则放置在手册页(Man page[2])底下,可以通过 <code>man iptables</code> 指令取得。通常iptables都需要内核层级的模块来配合运作,Xtables是主要在内核层级里面iptables API运作功能的模块。

主机防火墙:网络层防火墙可视为一种 IP 数据包过滤器,运作在底层的TCP/IP协议堆栈上

网络防火墙:工作于网络边缘的硬件设备;对于到达网络的数据包根据某种规则进行过滤处理。

二、iptables的四表和五链

四表

raw

设置为raw时不再iptables做数据包连接跟踪处理

mangle

用于对数据包的一些传输特性进行修改(TOS、TTL...)

nat

用于对地址转发功能(端口映射、地址隐射等)

filter

对数据包的过滤功能(最常用的;默认项)

五链

PREROUTING

数据包进入路由之前

INPUT

数据通过路由表后的目标位本机

FORWARD

数据通过路由表后的目标不为本机

OUTPUT

由本机出去的数据包向外发送

POSTROUTING

从网卡接口出去之前

对应关系

filter、mangle

filter、mangle、nat

mangle、nat

INPUT、FORWARD、OUTPUT

PREROUTING、OUTPUT、POSTROUTING

PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING

PREROUTING、OUTPUT

三、基本的用法

1、格式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<code>[Linux85]</code><code>#man iptables</code>

<code>IPTABLES(</code><code>8</code><code>)                     iptables </code><code>1.4</code><code>.</code><code>7</code>                     <code>IPTABLES(</code><code>8</code><code>)</code>

<code>NAME</code>

<code>       </code><code>iptables </code><code>-</code><code>-</code> <code>administration tool </code><code>for</code> <code>IPv4 packet filtering </code><code>and</code> <code>NAT</code>

<code>SYNOPSIS</code>

<code>       </code><code>iptables [</code><code>-</code><code>t table] {</code><code>-</code><code>A|</code><code>-</code><code>D} chain rule</code><code>-</code><code>specification</code>

<code>        </code><code>#指定的链附加或删除规则</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         </code> 

<code>       </code><code>iptables [</code><code>-</code><code>t table] </code><code>-</code><code>I chain [rulenum] rule</code><code>-</code><code>specification</code>

<code>        </code><code>#指定的链插入一条规则,默认为第一条</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             </code> 

<code>       </code><code>iptables [</code><code>-</code><code>t table] </code><code>-</code><code>R chain rulenum rule</code><code>-</code><code>specification</code>

<code>        </code><code>#覆盖指定的链中的规则;规则需要重新写</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </code> 

<code>       </code><code>iptables [</code><code>-</code><code>t table] </code><code>-</code><code>D chain rulenum</code>

<code>        </code><code>#删除指定链的规则以行号格式</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          </code> 

<code>       </code><code>iptables [</code><code>-</code><code>t table] </code><code>-</code><code>S [chain [rulenum]]</code>

<code>        </code><code>#只显示指定链的规则添加命令</code>

<code>       </code><code>iptables [</code><code>-</code><code>t table] {</code><code>-</code><code>F|</code><code>-</code><code>L|</code><code>-</code><code>Z} [chain [rulenum]] [options...]</code>

<code>            </code><code>#-F:清空链中的规则</code>

<code>            </code><code>#-L:列出表中的所有规则</code>

<code>            </code><code>#-Z:清空规则计数器</code>

<code>       </code><code>iptables [</code><code>-</code><code>t table] </code><code>-</code><code>N chain</code>

<code>        </code><code>#创建一条自定义空的规则链</code>

<code>       </code><code>iptables [</code><code>-</code><code>t table] </code><code>-</code><code>X [chain]</code>

<code>        </code><code>#删除一条自定义空的规则链</code>

<code>       </code><code>iptables [</code><code>-</code><code>t table] </code><code>-</code><code>P chain target</code>

<code>        </code><code>#为链指定默认策略;指定默认规则</code>

<code>       </code><code>iptables [</code><code>-</code><code>t table] </code><code>-</code><code>E old</code><code>-</code><code>chain</code><code>-</code><code>name new</code><code>-</code><code>chain</code><code>-</code><code>name</code>

<code>        </code><code>#修改自定义链名称</code>

2、匹配条件

通用匹配

-s

匹配源地址;ip或网络地址;! 可以取反。

-d

匹配目标地址;ip或网络地址;! 可以取反。

-p

匹配协议{tcp|udp|icmp}

-i

数据报文流入的接口;通常{INPUT|FORWARD|PREROUTING}

-o

数据报文流出的接口;通常{OUTPUT|FORWARD|POSTROUTING}

扩展匹配

   隐含扩展:使用-p{tcp|udp|icmp}指定某特定协议后;自动能够对协议进行的扩展

       --dport m[-n]:匹配的目标端口;可以是连续的多个端口

       --sport m[-n]:匹配的目标端口;可以是连续的多个端口

       --tcp-flags:根据tcp的标志位来匹配

       --icmp-type:icmp的状态

   显式扩展:必须要明确指定的扩展模块

    -m:扩展模块名称 --专用选项1 --专用选项2...(/lib64/xtables/*)

<code>[Linux85]</code><code>#ls /lib64/xtables/</code>

<code>libip6t_HL.so          libipt_SET.so         libxt_SECMARK.so      libxt_osf.so</code>

<code>libip6t_LOG.so         libipt_SNAT.so        libxt_TCPMSS.so       libxt_owner.so</code>

<code>libip6t_REJECT.so      libipt_TTL.so         libxt_TCPOPTSTRIP.so  libxt_physdev.so</code>

<code>libip6t_ah.so          libipt_ULOG.so        libxt_TOS.so          libxt_pkttype.so</code>

<code>libip6t_dst.so         libipt_addrtype.so    libxt_TPROXY.so       libxt_policy.so</code>

<code>libip6t_eui64.so       libipt_ah.so          libxt_TRACE.so        libxt_quota.so</code>

<code>libip6t_frag.so        libipt_ecn.so         libxt_cluster.so      libxt_rateest.so</code>

<code>libip6t_hbh.so         libipt_icmp.so        libxt_comment.so      libxt_recent.so</code>

<code>libip6t_hl.so          libipt_realm.so       libxt_connbytes.so    libxt_sctp.so</code>

<code>libip6t_icmp6.so       libipt_set.so         libxt_connlimit.so    libxt_socket.so</code>

<code>libip6t_ipv6header.so  libipt_ttl.so         libxt_connmark.so     libxt_standard.so</code>

<code>libip6t_mh.so          libipt_unclean.so     libxt_conntrack.so    libxt_state.so</code>

<code>libip6t_rt.so          libxt_AUDIT.so        libxt_dccp.so         libxt_statistic.so</code>

<code>libipt_CLUSTERIP.so    libxt_CHECKSUM.so     libxt_dscp.so         libxt_string.so</code>

<code>libipt_DNAT.so         libxt_CLASSIFY.so     libxt_esp.so          libxt_tcp.so</code>

<code>libipt_ECN.so          libxt_CONNMARK.so     libxt_hashlimit.so    libxt_tcpmss.so</code>

<code>libipt_LOG.so          libxt_CONNSECMARK.so  libxt_helper.so       libxt_time.so</code>

<code>libipt_MASQUERADE.so   libxt_DSCP.so         libxt_iprange.so      libxt_tos.so</code>

<code>libipt_MIRROR.so       libxt_MARK.so         libxt_length.so       libxt_u32.so</code>

<code>libipt_NETMAP.so       libxt_NFLOG.so        libxt_limit.so        libxt_udp.so</code>

<code>libipt_REDIRECT.so     libxt_NFQUEUE.so      libxt_mac.so</code>

<code>libipt_REJECT.so       libxt_NOTRACK.so      libxt_mark.so</code>

<code>libipt_SAME.so         libxt_RATEEST.so      libxt_multiport.so</code>

multiport:多端口匹配;一次指定多个(15个以内的)离散端口

[!] --sports port[,port|,port:port]

源端口

[!] --dports port[,port|,port:port]

目标端口

[!] --ports port[,port|,port:port]

不区分源与目标端口

string:字符串匹配

--algo {bm|kmp}

字符匹配查找时使用算法;必选

[!] --string pattern

要查找的字符串;可以取反

[!] --hex-string pattern

要查找的字符;先编码成16进制的格式

iprange:ip地址范围

[!] --src-range from[-to]

源IP;

[!] --dst-range from[-to]

目标IP;

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...]

每周几

limit:报文速率控制

--limit rate[/second|/minute|/hour|/day]

number/单位

--limit-burst number

峰值;最大值

connlimit:每IP对指定服务最大并发连接数

[!] --connlimit-above n

并发超出个数

state:状态匹配;根据netfilter内部会话表匹配;能建立连接的都能追踪

根据ip_conntrack和nf_conntrack来实现对整个系统连接追踪

INVALID

无法识别的连接;例如:tcp-flags ALL ALL/ALL NONE

ESTABLISHED

已建立连接的

NEW

新建立的连接

RELATED

相关联的;例如命令连接到数据连接

<code>[Linux85]</code><code>#iptables -A INPUT -d 172.16.251.85 -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT</code>

<code>#使用state后;连接追踪模块会自动加载</code>

<code>[Linux85]</code><code>#lsmod</code>

<code>Module                  Size  Used by</code>

<code>nf_conntrack_ipv4       </code><code>9506</code>  <code>2</code>

<code>nf_defrag_ipv4          </code><code>1483</code>  <code>1</code> <code>nf_conntrack_ipv4</code>

<code>xt_state                </code><code>1492</code>  <code>2</code>

<code>nf_conntrack           </code><code>79758</code>  <code>2</code> <code>nf_conntrack_ipv4,xt_state</code>

<code>[Linux85]</code><code>#iptables -L -n -v</code>

<code>Chain </code><code>INPUT</code> <code>(policy ACCEPT </code><code>1</code> <code>packets, </code><code>40</code> <code>bytes)</code>

<code> </code><code>pkts bytes target     prot opt </code><code>in</code>     <code>out     source               destination   </code>

<code>   </code><code>50</code>  <code>3768</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>eth0   </code><code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.85</code>       <code>tcp dpt:</code><code>22</code> <code>state NEW,ESTABLISHED</code>

<code>Chain FORWARD (policy ACCEPT </code><code>0</code> <code>packets, </code><code>0</code> <code>bytes)</code>

<code>Chain OUTPUT (policy ACCEPT </code><code>35</code> <code>packets, </code><code>3252</code> <code>bytes)</code>

<code>[Linux85]</code><code>#cat /proc/sys/net/nf_conntrack_max</code>

<code>15692</code>  <code>#定义了连接追踪的最大值;可以按需调整</code>

<code>[Linux85]</code><code>#</code>

<code>Chain </code><code>INPUT</code> <code>(policy DROP </code><code>0</code> <code>packets, </code><code>0</code> <code>bytes)</code>

<code>  </code><code>357</code> <code>25520</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>eth0   </code><code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.85</code>       <code>tcp dpt:</code><code>22</code> <code>state NEW,ESTABLISHED</code>

<code>Chain OUTPUT (policy DROP </code><code>0</code> <code>packets, </code><code>0</code> <code>bytes)</code>

<code>   </code><code>63</code>  <code>6928</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>172.16</code><code>.</code><code>251.85</code>        <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>tcp spt:</code><code>22</code> <code>state ESTABLISHED</code>

四、实例演示

1、自定义一个规则链;过滤非法数据包;并被调用

<code>[Linux85]</code><code>#iptables -N clean_in</code>

<code>#建立一条空规则链</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         </code> 

<code>[Linux85]</code><code>#iptables -A clean_in -d 172.16.251.85 -p tcp --tcp-flags ALL ALL -j DROP</code>

<code>#DROP掉tcp-flags值全为1的</code>

<code>[Linux85]</code><code>#iptables -A clean_in -d 172.16.251.85 -p tcp --tcp-flags ALL NONE -j DROP</code>

<code>#DROP掉tcp-flags值全为0的</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               </code> 

<code>[Linux85]</code><code>#iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP</code>

<code>[Linux85]</code><code>#iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP</code>

<code># 广播包</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             </code> 

<code>[Linux85]</code><code>#iptables -A clean_in -d 172.16.251.85 -j RETURN</code>

<code>#检测完无匹配就跳回主链;继续下一条检测</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     </code> 

<code>[Linux85]</code><code>#iptables -A INPUT -d 172.16.251.85 -j clean_in</code>

<code>#在INPUT调用</code>

<code>Chain </code><code>INPUT</code> <code>(policy ACCEPT </code><code>38</code> <code>packets, </code><code>2738</code> <code>bytes)</code>

<code>   </code><code>35</code>  <code>2504</code> <code>clean_in   </code><code>all</code>  <code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.85</code> 

<code>Chain OUTPUT (policy ACCEPT </code><code>23</code> <code>packets, </code><code>3260</code> <code>bytes)</code>

<code>Chain clean_in (</code><code>1</code> <code>references)</code>

<code>    </code><code>0</code>     <code>0</code> <code>DROP       tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.85</code>       <code>tcp flags:</code><code>0x3F</code><code>/</code><code>0x3F</code>

<code>    </code><code>0</code>     <code>0</code> <code>DROP       tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.85</code>       <code>tcp flags:</code><code>0x3F</code><code>/</code><code>0x00</code>

<code>    </code><code>0</code>     <code>0</code> <code>DROP       icmp </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>255.255</code>

<code>    </code><code>0</code>     <code>0</code> <code>DROP       icmp </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>255.255</code><code>.</code><code>255.255</code>

<code>   </code><code>35</code>  <code>2504</code> <code>RETURN     </code><code>all</code>  <code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.85</code>

2、放行本机的ssh端口给指定IP

<code>[Linux85]</code><code>#iptables -A INPUT -s 172.16.254.28 -d 172.16.251.85 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT</code>

<code>#放行新建立和已连接的</code>

<code>[Linux85]</code><code>#iptables -A OUTPUT -s 172.16.251.85 -m state --state ESTABLISHED -j ACCEPT</code>

<code>#放行已连接的状态</code>

<code>[Linux85]</code><code>#iptables -P INPUT DROP</code>

<code>[Linux85]</code><code>#iptables -P OUTPUT DROP</code>

<code>Chain </code><code>INPUT</code> <code>(policy DROP </code><code>11</code> <code>packets, </code><code>1378</code> <code>bytes)</code>

<code>  </code><code>396</code> <code>29036</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>172.16</code><code>.</code><code>254.28</code>        <code>172.16</code><code>.</code><code>251.85</code>       <code>tcp dpt:</code><code>22</code> <code>state NEW,ESTABLISHED</code>

<code>   </code><code>91</code>  <code>8328</code> <code>ACCEPT     </code><code>all</code>  <code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>172.16</code><code>.</code><code>251.85</code>        <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>state ESTABLISHED</code>

<code>[Linux87]</code><code>#ssh 172.16.251.85</code>

<code>ssh: connect to host </code><code>172.16</code><code>.</code><code>251.85</code> <code>port </code><code>22</code><code>: Connection timed out</code>

<code>[Linux87]</code><code>#测试87这台机器无法连接</code>

3、本机禁ping

<code>[Linux86]</code><code>#ping 172.16.251.87</code>

<code>PING </code><code>172.16</code><code>.</code><code>251.87</code> <code>(</code><code>172.16</code><code>.</code><code>251.87</code><code>) </code><code>56</code><code>(</code><code>84</code><code>) bytes of data.</code>

<code>64</code> <code>bytes </code><code>from</code> <code>172.16</code><code>.</code><code>251.87</code><code>: icmp_seq</code><code>=</code><code>1</code> <code>ttl</code><code>=</code><code>64</code> <code>time</code><code>=</code><code>0.848</code> <code>ms</code>

<code>64</code> <code>bytes </code><code>from</code> <code>172.16</code><code>.</code><code>251.87</code><code>: icmp_seq</code><code>=</code><code>2</code> <code>ttl</code><code>=</code><code>64</code> <code>time</code><code>=</code><code>0.401</code> <code>ms</code>

<code>64</code> <code>bytes </code><code>from</code> <code>172.16</code><code>.</code><code>251.87</code><code>: icmp_seq</code><code>=</code><code>3</code> <code>ttl</code><code>=</code><code>64</code> <code>time</code><code>=</code><code>0.412</code> <code>ms</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 </code> 

<code>[Linux87]</code><code>#iptables -A INPUT -d 172.16.251.87 -p icmp --icmp-type 8 -j DROP</code>

<code>#禁止任何主机对于本机的icmp的请求</code>

<code>[Linux87]</code><code>#iptables -L -vn       查看已匹配到包</code>

<code>Chain </code><code>INPUT</code> <code>(policy ACCEPT </code><code>221</code> <code>packets, </code><code>27594</code> <code>bytes)</code>

<code> </code><code>pkts bytes target     prot opt </code><code>in</code>     <code>out     source               destination    </code>

<code>   </code><code>71</code>  <code>5964</code> <code>DROP       icmp </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.87</code>       <code>icmp </code><code>type</code> <code>8</code>

<code>Chain OUTPUT (policy ACCEPT </code><code>98</code> <code>packets, </code><code>14732</code> <code>bytes)</code>

<code> </code><code>pkts bytes target     prot opt </code><code>in</code>     <code>out     source               destination</code>

<code>[Linux86]</code><code>#ping 172.16.251.87   已经无法ping了</code>

4、放行本机80端口

<code>#首先先放行ssh的22号端口</code>

<code>[Linux86]</code><code>#iptables -A INPUT -d 172.16.251.86 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT</code>

<code>[Linux86]</code><code>#iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT</code>

<code>[Linux86]</code><code>#iptables -P INPUT DROP</code>

<code>[Linux86]</code><code>#iptables -P OUTPUT DROP</code>

<code>[Linux87]</code><code>#curl http://172.16.251.86/index.html</code>

<code>curl: (</code><code>7</code><code>) couldn't connect to host</code>

<code>[Linux87]</code><code>#</code>

<code>#测试无法访问</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               </code> 

<code>[Linux86]</code><code>#iptables -A INPUT -d 172.16.251.86 -p tcp --dport 80 -m state --state NEW -j ACCEPT</code>

<code>#放行80端口</code>

<code>This a test Page!</code>

<code>[Linux87]</code><code>#测试可以访问了</code>

<code>[Linux86]</code><code>#iptables -L -nv</code>

<code>Chain </code><code>INPUT</code> <code>(policy DROP </code><code>76</code> <code>packets, </code><code>11352</code> <code>bytes)</code>

<code>  </code><code>340</code> <code>27369</code> <code>ACCEPT     </code><code>all</code>  <code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>state ESTABLISHED</code>

<code>    </code><code>0</code>     <code>0</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>tcp dpt:</code><code>22</code> <code>state NEW</code>

<code>    </code><code>3</code>   <code>164</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>tcp dpt:</code><code>80</code> <code>state NEW</code>

<code>  </code><code>304</code> <code>34487</code> <code>ACCEPT     </code><code>all</code>  <code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>state ESTABLISHED</code>

<code>#上述都可以看到匹配的包</code>

5、放行被动工作的ftp服务

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

<code>[Linux87]</code><code>#lftp 172.16.251.86/pub</code>

<code>cd `ftp:</code><code>/</code><code>/</code><code>172.16</code><code>.</code><code>251.86</code><code>/</code><code>pub' [Connecting...]</code>

<code>#测试目前无法连接</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              </code> 

<code>[Linux86]</code><code>#iptables -A OUTPUT -s 172.16.251.86 -p tcp --sport 21 -j ACCEPT</code>

<code>[Linux86]</code><code>#iptables -A INPUT -d 172.16.251.86 -p tcp --dport 21 -j ACCEPT</code>

<code>[Linux86]</code><code>#iptables -A INPUT -d 172.16.251.86 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT</code>

<code>[Linux86]</code><code>#iptables -A OUTPUT -s 172.16.251.86 -p tcp -m state --state ESTABLISHED -j ACCEPT</code>

<code>#上述是放行ftp的端口和相关联的会话连接;还需要装载两个模块才能生效</code>

<code>[Linux86]</code><code>#modprobe nf_nat_ftp</code>

<code>[Linux86]</code><code>#modprobe nf_conntrack_ftp</code>

<code>[Linux86]</code><code>#vi /etc/sysconfig/iptables-config</code>

<code># Load additional iptables modules (nat helpers)</code>

<code>#   Default: -none-</code>

<code># Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which</code>

<code># are loaded after the firewall rules are applied. Options for the helpers are</code>

<code># stored in /etc/modprobe.conf.</code>

<code>IPTABLES_MODULES</code><code>=</code><code>"nf_nat_ftp nf_conntrack_ftp"</code>

<code>#写到配置文件;下次开机可以自动装载</code>

<code>cd ok, cwd</code><code>=</code><code>/</code><code>pub</code>

<code>lftp </code><code>172.16</code><code>.</code><code>251.86</code><code>:</code><code>/</code><code>pub&gt; ls</code>

<code>-</code><code>rw</code><code>-</code><code>r</code><code>-</code><code>-</code><code>r</code><code>-</code><code>-</code>    <code>1</code> <code>0</code>        <code>0</code>             <code>103</code> <code>Mar </code><code>24</code> <code>06</code><code>:</code><code>23</code> <code>issue</code>

<code>lftp </code><code>172.16</code><code>.</code><code>251.86</code><code>:</code><code>/</code><code>pub&gt; </code><code>#测试可以正常访问了</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            </code> 

<code>Chain </code><code>INPUT</code> <code>(policy DROP </code><code>326</code> <code>packets, </code><code>41008</code> <code>bytes)</code>

<code> </code><code>1115</code> <code>80408</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>tcp dpt:</code><code>22</code>

<code>  </code><code>174</code>  <code>9245</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>tcp dpt:</code><code>21</code>

<code>   </code><code>14</code>   <code>696</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>state RELATED,ESTABLISHED</code>

<code>Chain OUTPUT (policy DROP </code><code>13</code> <code>packets, </code><code>780</code> <code>bytes)</code>

<code>  </code><code>671</code> <code>72480</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>172.16</code><code>.</code><code>251.86</code>        <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>tcp spt:</code><code>22</code>

<code>  </code><code>199</code> <code>13355</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>172.16</code><code>.</code><code>251.86</code>        <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>tcp spt:</code><code>21</code>

<code>   </code><code>14</code>   <code>885</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>172.16</code><code>.</code><code>251.86</code>        <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>state ESTABLISHED</code>

<code>匹配到了包;对于上述规则可以进行优化处理;下述进行优化规则</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </code> 

<code>[Linux86]</code><code>#iptables -I INPUT 1 -d 172.26.251.86 -m state --state RELATED,ESTABLISHED -j ACCEPT</code>

<code>[Linux86]</code><code>#iptables -I INPUT 2 -d 172.26.251.86 -p tcp -m multiport --dports 21,22 -m state --state NEW -j ACCEPT</code>

<code>[Linux86]</code><code>#iptables -I OUTPUT 1 -s 172.16.251.86 -m state --state ESTABLISHED -j ACCEPT</code>

<code>Chain </code><code>INPUT</code> <code>(policy DROP </code><code>2</code> <code>packets, </code><code>406</code> <code>bytes)</code>

<code>  </code><code>380</code> <code>29174</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>state RELATED,ESTABLISHED</code>

<code>    </code><code>2</code>   <code>104</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>state NEW multiport dports </code><code>22</code><code>,</code><code>21</code>

<code>   </code><code>50</code>  <code>6192</code> <code>ACCEPT     </code><code>all</code>  <code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>172.16</code><code>.</code><code>251.86</code>        <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>state ESTABLISHED</code>

<code>#优化后;测试ftp正常;且还可以放行例如80等端口</code>

6、屏蔽指定字符串的网页

<code>[Linux87]</code><code>#curl http://172.16.251.86/admin.html</code>

<code>This a admin page!</code>

<code>上述访问正常;下面来写规则进行屏蔽admin字符的页面</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 </code> 

<code>[Linux86]</code><code>#iptables -I INPUT 1 -d 172.16.251.86 -p tcp -m string --algo bm --string "admin" -j DROP</code>

<code>curl: (</code><code>52</code><code>) Empty reply </code><code>from</code> <code>server</code>

<code>Chain </code><code>INPUT</code> <code>(policy DROP </code><code>13</code> <code>packets, </code><code>1264</code> <code>bytes)</code>

<code>   </code><code>13</code>  <code>5510</code> <code>DROP       tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>STRING match </code><code>"admin"</code> <code>ALGO name bm TO </code><code>65535</code>

<code>  </code><code>931</code> <code>79380</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>state RELATED,ESTABLISHED</code>

<code>   </code><code>12</code>   <code>672</code> <code>ACCEPT     tcp  </code><code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>            <code>172.16</code><code>.</code><code>251.86</code>       <code>multiport dports </code><code>22</code><code>,</code><code>21</code><code>,</code><code>80</code> <code>state NEW</code>

<code>  </code><code>416</code> <code>47643</code> <code>ACCEPT     </code><code>all</code>  <code>-</code><code>-</code>  <code>*</code>      <code>*</code>       <code>172.16</code><code>.</code><code>251.86</code>        <code>0.0</code><code>.</code><code>0.0</code><code>/</code><code>0</code>           <code>state ESTABLISHED</code>

五、配置nat转发在不同网络放行web等服务

NAT:网络地址转换;iptables基于SNAT和DNAT这两个目标实现地址转换技术。

SNAT:源地址转换;用于让内网主机访问互联网。在POSTROUTING或OUTPUT上写规则。

DNAT:目标地址转换;让互联网上主机访问本地内网中的某服务器上的服务。在PREROUTING上写规则。

大致规划:

配置三台虚拟机:

linux87:172.16.251.87(内网)/192.168.111.11(外网)

linux86:172.16.251.86    网关指向:172.16.251.87

linux12:192.168.111.12  

假设由192.168.111.12充当外网提供ftp和web等服务;

linux87:

<code>[Linux87]</code><code>#ifconfig</code>

<code>eth0      Link encap:Ethernet  HWaddr </code><code>00</code><code>:</code><code>0C</code><code>:</code><code>29</code><code>:</code><code>5E</code><code>:</code><code>1E</code><code>:</code><code>4F</code>

<code>          </code><code>inet addr:</code><code>172.16</code><code>.</code><code>251.87</code>  <code>Bcast:</code><code>172.16</code><code>.</code><code>255.255</code>  <code>Mask:</code><code>255.255</code><code>.</code><code>0.0</code>

<code>          </code><code>inet6 addr: fe80::</code><code>20c</code><code>:</code><code>29ff</code><code>:fe5e:</code><code>1e4f</code><code>/</code><code>64</code> <code>Scope:Link</code>

<code>          </code><code>UP BROADCAST RUNNING MULTICAST  MTU:</code><code>1500</code>  <code>Metric:</code><code>1</code>

<code>          </code><code>RX packets:</code><code>44356</code> <code>errors:</code><code>0</code> <code>dropped:</code><code>0</code> <code>overruns:</code><code>0</code> <code>frame:</code><code>0</code>

<code>          </code><code>TX packets:</code><code>8569</code> <code>errors:</code><code>0</code> <code>dropped:</code><code>0</code> <code>overruns:</code><code>0</code> <code>carrier:</code><code>0</code>

<code>          </code><code>collisions:</code><code>0</code> <code>txqueuelen:</code><code>1000</code>

<code>          </code><code>RX bytes:</code><code>5091283</code> <code>(</code><code>4.8</code> <code>MiB)  TX bytes:</code><code>4238794</code> <code>(</code><code>4.0</code> <code>MiB)</code>

<code>          </code><code>Interrupt:</code><code>19</code> <code>Base address:</code><code>0x2000</code>

<code>eth1      Link encap:Ethernet  HWaddr </code><code>00</code><code>:</code><code>0C</code><code>:</code><code>29</code><code>:</code><code>5E</code><code>:</code><code>1E</code><code>:</code><code>59</code>

<code>          </code><code>inet addr:</code><code>192.168</code><code>.</code><code>111.11</code>  <code>Bcast:</code><code>192.168</code><code>.</code><code>111.255</code>  <code>Mask:</code><code>255.255</code><code>.</code><code>255.0</code>

<code>          </code><code>inet6 addr: fe80::</code><code>20c</code><code>:</code><code>29ff</code><code>:fe5e:</code><code>1e59</code><code>/</code><code>64</code> <code>Scope:Link</code>

<code>          </code><code>RX packets:</code><code>122</code> <code>errors:</code><code>0</code> <code>dropped:</code><code>0</code> <code>overruns:</code><code>0</code> <code>frame:</code><code>0</code>

<code>          </code><code>TX packets:</code><code>35</code> <code>errors:</code><code>0</code> <code>dropped:</code><code>0</code> <code>overruns:</code><code>0</code> <code>carrier:</code><code>0</code>

<code>          </code><code>RX bytes:</code><code>11513</code> <code>(</code><code>11.2</code> <code>KiB)  TX bytes:</code><code>2615</code> <code>(</code><code>2.5</code> <code>KiB)</code>

<code>                                                                                                                                                                                                                                                                                                                                            </code> 

<code>#配置好IP地址后开启转发功能;</code>

<code>[Linux87]</code><code>#sysctl net.ipv4.ip_forward=1</code>

<code>net.ipv4.ip_forward </code><code>=</code> <code>1</code>

linux86:

<code>[Linux86]</code><code>#ifconfig</code>

<code>eth0      Link encap:Ethernet  HWaddr </code><code>00</code><code>:</code><code>0C</code><code>:</code><code>29</code><code>:DF:</code><code>70</code><code>:B6</code>

<code>          </code><code>inet addr:</code><code>172.16</code><code>.</code><code>251.86</code>  <code>Bcast:</code><code>172.16</code><code>.</code><code>255.255</code>  <code>Mask:</code><code>255.255</code><code>.</code><code>0.0</code>

<code>          </code><code>inet6 addr: fe80::</code><code>20c</code><code>:</code><code>29ff</code><code>:fedf:</code><code>70b6</code><code>/</code><code>64</code> <code>Scope:Link</code>

<code>          </code><code>RX packets:</code><code>21060</code> <code>errors:</code><code>0</code> <code>dropped:</code><code>0</code> <code>overruns:</code><code>0</code> <code>frame:</code><code>0</code>

<code>          </code><code>TX packets:</code><code>5558</code> <code>errors:</code><code>0</code> <code>dropped:</code><code>0</code> <code>overruns:</code><code>0</code> <code>carrier:</code><code>0</code>

<code>          </code><code>RX bytes:</code><code>1984222</code> <code>(</code><code>1.8</code> <code>MiB)  TX bytes:</code><code>707372</code> <code>(</code><code>690.7</code> <code>KiB)</code>

<code>#配置网关</code>

<code>[Linux86]</code><code>#route add default gw 172.16.251.87</code>

<code>[Linux86]</code><code>#route -n</code>

<code>Kernel IP routing table</code>

<code>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface</code>

<code>169.254</code><code>.</code><code>0.0</code>     <code>0.0</code><code>.</code><code>0.0</code>         <code>255.255</code><code>.</code><code>0.0</code>     <code>U     </code><code>1002</code>   <code>0</code>        <code>0</code> <code>eth0</code>

<code>172.16</code><code>.</code><code>0.0</code>      <code>0.0</code><code>.</code><code>0.0</code>         <code>255.255</code><code>.</code><code>0.0</code>     <code>U     </code><code>0</code>      <code>0</code>        <code>0</code> <code>eth0</code>

<code>0.0</code><code>.</code><code>0.0</code>         <code>172.16</code><code>.</code><code>251.87</code>   <code>0.0</code><code>.</code><code>0.0</code>         <code>UG    </code><code>0</code>      <code>0</code>        <code>0</code> <code>eth0</code>

为了演示方便;这里先把192.168.111.12的网关指向111.11;后续操作时在删除这个网关

linux12:

<code>[Linux12]</code><code>#ifconfig</code>

<code>eth0      Link encap:Ethernet  HWaddr </code><code>00</code><code>:</code><code>0C</code><code>:</code><code>29</code><code>:</code><code>4D</code><code>:AE:B9</code>

<code>          </code><code>inet addr:</code><code>192.168</code><code>.</code><code>111.12</code>  <code>Bcast:</code><code>192.168</code><code>.</code><code>111.255</code>  <code>Mask:</code><code>255.255</code><code>.</code><code>255.0</code>

<code>          </code><code>inet6 addr: fe80::</code><code>20c</code><code>:</code><code>29ff</code><code>:fe4d:aeb9</code><code>/</code><code>64</code> <code>Scope:Link</code>

<code>          </code><code>RX packets:</code><code>268</code> <code>errors:</code><code>0</code> <code>dropped:</code><code>0</code> <code>overruns:</code><code>0</code> <code>frame:</code><code>0</code>

<code>          </code><code>TX packets:</code><code>180</code> <code>errors:</code><code>0</code> <code>dropped:</code><code>0</code> <code>overruns:</code><code>0</code> <code>carrier:</code><code>0</code>

<code>          </code><code>RX bytes:</code><code>23231</code> <code>(</code><code>22.6</code> <code>KiB)  TX byte</code>

<code>                                                                                                                                                                                                                                                                                                                              </code> 

<code>#提供ftp和web等服务</code>

<code>[Linux12]</code><code>#ss -tunl | grep 80</code>

<code>tcp    LISTEN     </code><code>0</code>      <code>128</code>                   <code>:::</code><code>80</code>                   <code>:::</code><code>*</code> 

<code>[Linux12]</code><code>#ss -tunl | grep 21</code>

<code>udp    UNCONN     </code><code>0</code>      <code>0</code>                      <code>*</code><code>:</code><code>35216</code>                 <code>*</code><code>:</code><code>*</code> 

<code>tcp    LISTEN     </code><code>0</code>      <code>32</code>                     <code>*</code><code>:</code><code>21</code>                    <code>*</code><code>:</code><code>*</code> 

<code>[Linux12]</code><code>#</code>

<code>[Linux12]</code><code>#vi /var/www/html/index.html</code>

<code>This </code><code>is</code> <code>192.168</code><code>.</code><code>111.12</code> <code>page!</code>

<code>[Linux12]</code><code>#cd /var/ftp/pub/</code>

<code>[Linux12]</code><code>#touch 192.168.111.12.txt</code>

<code>[Linux12]</code><code>#ls</code>

<code>192.168</code><code>.</code><code>111.12</code><code>.txt</code>

上述配置完成后内部网络其实已经可以访问了;因为转发功能已开启;且网关都以指向251.87这台机器;所以这里可以看下效果

<code>[Linux87]</code><code>#curl http://192.168.111.12</code>

<code>[Linux86]</code><code>#curl http://192.168.111.12</code>

<code>[Linux86]</code><code>#</code>

<code>[Linux86]</code><code>#lftp 192.168.111.12/pub</code>

<code>lftp </code><code>192.168</code><code>.</code><code>111.12</code><code>:</code><code>/</code><code>pub&gt; ls</code>

<code>-</code><code>rw</code><code>-</code><code>r</code><code>-</code><code>-</code><code>r</code><code>-</code><code>-</code>    <code>1</code> <code>0</code>        <code>0</code>               <code>0</code> <code>Mar </code><code>28</code> <code>08</code><code>:</code><code>39</code> <code>192.168</code><code>.</code><code>111.12</code><code>.txt</code>

<code>#测试访问都是正常的</code>

<code>[Linux12]</code><code>#tail -3 /var/log/httpd/access_log</code>

<code>192.168</code><code>.</code><code>111.11</code> <code>-</code> <code>-</code> <code>[</code><code>28</code><code>/</code><code>Mar</code><code>/</code><code>2014</code><code>:</code><code>16</code><code>:</code><code>42</code><code>:</code><code>39</code> <code>+</code><code>0800</code><code>] </code><code>"GET / HTTP/1.1"</code> <code>200</code> <code>29</code> <code>"-"</code> <code>"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"</code> <code>#这台是中间路由机器</code>

<code>172.16</code><code>.</code><code>251.86</code> <code>-</code> <code>-</code> <code>[</code><code>28</code><code>/</code><code>Mar</code><code>/</code><code>2014</code><code>:</code><code>16</code><code>:</code><code>45</code><code>:</code><code>26</code> <code>+</code><code>0800</code><code>] </code><code>"GET / HTTP/1.1"</code> <code>200</code> <code>29</code> <code>"-"</code> <code>"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"</code> <code>#这台是linux86</code>

<code>172.16</code><code>.</code><code>254.28</code> <code>-</code> <code>-</code> <code>[</code><code>28</code><code>/</code><code>Mar</code><code>/</code><code>2014</code><code>:</code><code>16</code><code>:</code><code>45</code><code>:</code><code>45</code> <code>+</code><code>0800</code><code>] </code><code>"GET / HTTP/1.1"</code> <code>304</code> <code>-</code> <code>"-"</code> <code>"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36"</code> <code>#这台是宿主机的IP</code>

下面先把192.168.111.12上的网关删除;而后做SNAT转发后在查看下日志

<code>下面写入规则</code>

<code>[Linux87]</code><code>#iptables -t nat -A POSTROUTING -s 172.16.251.86 -j SNAT --to-source 192.168.111.11</code>

<code>[Linux86]</code><code>#再次测试;访问正常</code>

<code>加入网关;来查看下日志</code>

<code>[Linux12]</code><code># tail -4 /var/log/httpd/access_log</code>

<code>172.16</code><code>.</code><code>254.28</code> <code>-</code> <code>-</code> <code>[</code><code>28</code><code>/</code><code>Mar</code><code>/</code><code>2014</code><code>:</code><code>16</code><code>:</code><code>45</code><code>:</code><code>45</code> <code>+</code><code>0800</code><code>] </code><code>"GET / HTTP/1.1"</code> <code>304</code> <code>-</code> <code>"-"</code> <code>"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36"</code>

<code>192.168</code><code>.</code><code>111.11</code> <code>-</code> <code>-</code> <code>[</code><code>28</code><code>/</code><code>Mar</code><code>/</code><code>2014</code><code>:</code><code>16</code><code>:</code><code>52</code><code>:</code><code>33</code> <code>+</code><code>0800</code><code>] </code><code>"GET / HTTP/1.1"</code> <code>200</code> <code>29</code> <code>"-"</code> <code>"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"</code>

<code>192.168</code><code>.</code><code>111.11</code> <code>-</code> <code>-</code> <code>[</code><code>28</code><code>/</code><code>Mar</code><code>/</code><code>2014</code><code>:</code><code>16</code><code>:</code><code>54</code><code>:</code><code>31</code> <code>+</code><code>0800</code><code>] </code><code>"GET / HTTP/1.1"</code> <code>200</code> <code>29</code> <code>"-"</code> <code>"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"</code>

<code>192.168</code><code>.</code><code>111.11</code> <code>-</code> <code>-</code> <code>[</code><code>28</code><code>/</code><code>Mar</code><code>/</code><code>2014</code><code>:</code><code>16</code><code>:</code><code>54</code><code>:</code><code>32</code> <code>+</code><code>0800</code><code>] </code><code>"GET / HTTP/1.1"</code> <code>200</code> <code>29</code> <code>"-"</code> <code>"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"</code>

<code>[Linux12]</code><code># 上面的访问地址都已变成linux87这台外网IP了</code>

上面的SNAT转换以成功;下面进行DNAT地址转换

<code>[Linux87]</code><code>#ss -tunl | grep 80</code>

<code>#linux87主机上不提供web服务</code>

<code>[Linux86]</code><code>#curl http://172.16.251.87</code>

<code>[Linux86]</code><code>#测试也无法访问;现在把目标地址转换到192.168.111.12上。此时192.168.111.12不是作为外网提供;可以想象是作为内网的;与SNAT相互调换即可</code>

<code>[Linux87]</code><code>#iptables -t nat -A PREROUTING  -d 172.16.251.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.111.12</code>

<code>DNAT转换需要在PREROUTING上添加规则</code>

<code>#测试访问成功;宿主机上也是可以正常访问的;因为源地址是开放给所有主机的;如需要屏蔽;可以在FORWARD上DROP需要屏蔽的IP即可</code>

<code>                                    </code> 

<code>#支持端口映射;例如</code>

<code>[Linux87]</code><code>#iptables -t nat -A PREROUTING  -d 172.16.251.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.111.12:8080</code>

<code>可以转换到</code><code>8080</code><code>端口的。</code>

至此;基本的iptables已结束;iptables规则除了要写出合适的规则;更重要的是要优化好规则才能更能提高效率。

本文转自Mr_陈 51CTO博客,原文链接:http://blog.51cto.com/chenpipi/1386184,如需转载请自行联系原作者

继续阅读