<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post//</link>
<title><![CDATA[iptables-25个常用用法]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[博客首页]]></category>
<pubDate>Sun, 22 Sep 2013 03:26:07 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	本文介绍25个常用的iptables用法。如果你对iptables还不甚了解，可以参考上一篇iptables详细教程：基础、架构、清空规则、追加规则、应用实例，看完这篇文章，你就能明白iptables的用法和本文提到的基本术语。<br/><br/>一、iptables：从这里开始<br/><br/>删除现有规则<br/><br/>iptables -F&nbsp;&nbsp;&nbsp;&nbsp;(OR)&nbsp;&nbsp;iptables --flush<br/><br/>设置默认链策略<br/><br/>iptables的filter表中有三种链：INPUT, FORWARD和OUTPUT。默认的链策略是ACCEPT，你可以将它们设置成DROP。<br/><br/>iptables -P INPUT DROP<br/><br/>iptables -P FORWARD DROP<br/><br/>iptables -P OUTPUT DROP<br/><br/>你需要明白，这样做会屏蔽所有输入、输出网卡的数据包，除非你明确指定哪些数据包可以通过网卡。<br/><br/>屏蔽指定的IP地址<br/><br/>以下规则将屏蔽BLOCK_THIS_IP所指定的IP地址访问本地主机：<br/><br/>BLOCK_THIS_IP="x.x.x.x"<br/><br/>iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP<br/><br/>(或者仅屏蔽来自该IP的TCP数据包）<br/><br/>iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP<br/><br/>允许来自外部的ping测试<br/><br/>iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT<br/><br/>iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT<br/><br/>允许从本机ping外部主机<br/><br/>iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT<br/><br/>iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT<br/><br/>允许环回(loopback)访问<br/><br/>iptables -A INPUT -i lo -j ACCEPT<br/><br/>iptables -A OUTPUT -o lo -j ACCEPT<br/><br/>二、iptables：协议与端口设定<br/><br/>允许所有SSH连接请求<br/><br/>本规则允许所有来自外部的SSH连接请求，也就是说，只允许进入eth0接口，并且目的端口为22的数据包<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT<br/><br/>允许从本地发起的SSH连接<br/><br/>本规则和上述规则有所不同，本规则意在允许本机发起SSH连接，上面的规则与此正好相反。<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT<br/><br/>仅允许来自指定网络的SSH连接请求<br/><br/>以下规则仅允许来自192.168.100.0/24的网络：<br/><br/>iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT<br/><br/>上例中，你也可以使用-s 192.168.100.0/255.255.255.0作为网络地址。当然使用上面的CIDR地址更容易让人明白。<br/><br/>仅允许从本地发起到指定网络的SSH连接请求<br/><br/>以下规则仅允许从本地主机连接到192.168.100.0/24的网络：<br/><br/>iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT<br/><br/>允许HTTP/HTTPS连接请求<br/><br/># 1.允许HTTP连接：80端口<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT<br/><br/># 2.允许HTTPS连接：443端口<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT<br/><br/>允许从本地发起HTTPS连接<br/><br/>本规则可以允许用户从本地主机发起HTTPS连接，从而访问Internet。<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT<br/><br/>类似的，你可以设置允许HTTP协议（80端口）。<br/><br/>-m multiport：指定多个端口<br/><br/>通过指定-m multiport选项，可以在一条规则中同时允许SSH、HTTP、HTTPS连接：<br/><br/>iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT<br/><br/>允许出站DNS连接<br/><br/>iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT<br/><br/>iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT<br/><br/>允许NIS连接<br/><br/>如果你在使用NIS管理你的用户账户，你需要允许NIS连接。即使你已允许SSH连接，你仍需允许NIS相关的ypbind连接，否则用户将无法登陆。NIS端口是动态的，当ypbind启动的时候，它会自动分配端口。因此，首先我们需要获取端口号，本例中使用的端口是853和850：<br/><br/>rpcinfo -p &#124; grep ypbind<br/><br/>然后，允许连接到111端口的请求数据包，以及ypbind使用到的端口：<br/><br/>iptables -A INPUT -p tcp --dport 111 -j ACCEPT<br/><br/>iptables -A INPUT -p udp --dport 111 -j ACCEPT<br/><br/>iptables -A INPUT -p tcp --dport 853 -j ACCEPT<br/><br/>iptables -A INPUT -p udp --dport 853 -j ACCEPT<br/><br/>iptables -A INPUT -p tcp --dport 850 -j ACCEPT<br/><br/>iptables -A INPUT -p udp --dport 850 -j ACCEPT<br/><br/>以上做法在你重启系统后将失效，因为ypbind会重新指派端口。我们有两种解决方法：<br/><br/>1.为NIS使用静态IP地址<br/><br/>2.每次系统启动时调用脚本获得NIS相关端口，并根据上述iptables规则添加到filter表中去。<br/><br/>允许来自指定网络的rsync连接请求<br/><br/>你可能启用了rsync服务，但是又不想让rsync暴露在外，只希望能够从内部网络（192.168.101.0/24）访问即可：<br/><br/>iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT<br/><br/>允许来自指定网络的MySQL连接请求<br/><br/>你可能启用了MySQL服务，但只希望DBA与相关开发人员能够从内部网络（192.168.100.0/24）直接登录数据库：<br/><br/>iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT<br/><br/>允许Sendmail, Postfix邮件服务<br/><br/>邮件服务都使用了25端口，我们只需要允许来自25端口的连接请求即可。<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT<br/><br/>允许IMAP与IMAPS<br/><br/># IMAP：143<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT<br/><br/># IMAPS：993<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT<br/><br/>允许POP3与POP3S<br/><br/># POP3：110<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT<br/><br/># POP3S：995<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT<br/><br/>防止DoS攻击<br/><br/>iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT<br/><br/>-m limit: 启用limit扩展<br/><br/>–limit 25/minute: 允许最多每分钟25个连接<br/><br/>–limit-burst 100: 当达到100个连接后，才启用上述25/minute限制<br/><br/>三、转发与NAT<br/><br/>允许路由<br/><br/>如果本地主机有两块网卡，一块连接内网(eth0)，一块连接外网(eth1)，那么可以使用下面的规则将eth0的数据路由到eht1：<br/><br/>iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT<br/><br/>DNAT与端口转发<br/><br/>以下规则将会把来自422端口的流量转发到22端口。这意味着来自422端口的SSH连接请求与来自22端口的请求等效。<br/><br/># 1.启用DNAT转发<br/><br/>iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to-destination 192.168.102.37:22<br/><br/># 2.允许连接到422端口的请求<br/><br/>iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT<br/><br/>iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT<br/><br/>假设现在外网网关是xxx.xxx.xxx.xxx，那么如果我们希望把HTTP请求转发到内部的某一台计算机，应该怎么做呢？<br/><br/>iptables -t nat -A PREROUTING -p tcp -i eth0 -d xxx.xxx.xxx.xxx --dport 8888 -j DNAT --to 192.168.0.2:80<br/><br/>iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT<br/><br/>当该数据包到达xxx.xxx.xxx.xxx后，需要将该数据包转发给192.168.0.2的80端口，事实上NAT所做的是修改该数据包的目的地址和目的端口号。然后再将该数据包路由给对应的主机。<br/><br/>但是iptables会接受这样的需要路由的包么？这就由FORWARD链决定。我们通过第二条命令告诉iptables可以转发目的地址为192.168.0.2:80的数据包。再看一下上例中422端口转22端口，这是同一IP，因此不需要设置FORWARD链。<br/><br/>SNAT与MASQUERADE<br/><br/>如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去：<br/><br/>iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j snat --to-source 192.168.5.3<br/><br/>对于snat，不管是几个地址，必须明确的指定要snat的IP。假如我们的计算机使用ADSL拨号方式上网，那么外网IP是动态的，这时候我们可以考虑使用MASQUERADE<br/><br/>iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE<br/><br/>负载平衡<br/><br/>可以利用iptables的-m nth扩展，及其参数（–counter 0 –every 3 –packet x），进行DNAT路由设置（-A PREROUTING -j DNAT –to-destination），从而将负载平均分配给3台服务器：<br/><br/>iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443<br/><br/>iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443<br/><br/>iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443<br/><br/>自定义的链<br/><br/>记录丢弃的数据包<br/><br/># 1.新建名为LOGGING的链<br/><br/>iptables -N LOGGING<br/><br/># 2.将所有来自INPUT链中的数据包跳转到LOGGING链中<br/><br/>iptables -A INPUT -j LOGGING<br/><br/># 3.指定自定义的日志前缀"IPTables Packet Dropped: "<br/><br/>iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7<br/><br/># 4.丢弃这些数据包<br/><br/>iptables -A LOGGING -j DROP<br/>Tags - <a href="http://www.zhanghaijun.com/tags/iptables/" rel="tag">iptables</a> , <a href="http://www.zhanghaijun.com/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] iptables-25个常用用法]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>