iptables 使用

本文介绍25个经常使用的iptables用法。若是你对iptables还不甚了解,能够参考上一篇iptables详细教程:基础、架构、清空规则、追加规则、应用实例,看完这篇文章,你就能明白iptables的用法和本文提到的基本术语。ios

1、iptables:从这里开始

删除现有规则

iptables -F
(OR)
iptables --flush

设置默认链策略

iptables的filter表中有三种链:INPUT, FORWARD和OUTPUT。默认的链策略是ACCEPT,你能够将它们设置成DROP。数据库

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

你须要明白,这样作会屏蔽全部输入、输出网卡的数据包,除非你明确指定哪些数据包能够经过网卡。服务器

屏蔽指定的IP地址

如下规则将屏蔽BLOCK_THIS_IP所指定的IP地址访问本地主机:网络

BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
(或者仅屏蔽来自该IP的TCP数据包)
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

容许来自外部的ping测试

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

容许从本机ping外部主机

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

容许环回(loopback)访问

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

2、iptables:协议与端口设定

容许全部SSH链接请求

本规则容许全部来自外部的SSH链接请求,也就是说,只容许进入eth0接口,而且目的端口为22的数据包架构

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

容许从本地发起的SSH链接

本规则和上述规则有所不一样,本规则意在容许本机发起SSH链接,上面的规则与此正好相反。tcp

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链接请求

如下规则仅容许来自192.168.100.0/24的网络:ide

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

上例中,你也可使用-s 192.168.100.0/255.255.255.0做为网络地址。固然使用上面的CIDR地址更容易让人明白。oop

仅容许从本地发起到指定网络的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

容许HTTP/HTTPS链接请求

# 1.容许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

# 2.容许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

容许从本地发起HTTPS链接

本规则能够容许用户从本地主机发起HTTPS链接,从而访问Internet。spa

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端口)。

-m multiport:指定多个端口

经过指定-m multiport选项,能够在一条规则中同时容许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

容许出站DNS链接

iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

容许NIS链接

若是你在使用NIS管理你的用户帐户,你须要容许NIS链接。即便你已容许SSH链接,你仍需容许NIS相关的ypbind链接,不然用户将没法登录。NIS端口是动态的,当ypbind启动的时候,它会自动分配端口。所以,首先咱们须要获取端口号,本例中使用的端口是853和850:

rpcinfo -p | grep ypbind

而后,容许链接到111端口的请求数据包,以及ypbind使用到的端口:

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会从新指派端口。咱们有两种解决方法:
1.为NIS使用静态IP地址
2.每次系统启动时调用脚本得到NIS相关端口,并根据上述iptables规则添加到filter表中去。

容许来自指定网络的rsync链接请求

你可能启用了rsync服务,可是又不想让rsync暴露在外,只但愿可以从内部网络(192.168.101.0/24)访问便可:

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

容许来自指定网络的MySQL链接请求

你可能启用了MySQL服务,但只但愿DBA与相关开发人员可以从内部网络(192.168.100.0/24)直接登陆数据库:

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

容许Sendmail, Postfix邮件服务

邮件服务都使用了25端口,咱们只须要容许来自25端口的链接请求便可。

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

容许IMAP与IMAPS

# IMAP:143
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:993
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

容许POP3与POP3S

# POP3:110
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:995
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

防止DoS***

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
  • -m limit: 启用limit扩展

  • –limit 25/minute: 容许最多每分钟25个链接

  • –limit-burst 100: 当达到100个链接后,才启用上述25/minute限制

3、转发与NAT

容许路由

若是本地主机有两块网卡,一块链接内网(eth0),一块链接外网(eth1),那么可使用下面的规则将eth0的数据路由到eht1:

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

DNAT与端口转发

如下规则将会把来自422端口的流量转发到22端口。这意味着来自422端口的SSH链接请求与来自22端口的请求等效。

# 1.启用DNAT转发
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to-destination 192.168.102.37:22

# 2.容许链接到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

假设如今外网网关是xxx.xxx.xxx.xxx,那么若是咱们但愿把HTTP请求转发到内部的某一台计算机,应该怎么作呢?

iptables -t nat -A PREROUTING -p tcp -i eth0 -d xxx.xxx.xxx.xxx --dport 8888 -j DNAT --to 192.168.0.2:80
iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT

当该数据包到达xxx.xxx.xxx.xxx后,须要将该数据包转发给192.168.0.2的80端口,事实上NAT所作的是修改该数据包的目的地址和目的端口号。而后再将该数据包路由给对应的主机。
可是iptables会接受这样的须要路由的包么?这就由FORWARD链决定。咱们经过第二条命令告诉iptables能够转发目的地址为192.168.0.2:80的数据包。再看一下上例中422端口转22端口,这是同一IP,所以不须要设置FORWARD链。

SNAT与MASQUERADE

以下命令表示把全部10.8.0.0网段的数据包SNAT成192.168.5.3的ip而后发出去:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j snat --to-source 192.168.5.3

对于snat,不论是几个地址,必须明确的指定要snat的IP。假如咱们的计算机使用ADSL拨号方式上网,那么外网IP是动态的,这时候咱们能够考虑使用MASQUERADE

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

负载平衡

能够利用iptables的-m nth扩展,及其参数(–counter 0 –every 3 –packet x),进行DNAT路由设置(-A PREROUTING -j DNAT –to-destination),从而将负载平均分配给3台服务器:

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

自定义的链

记录丢弃的数据包

# 1.新建名为LOGGING的链
iptables -N LOGGING# 2.将全部来自INPUT链中的数据包跳转到LOGGING链中
iptables -A INPUT -j LOGGING

# 3.指定自定义的日志前缀"IPTables Packet Dropped: "
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

# 4.丢弃这些数据包
iptables -A LOGGING -j DROP
相关文章
相关标签/搜索