首页 > 代码库 > iptables详解

iptables详解


IPtables(包过滤型防火墙)是一个工作在linux内核中且有连接追踪的包过滤型防火墙


Firewall(防火墙):是一个用来做网络隔离、工作在网络边缘的组件。防火墙可以根据事先定义的规则对进出本网络的数据报文进行匹配检测,并对其匹配的报文做出相应的处理。简单来说就是:根据规则,匹配报文,做出处理。


防火墙分类:

主机防火墙

网络防火墙

硬件防火墙(硬件个软件逻辑)

软件防火墙(软件逻辑,灵活)


IPchains:规则连,自上而下一条条的对报文进行规则匹配,一旦被某个规则匹配就按照这个规则的定义进行报文的处理,如果所有的规则都没有匹配,则按照默认规则进行处理


netfilter:netfilter才是真真的防火墙,工作在内核之中

iptables:专门编写规则和检查规则的语法

注:iptables编写的每条规则,最后都会直接送到netfilter的某个hook function(钩子函数)上,进行报文过滤



hook function有五种:

  1. prerouting

  2. input

  3. forward

  4. output

  5. postrouting

每个hook function都对应一个链


链有五种:

  1. PREROUTING 路由前

  2. INPUT    进入

  3. FORWARD   转发

  4. OUTPUT    外出

  5. POSTROUTING 路由后



功能分类:

  1. filter:进行过滤,是最常用的一个,定义哪个包能够通过,哪个包不能通过

  2. nat(network address translation):网络地址转换,用于修改源IP/目标ip,也可以修改端口

  3. mangle;用于拆解报文,并对报文做出修改后重新封装起来

  4. raw:关闭nat表上启用的连接追踪机制


每一个链上可以定义多个功能,每个功能可以写入多个规则,这就是一个规则表。但是每个规则的生效有先后顺序


功能和链的对应关系


Raw:PREROUTING、OUTPUT上可以定义

Mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING 五个上面都可以定义

Nat:PREROUTING、INPUT、OUTPUT、POSTROUTING(除了forward)上可以定义

Filter:INPUT、FORWARD、OUTPUT上可以定义


报文的流向:

流入机制: PREROUTING-->INPUT

由本机流出:OUTPUT-->POSTROUTING

转发:PREROUTING-->FORWARD-->POSTROUTING


路由功能发生的时刻:

  1. 报文进入本机时:目标主机是哪个?

  2. 报文离开本机之前:判断经由哪个接口送往下一站?



例:

凡是来自172.16.1.0网段的主机都不允许访问web服务,应该在哪个链上进行定义?

在INPUT链上,因为只有INPUT、FORWARD、OUTPUT链上可以定义Filter(过滤)其他两个明显不符合,应该定义在进入本机的链上


所有由本机发出的访问172.16.1.0网段web服务的都不被允许?

定义在OUTPUT链上,对外出的报文进行Filter(过滤)


所有由本机转发的访问172.16.1.0网段的web服务都允许

定义在FORWARD上,因为转发时报文只经过PREROUTING-->FORWARD-->POSTROUTING,而只有FORWARD链才被允许进行Filter(过滤)



iptables--编写规则-->在netfilter上的hook function对应的链上进行匹配报文



规则的匹配条件分为:

  1. 基本匹配条件

  2. 扩展匹配条件


规则的处理动作分为:

  1. 基本处理动作

  2. 扩展处理动作

  3. 自定义的处理机制



根据规则,匹配报文,做出处理动作



iptables的链又分为内置链和自定义链


5种内置链对应5个 hook function


自定义链:用于内置链的扩展和补充,可以更灵活的对规则进行管理

注:自定义链只有被内置链调用才能生效,自定义链必须与内置链相关联



链上的规则检查次序:

  1. 同类规则(访问同一个应用),匹配到报文频率小的放在上面

  2. 不同类规则(访问不同的应用),匹配到报文频率大的放在上面

  3. 将那些可以由一条规则描述的多个规则可以合并为一个规则

  4. 要设置默认的策略



