25个常用的iptables命令

12/15/2016 | | Post a Comment

感觉这个25个命令挺常用的,而且有助于复习iptables,就写下来了。j_0059.gif

原文连接地址: http://www.thegeekstuff.com/2011/06/iptables-rules-examples

25个最常用的iptables命令

wKiom1fPspOTSuIYAACZbycK-yA330.png

乍一看,iptables可能有些神秘。

在这篇文章中,我已经复制/粘贴过来25个你最常用iptables命令。

在实际应用当中,你只需要针对实际遇到的问题对下面这些例子进行适当的调整即可。可以收藏起来以备不时之需哦!

为了便于参考,以下25个示例将以shell脚本的格式呈现出来。

1、清空已存在的规则

在你建立一套新的iptables规则时,你可能需要清空默认规则,或者已有规则,如下所示,使用iptables flush 命令可以满足你的需要:

iptables -F
(or)
iptables --flush

2、设置默认链规则

iptables命令默认规则是ACCEPT,设置INPUT,OUTPUT,FORWARD这些链的默认规则为DROP,命令如下:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

 如果你为OUTOUT和INPUT这两条链设置默认规则为DROP,当你设置规则时就需要考虑设置两条,一条控制进入的,一条控制出去的。

在以下所有的示例中,我们都将设置两条规则,因为我们为OUTPUT和INPUT这两条链设置的默认规则为DROP。

如果你信任你的内部用户,你可以忽略上述示例中的最后一条。默认不丢弃所有出去的数据。在这种情况下,你只需要针对进入的数据进行设置,当然所有出去的数据都是被允许的。

注意:如果你不了解iptables的各个链,可以通过这个链接学习下基本知识iptables chains

3、阻断一个IP地址

如果你想在我们进行更深入的学习之前阻断一个IP地址,你可以键入以下命令。把“x.x.x.x“改变成你想要阻断的IP地址。

BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP

如果你发现在日志文件中显示有一个固定的ip地址产生很多奇怪的活动,在你进行更深入的调查时,希望临时性的阻断此IP地址,那么此命令就是非常有用的。

你也可以通过简单的变化,来阻断此IP地址在eth0端口上所有基于TCP的连接:

iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

4、允许接入的SSH连接

以下的命令允许在eth0接口上接入的ssh连接:

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

注意:如果你想理解规则中每个参数的意义,你可以访问此链接How to Add IPTables Firewall Rules

5、允许来自指定网段的SSH的接入连接

以下命令是允许来自192.168.100.0/24网段的SSH的接入连接:

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

在以上的例子中,你也可以用全子网掩码192.168.100.0/255.255.255.0来代替192.168.100.0/24。

6、允许HTTP和HTTPS的入站连接

以下示例是允许入站的web服务连接(http服务端口为80):

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

以下示例是允许入站的安全的web服务连接(https服务端口为443):

iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

7、使用多端口扩展减少配置条目

如果你允许对多个端口的入站请求,你可以使用多端口扩展功能,而不必为每个端口都建立一条规则,如下:

以下的示例是允许外部连接对于本机SSH,HTTP,HTTPS三种服务的访问。

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

8、允许本地主机SSH服务的出站连接

如果你想通过SSH连接外部主机,你可以这样做:

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

请注意,这两条规则和SSH的入站连接有些不同,在出站请求OUTPUT链中有NEW,ESTABLISHED两种状态,而入站时候只有ESTABLISHED一种状态,这是因为传输控制协议(TCP)的特点造成的,SSH的入站连接也是此特点。

9、允许SSH对指定网络的出站连接

下面的示例是仅允许SSH服务出站连接到192.168.100.0/24网络地址段内的主机:

iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

10、允许对HTTPS服务的出站访问

下面的规则允许对HTTPS服务的出站访问,如果你允许你的用户可以使用WEB服务,那么这条规则是很有用的。如果你想在服务器上使用Wget命令在互联网上下载一些资源,那么这条命令也是起作用的。

iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

注意:http服务是80端口,https是443端口

11、负载均衡WEB入站请求

你也可以使用防火墙负载均衡对于web服务的入站请求。

这里演示nth扩展。下面的示例负载均衡https服务至三个不同的ip地址,每第三个数据包开始做目标地址转换。(但是请注意他们的初始值packet不同,下面的例子也就第一条中的ip地址会接入三个请求,下面两条会依次递减一此处笔者有些疑惑,man了下iptables也不是很清楚,尤其这个 –counter 0 的作用,如果大家比较理解nth,还请留言区留言,原文链接参考文章最底部)

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

