iptables常用规则:屏蔽IP地址、禁用ping、协议设置、NAT与转发、负载平衡、自定义链

9,937次阅读
没有评论

iptables 常用规则:屏蔽 IP 地址、禁用 ping、协议设置、NAT 与转发、负载平衡、自定义链

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

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

二、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 连接,上面的规则与此正好相反。

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 的网络:

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 地址更容易让人明白。

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

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

三、转发与 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

转自:http://lesca.me/archives/iptables-examples.html

正文完
 
VPSWe
版权声明:本站原创文章,由 VPSWe 2015-04-27发表,共计6620字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码