iptables命令的格式


iptables [-t table] command chain [-m matchname[per-match-options]] -j targetname [per-target-options]


-t (table): raw mangle filter nat


command:


链管理: -N:new 自定义一个新的规则链

      -X:delete 删除规则链

      -P:policy设置默认的策略,对filter表中的链而言其默认的策略有:accept、drop、reject


-E:重新命名自定义的链,引用计数不为0(即被内置链调用和关联的链)的自定义链不能被重新命名,也不能被删除



规则管理: -A:append追加

       -I:insert插入,要指明位置,省略时表示插在第一条


       -D:delete删除规则链中的规则 1:指明规则序号 2:指明规则本身

       -R:replace,替换指定链上指定的规则

       -F:flush 清空指定的规则链

       -Z:zero 清零计数器

       注:iptables的每条规则都有2个计数器分别为(1)匹配报文个数 (2)匹配到的所有报文的大小之和


       -L:list 列出指定链上的所有规则

       -n:numberic 以数字的格式显示地址和端口号

       -v:verbose 显示详细信息;-vv,-vvv

       -x:exactly 显示计数器结果的精确值

       --line_numbers:显示规则的序列号


匹配条件:

基本匹配条件,无需加载任何模块,有iptables/netfilter自行提供

-s,--source address[/netmask] 检查报文中源IP是否符合指定的范围

-d,--destination address[/nermask] 检查报文中的目标IP是否符合指定的范围

-p,protocal +tcp、udp、tcmp、udplite、esp.....

-I,指定数据报文流入的接口,只能用于数据流入的链如(PREROUTING、INPUT、FORWARD)

-O, 指定数据报文流出的接口,只能用于(FORWARD、OUTPUT、POSTROUTING)



扩展匹配条件,需要加载模块才能生效

隐式扩展:不需要手动加载扩展模块,因为他们为协议的扩展所以但凡使用了-p 指明了协议,就表明已经指明了扩展模块


显式扩展:必须手动加载扩展模块 [-m matchname [per-match-options]]



tcp: 

  --source-port 匹配报文源端口,或者源端口范围

  --sport

  --destionation-port 匹配报文目标端口,或则目标端口范围

  --dport

  --tcp-flags  mask  comp



例: --tcp-flags SYN,ACK,FIN,RST_SYN 表示要检查的标志位为 SYN,ACK,FIN,RST_SYN四个,其中SYN必须为1,其余必须为0

注:--SYN 用于匹配第一次握手,相当于--tcp-flags SYN,ACK,FIN,FIN,RST SYN


#iptables -A INPUT -p tcp  --tcp-flags SYN,FIN,ACK SYN

#iptables -A FROWARD -p tcp  --tcp-flags ALL SYN,ACK

上实例中第一个表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。第二个表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都检查,但是只有设置了SYN和ACK的匹配。 


udp:

  --source-port 匹配报文源端口或者范围

  --sport

  --destionation-port 匹配报文目标端口,可以为范围

  --dport



icmp: --icmp-type {type|code}

    0 表示响应报文

    8 表示请求报文



允许你ping别人

#iptables -A OUTPUT -s 172.16.100.7 -p icmp -icmp-type 8 -j ACCEPT (ping往出走)

#iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT (ping往回走)


不允许别人ping你

# iptables -A OUTPUT -s 192.168.139.2 -p icmp --icmp-type 0 -j REJECT

# iptables -A INPUT -d 192.168.139.2 -p icmp --icmp-type 8 -j REJECT

你ping别人为出8进0,别人ping你为出0进8



处理动作:

-j target_name [per-target-options]


  ACCEPT 接受

  DROP  丢弃报文

  REJECT 拒绝报文

  RETURN 返回调用链

  REDIRECT 端口重定向

  LOG 记录日志

  MARK 做防火墙标记

  DNAT 做目标地址转换

  SNAT 做源地址转换

  MASQUERDE 地址伪装