12、允许外部主机PING通内部主机

下面的示例允许外部的用户PING通你内部的服务器:

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

13、允许内部主机PING通外部主机

下面的示例允许你从内部PING通外部的服务器

iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

14、允许本地环回地址的连接

你应该允许环回地址的连接,比如127.0.0.1地址的连接(以便TEST使用)

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

15、允许内部网络连接外部网络

如果你的防火墙服务器有两块网卡,一块eth0连接内网,一块eth1连接外网,使用下面的规则就可以放行内网向外网发起的连接请求(注意方向:内网—>外网):

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

16、允许对DNS服务的出站请求

下面的示例允许想外请求DNS服务:

iptables -A INPUT -p udp -d eth0 --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s eth0 --dport 53 -j ACCEPT

17、允许NIS连接

如何你正在使用NIS来管理你的用户账户,你应该方向NIS连接。尽管SSH已经被放行,如果你没有对NIS相关的ypbind服务放行,那么你的用户还是不能登录。

NIS服务的端口是动态的,当ypbind服务开始时分配端口。

首先用rpcinfo -p来查询实际使用的端口,下面的例子显示正在使用853和850端口。

rpcinfo -p | grep ypbind

也放行到111端口的入站请求:

iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
iptables -A INPUT -p udp --dport 850 -j ACCEPT

上面的示例在ypbind重启之后将会失效,应该端口将会重新分配。有两个解决办法,第一,为你的NIS服务器静态配置IP地址,第二,写一个完美的shell脚本,从“rpcinfo -p”中动态抓取端口号,并在iptables中使用。

18、允许来自指定网段的RSYNC

下面的示例允许来自指定网段的RSYNC:

iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

19、允许来自指定网段的对mysql服务的连接

如何你正在运行MySQL,一般来说你希望外部网络可以直连到mysql数据库。在多数情况下,在运行mysql服务器上同时还运行着Web服务。

然而,数据库管理员和程序开发人员可能通过安装在他们个人终端上的mysql客户端直连到数据库。在这种情况下,你就需要允许内部网络直连到数据库了。规则如下:

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

20、放行Sendmail和Postfix Traffic服务

下面的规则放行Sendmail,Postfix Traffic邮件服务:

iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

21、放行IMAP和IMAPS服务

下面的规则放行IMAP和IMAP2服务:

iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

下面的规则方向IMAPs服务:

iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

22、放行POP3和POP3s服务

放行POP3服务:

iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

放行POP3s服务:

iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT

23、阻止DoS攻击

下面的规则将帮助你的服务器避免DoS(Denial of Service)攻击:

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

在上面的例子中:

  • -m limit:声明使用limit扩展
  • -limit 25/minute:限制每分钟的服务请求数,可以根据你的实际需要进行调整
  • -limit-burst 100:这个是使用-limit 25/minute的前提条件,当总请求数达到100时开始执行每分钟25个请求数的限流

24、端口转发

下面的示例将访问端口442的连接路由至端口22。这个意味着ssh的入站连接可以发送至端口422和22。

iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

如果你如上面示例所做,你也需要明确地放行对422端口的入站连接:

iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

25、记录下丢弃的数据包

你可能希望去记录下所有的被拒绝的数据包,下面的规则应该卸载iptables的最下面。

首先,创建一个名称为LOGGING的心链:

iptables -N LOGGING

然后,确保其余的所有入站连接跳转到LOGGING链上,如下:

iptables -A INPUT -j LOGGING

随后,利用“log-prefix“来对所匹配的数据包进行注释,以免混淆:

iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

最后,丢弃这些包:

iptables -A LOGGING -j DROP

以上25种iptables规则都遵循shell脚本的格式 iptables-rules

由于个人能力有限,以上内容均为笔者个人理解,翻译过来只是希望更多的人看见,也有利于自己认真理解。

其实还是挺方便的,欢迎大家收藏!j_0019.gif无意发现已经有很多国内前辈译过本文,不过还是推荐大家阅读原文。

原文链接如下:http://www.thegeekstuff.com/2011/06/iptables-rules-examples



Want to say something? Post a comment

电子邮件地址不会被公开。 必填项已用*标注