一、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> 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> </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> 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,如需转载请自行联系原作者