防火墙服务: service iptables start|stop|restart|status


默认规则文件:/etc/sysconfig/iptables


redhat7:  systemctl start|stop|restart|status firewalld.service


#iptables -t nat -F PREROUTING (清空nat表的PREROUTING链)

[root@node1 ~]# iptables -L  -n --line-numbers

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0   state RELATED,ESTABLISHED 

2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0   state NEW tcp dpt:22 

5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0   reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0   reject-with icmp-host-prohibited 


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source              destination         

1    ACCEPT     icmp --  192.168.139.2        0.0.0.0/0     cmp 

2    REJECT     icmp --  192.168.139.2        0.0.0.0/0     icmp type 0 reject-with icmp-port-unreachable 


[root@node1 ~]# iptables -D INPUT 5 将INPUT链上的第5个规则删除

[root@node1 ~]# iptables -D OUTPUT 1

[root@node1 ~]# iptables -D OUTPUT 2

    

[root@node1 ~]# iptables -N  mychain

[root@node1 ~]# iptables -L -n(自定义一个链叫mychain)

 

Chain mychain (0 references)

target     prot opt source               destination  

   

[root@node1 ~]# iptables -X mychain 删除自定义的规则mychain

[root@node1 ~]# iptables -t filter -A INPUT -s 192.168.139.4 -d 192.168.139.2 -j DROP


将来自192.168.139.4的所有包都丢掉,但192.168.139.4仍然可以ping通192.168.139.2


[root@node1 ~]# iptables -L -n --line-numbers -v

Chain INPUT (policy ACCEPT 6 packets, 468 bytes)

num   pkts bytes target   prot opt in  out   source      destination    

5     0   0   REJECT   all --  *   *    192.168.139.4  192.168.139.2       

  

num:规则号

  

pkts:被本规则匹配到的报文个数 

bytes:所有匹配的报文加起来的字节和 

target:对目标处理的机制

prot:协议

opt:额外选项

in:从哪个网卡进来的;*代表从任意网卡

out:从哪个网卡出来的;*代表从任意网卡


sour:源地址

desti:目标地址


[root@node1 ~]# iptables -t filter -R INPUT 1 -s 192.168.139.4 -d 192.168.139.2 -p icmp -j REJECT

将filter表中,INPUT链上的第一号规则替换为:拒绝来自192.168.139.4的icmp协议包

[root@node2 ~]# ping 192.168.139.2 用192.168.139.4ping不通

PING 192.168.139.2 (192.168.139.2) 56(84) bytes of data.

From 192.168.139.2 icmp_seq=1 Destination Port Unreachable

From 192.168.139.2 icmp_seq=2 Destination Port Unreachable

[root@node1 ~]# iptables -t filter -L -n --line-numbers -v

查看特定表(filter)上的规则

[root@node1 ~]# iptables -R INPUT 1 -s 192.168.139.4 -d 192.168.139.2 -p  icmp -i eth0 -j DROP


将INPUT链上的第一号规则替换为:将从eth0网卡进来的所有有关192.168.139.4的icmp报文都丢掉


[root@node2 ~]# ping 192.168.139.2 测试时一直卡在这里,连Destination Port Unreachable都没

PING 192.168.139.2 (192.168.139.2) 56(84) bytes of data.


[root@node2 ~]# iptables -t filter -A INPUT -s 192.168.139.4 -d 192.168.139.2 -p tcp --dport 22 -j DROP

不让192.168.139.4访问192.168.139.2(本机)的22号端口(即不能telnet本机)


[root@node2 ~]# rpm -ql iptables |grep "[[:lower:]]\+\.so$" 

[[:lower:]]小写字母 \+ 表示至少出现一次 \.so$ 表示以.so结尾

/lib64/xtables/libipt_icmp.so

/lib64/xtables/libxt_length.so

/lib64/xtables/libxt_limit.so

/lib64/xtables/libxt_string.so

/lib64/xtables/libxt_tcp.so

/lib64/xtables/libxt_time.so

/lib64/xtables/libxt_udp.so

......

上面全是系统自带的用于扩展匹配的模块


  1. multiport扩展

    指定多个源端端口 --source-ports, --sports 

  指定多个目标端口 --destionation-ports, --dports


[root@node2 ~]# iptables -t filter -A INPUT -s 192.168.139.0/16 -d 192.168.139.2 -p tcp -m multiport --dports 22,80 -j ACCEPT

允许192.168.139.0/16网段的主机访问本机的22和80端口


2.iprange扩展

  指明连续的(但一般不是整个网络)IP地址范围;

  --src-range from- :源IP地址

  --dst-range from- :目标IP地址


[root@node2 ~]# iptables -A INPUT -d 192.168.139.2 -p tcp --dport 80 -m iprange --src-range 192.168.139.1-192.168.139.20

允许192.168.139.1-192.168.139.20的主机访问192.168.139.2的80端口



3.string扩展

对报文中的应用层数据做字符串模式匹配检测(如检测是否含有敏感字符)

--aglo {bm|kpm}:字符串匹配检测算法

--string pattern:要检测的字符串模式


[root@node2 ~]# iptables -t filter -A OUTPUT -s 192.168.139.2 -d 192.168.139.0/24 -p tcp --sport 80 -m string --algo bm --string "caonima" -j REJECT


注:数据包出时源为本机

在OUTPUT链(在外出的链上进行filter匹配)上匹配"caonima"字符串


4.time扩展

根据报文到达的时间和指定的时间范围进行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]

--datestop  结束时间

--datestart  开始时间


[root@node2 ~]# iptables -A INPUT -s 192.168.139.0/24 -d 192.168.139.2 -p tcp  --dport 80 -m time --timestart 16:30 --timestop 16:30 --weekdays Sat,Sun -j DROP

注:Sat,Sun只有首字母大写

本机的web服务在周六、周天的16:30-18:30时间段不允许192.168.139.0/24 网段的用户访问


5.connlimit扩展

根据每客户端IP做并发连接数量匹配

--commlimit-upon  n 连接数小于n的时候匹配

--commlimit-above  n 连接数大于n时匹配

[root@node2 ~]# iptables -A INPUT -d 192.168.139.2 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT

允许来自同一个客户端的IP访问本机的21号端口(ftp)最多三次



6.limit扩展

基于收发报文的速率匹配  --limit rate [/second|/minute|/hour|/day] 平均速率

令牌桶过滤器 --limit-burst number 峰值速率


[root@node2 ~]# iptables -A INPUT -d 192.168.139.2 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT



允许对192.168.139.2(本机)每分钟ping三次,第一次ping五次


7.state扩展

根据连接追踪机制去检查连接的状态,与tcp协议无关,是在IP层有netfilter在内核中实现的,将访问者的ip,访问目标记录在内核中


如何判断从本地发出的响应时主动与别人连接还是只是对别人的请求发出响应?


用cootrack机制:追踪本机的请求和响应之间的关系

状态有以下几种:


NEW:新发出的请求,第一次发出的请求

ESTABLISHED:NEW状态后,连接追踪模板中为其建立的条目失效之前

RELATED:相关联的连接,如ftp协议命令连接和数据连接之间的关系

INVALID:无法识别的连接,无效连接

UNTRACKED:未进行追踪的连接



例:本地web服务器正常情况下只开放80端口进行用户请求的响应,而不应该主动去连接客户端。如果主动开放80端口与其他主机相连,则很有可能中了反弹射木马;这是你可以用iptables设定值允许本地80端口的报文只能是响应(ESTABLISHED)状态,而不能为NEW状态


[root@node1 ~]# iptables -A INPUT -d 192.168.139.2 -p tcp -m multiport --dports 20,80 -m state --state NEW,ESTABLISHED -j ACCEPT

进入本机的报文可以通过本机的20和80端口进入,且报文状态必须为NEW/ESTABLISHED

[root@node1 ~]# iptables -A OUTPUT -s 192.168.139.2 -p tcp -m multiport --sports 20,80 -m state --state ESTABLISHED -j ACCEPT

从本机出去的报文可以通过本机的20,80端口出去,但是报文状态必须为ESTABLISHED



自定义链:需要被内置链调用才能生效,自定义链需要定义返回规则,target为RETURN

#iptables -A INPUT -d 192.168.139.2 -p icmp -j in-icmp (转为自定义的链in-icmp)






[root@node1 ~]# iptables -N clean_in

创建一个叫clean_in的自定义链

[root@node1 ~]# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP


[root@node1 ~]# iptables -A clean_in -d 192.168.139.255 -p icmp -j DROP


[root@node1 ~]# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP

将syn不是1,但是状态为new的都丢弃

[root@node1 ~]# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

[root@node1 ~]# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

[root@node1 ~]# iptables -A clean_in -d 192.168.139.2 -j RETURN 都没有匹配返回主链

[root@node1 ~]# iptables -I INPUT -j clean_in 一进入INPUT链,先跳转到clean_in自定义链进行处理

[root@node1 ~]# iptables -L -n --line-numbers

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

1    clean_in   all  --  0.0.0.0/0            0.0.0.0/0           

2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 


Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 


Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination         


Chain clean_in (1 references)

num  target     prot opt source               destination         

1    DROP       icmp --  0.0.0.0/0            255.255.255.255     

2    DROP       icmp --  0.0.0.0/0            192.168.139.255     

3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:!0x17/0x02 state NEW 

4    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x3F/0x3F 

5    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x3F/0x00 

6    RETURN     all  --  0.0.0.0/0            192.168.139.2       


[root@node1 ~]# iptables -X clean_in

iptables: Too many links.

会发现,删除不掉,有引用必须取消引用,且要为空链才能删除


利于iptables的recent模块低于DOS攻击


–name #设定列表名称,默认DEFAULT。 

–rsource #源地址,此为默认。 

–rdest #目的地址 

–seconds #指定时间内 

–hitcount #命中次数 

–set #将地址添加进列表,并更新信息,包含地址加入的时间戳。 

–rcheck #检查地址是否在列表,以第一个匹配开始计算时间。 

–update #和rcheck类似,以最后一个匹配计算时间。 

–remove #在列表里删除相应地址,后跟列表名称及地址。



限制80端口60秒内每个IP只能发起10个新连接,超过记录日记并丢失数据包,可防CC及非伪造IP的syn flood

[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix ‘DDOS:‘ --log-ip-options

每个IP目标端口为80的新连接会记录在案,可在/proc/net/xt_recent/webpool中查看,rcheck检查此IP是否在案及请求次数,如果超过规则就丢弃数据包,否则进入下条规则并更新列表信息。


为了方便地对日志进行分析,可加上适当的记录日志前缀,即在IPtables中使用LOG选项,通过LOG 选项打开匹配数据包的内核记录功能。LOG 选项的子选项 --log-prefix 用来给记录信息添加一个消息前缀,这个前缀可设达 29 个字符。添加前缀的目的只是为了更好的辨别记录信息,比如更容易用 grep 这种工具过滤出匹配的记录信息。


限制80端口60秒内每个IP只能发起10个新连接,超出后会丢弃

[root@node1 ~]#iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP

将80端口的新连接的IP地址都添加进列表,并跟新信息,包含地址加入的时间戳,但会接受连接

[root@node1 ~]#iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT


NAT:network address translation(网络地址转换)

DNAT:目标地址转换

SNAT: 源地址转换


NAT:一个区域内只有一个主机可以访问换脸网(拥有公网IP),这是这个区域内的所有主机都可以将请求先发给这个拥有公网IP的主机,然后做一个SNAT,将报文的源IP改成这个公网IP,而报文不反悔时,NAT服务器通过查看记录的NAT表再做一个DNAT,将目标IP换成真正的主机IP,从而就可以上区域内的所有主机都实现上网


/proc/sys/net/ipv4/ip_forward == 1 则Linux服务器就具备了路由转发功能,这样可以让两个不同网段的主机(如192.16.10.0/24和172.16.0.0/16)通过linux服务器的转发实现通信,但这个服务器要有两个网卡,一个网卡的IP在192.16.10.0/24网段,另一个IP在172.16.0.0/16网段,这样就具备了路由转发功能


-j SNAT

  --to-source 指定转换的源地址


#iptables -t -nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7

来自192.168.10.0/24网段的都将源地址转换为172.16.100.7(172.16.100.7为公网ip)


例:教室中学生IP为192.168.0.0/24网段,通过ADSL进行拨号上网IP:123.2.3.2


#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 123.2.3.2


#iptables -t nat -A postROUTING -s 192.168.0.0/24 -O ppp0 -j SNAT --to-source 123.2.3.2

-O指定从哪个网卡出来,只有访问互联网时,才会使用ADSL的拨号网卡ppp0,如果有两个网卡则为ppp0,ppp1....



当有多个可以转换的IP时:

-j SNAT --to-source 123.2.3.2-123.2.3.5

则会将源地址转换成其中的任意一个IP



但是每次的拨号上网,地址可能会发生改变,咋办?

-j NAT 有个跟高级的 -j MASQUERADE

只有外网ip动态获取时使用



综合例子:

172.16.100.7上(NAT SERVER)

1.

#iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

对所有已经建立的连接都通过

2.

#iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT

对所有tcp的80端口新建立的连接都放行(允许其上网)

3.

#iptables -A FORWARD -s 192.168.0.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

192.168.0.0/24中的主机ping会将其转发给网段内主机,但是其他网段的向ping网段内的主机都会被前2个规则过滤掉


1、2、3规则允许192.168.10.0/24网段的所有主机上网,且允许其内部互ping,但不能通过外网访问192.168.0.0/24任意主机上的任意端口(服务)


4.

#iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

允许转发已经建立的连接和相关联的连接

RELATED:相关联的链接,如ftp协议中命令链接数据链接之间的关系


5.

#iptables -A FORWARD -s 192.168.139.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT

允许转发192.168.139.0/24网段访问21端口的建立新连接(ftp)



DNAT:目标地址转换


如我的内部网内有一台web服务器(192.168.0.22)和一台ftp服务器(192.168.10.23),web服务器和NAT服务器可以通信(172.16.100.7为一个公有IP),外部的主机可以通过访问172.16.100.7这个ip访问NAT服务器,如果请求的为80端口,则NAT服务器将请求报文做一个DNAT(将请求报文的目标地址由172.16.100.7换成192.168.0.22),转发至192.168.0.22web服务器,如果请求的为21端口,则NAT服务器做一个DNAT转换,将请求报文转发至192.168.0.23ftp服务器



#iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destionation 192.168.10.22

任何请求172.16.100.7的80端口的请求都转发至192.168.10.22主机

注:172.10.100.7只是一个NAT服务器,真正提供服务的为192.168.10.22主机


而且还支持端口转换

#iptables -t nat -A PREROUTONG -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destionation 192.168.10.22:8080

任何请求172.16.100.7的80端口的请求都转发至192.168.10.22的8080端口

#iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 21 -j DNAT --to -destionation 192.168.10.22 

任何请求172.16.100.7的80端口的请求都转发至192.168.10.23



如果要采取字符串匹配,则可以在NAT服务器的forward上设置

主:只有为转发就不能再INPUT|OUTPUT上设置


#iptables -t nat -A FORWARD -m string --aglo kmp --string "SB" -j DROP 

任何包含“SB”的报文都丢弃









本文出自 “11097124” 博客,请务必保留此出处http://11107124.blog.51cto.com/11097124/1901195

iptables详解