iptables最常用的规则示例

iptables v1.4.21

iptables基础

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

iptables和netfilter的关系:

Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。

iptables传输数据包的过程:    

可以简单理解为:

1.若数据包是发送到本机,则经过PREROUTING-->INPUT;

2.若数据包是需要本机转发,则经过PREROUTING-->FORWORD-->POSTROUTING;

3.若数据包是本机发出的,则要经过OUTPUT-->POSTROUTING.

iptables的规则表和链:

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

规则表与链的关系

1.filter表——三个链:INPUT、FORWARD、OUTPUT

作用:过滤数据包  内核模块:iptables_filter.

2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT

作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)

4.Raw表——两个链:OUTPUT、PREROUTING

作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw

表的一般顺序:Raw——mangle——nat——filter。

Commands:
  --append          -A chain                    Append to chain
  --check            -C chain                    Check for the existence of a rule
  --delete            -D chain                    Delete matching rule from chain
  --delete            -D chain rulenum           Delete rule rulenum (1 = first) from chain
  --insert             -I chain [rulenum]         Insert in chain as rulenum (default 1=first)
  --replace           -R chain rulenum          Replace rule rulenum (1 = first) in chain
  --list                 -L [chain [rulenum]]         List the rules in a chain or all chains
  --list-rules        -S [chain [rulenum]]      Print the rules in a chain or all chains
  --flush              -F [chain]                      Delete all rules in  chain or all chains
  --zero                -Z [chain [rulenum]]     Zero counters in chain or all chains
  --new                -N chain                       Create a new user-defined chain
  --delete-chain    -X [chain]                     Delete a user-defined chain
  --policy              -P chain target                 Change policy on chain to target
  --rename-chain  -E old-chain new-chain      Change chain name, (moving any references)

  Options:
    --ipv4                  -4                           Nothing (line is ignored by ip6tables-restore)
    --ipv6                  -6                           Error (line is ignored by iptables-restore)
[!] --protocol           -p proto                   protocol: by number or name, eg. `tcp',‘udp’
[!] --source             -s address[/mask][...]    source specification
[!] --destination      -d address[/mask][...]    destination specification
[!] --in-interface      -i input name[+]           network interface name ([+] for wildcard)
    --jump                -j target                    target for rule (may load target extension:ACCEPT, DROP, QUEUE, RETURN,MASQUERADE)
    --goto                -g chain                      jump to chain with no return
    --match             -m match                   extended match (may load extension)
    --numeric          -n                            numeric output of addresses and ports
[!] --out-interface   -o output name[+]         network interface name ([+] for wildcard)
    --table               -t table                    table to manipulate (default: `filter')
    --verbose           -v                            verbose mode
    --wait                -w [seconds]               wait for the xtables lock
    --line-numbers                                print line numbers when listing
    --exact               -x                           expand numbers (display exact values)
[!] --fragment        -f                            match second or further fragments only
    --modprobe=<command>                      try to insert modules using this command
    --set-counters PKTS BYTES                   set the counter during insert/append
[!] --version           -V                            print package version.

语法:

iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数
-P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,icmp
--dport num 匹配目标端口号
--sport num 匹配来源端口号

示例:

1、删除现有规则

在开始建立新的规则之前,您可能需要清理所有默认规则和现有规则。使用iptables如下所示的命令来做这个。

iptables -F       #警告:当前命令后将切断linux对外的一切端口请求,请确保你还能连接到vnc或主机上
(or)
iptables --flush

2、设置默认链策略

默认的iptables策略是ACCEPT。将此更改为如下所示。

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

当将INPUT和OUTPUT默认策略作为DROP时,对于每一个防火墙规则要求都应该定义两条规则。即一个INPUT和一个OUTPUT。
如果信任内部用户,则可以忽略上面OUTPUT的设置。默认情况下,不要丢弃所有OUTPUT的数据包。在这种情况下,对于每一个防火墙规则的要求,你只需要定义一个规则。即定义规则传入,因为传出是接受所有数据包。

3、阻止一个特定的IP地址

在我们做其他规则前,如果你想阻止一个特定的IP地址,你应该先做如下所示。当您在日志文件中找到特定的IP地址时发现一些奇怪的活动,并希望在进一步研究时暂时阻止该IP地址,这将很有帮助。

BLOCK_THIS_IP="192.168.1.108"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP

你也可以使用下面的一种规则。

iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP           //规则禁止这个IP地址对我们服务器eth0网卡的所有连接
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP   //规则只禁止这个IP地址对我们服务器eth0网卡的tcp协议的连接

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

5.只能从一个特定的网络允许传入的SSH

下面的规则只允许从网络192.168.100.X传入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

6.允许传入的HTTP和HTTPS

以下规则允许所有传入的网络流量。即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

下面的规则允许所有传入安全的网络流量。即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.允许OUTPUT SSH

以下规则允许传出ssh连接。也就是说当你从内ssh到外部服务器。

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT  //允许双方新建立的OUTPUT链通信
iptables -A INPUT  -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT      //只允许双方已经建立的INPUT链通信 

9.允许拨出SSH到特定网络

下面的规则只允许特定的网络传出的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

以下规则允许传出安全的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 Web流量,增加两个额外的规则就像上面,并改变443 80。

11.负载均衡传入的Web流量

您也可以加载使用iptables防火墙规则平衡传入的网络流量。

This uses the iptables nth extension. The following example load balances the HTTPS traffic to three different ip-address. 
For every 3th packet, it is load balanced to the appropriate server (using the counter 0). 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 OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT  -p icmp --icmp-type echo-reply -j ACCEPT

14.允许环回访问

您应该允许在服务器上进行完全环回访问。即使用127.0.0.1访问

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

15.允许内部网络到外部网络

在防火墙服务器上,一个以太网卡连接到外部网络,另一个以太网卡连接到内部服务器,请使用以下规则允许内部网络与外部网络通信。

//在此示例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

16.允许出站DNS

以下规则允许传出DNS连接。

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

17.允许NIS连接

如果您正在运行NIS(网络信息服务)来管理您的用户帐户,您应该允许NIS连接。即使允许SSH连接,如果您不允许NIS相关的ypbind连接,用户将无法登录。

NIS端口是动态的。即当ypbind启动时,它分配端口。(ypbind是定义NIS服务器的客户端进程。)

//首先做一个rpcinfo -p如下所示并获取端口号。在此示例中,它使用端口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)使用静态ip地址为您的NIS,或2)使用一些聪明的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数据库的同一服务器上运行Web服务器。

但是DBA和开发人员可能需要使用MySQL客户端从他们的笔记本电脑和桌面直接登录到MySQL。在这种情况下,您可能希望允许内部网络直接与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流量

以下规则允许邮件通信。它可以是sendmail或postfix。

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

以下iptables规则将帮助您防止对您的Web服务器的拒绝服务(DoS)攻击。

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

在上面的例子中:
  -m limit:这使用限制iptables扩展
  -limit 25 /分钟:每分钟最多只能连接25个请求包。根据您的具体要求更改此值
  -limit-burst 100:此值指示仅在连接的总数达到limit之后才实施限制/分钟

注意“-m limit”只匹配数据包而不是连接,所以上方例子中你将匹配25包每分钟。

如果是想限制每分钟下connect次数呢。限制连接数的解决方案是使用connlimit匹配。

iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 15 –connlimit-mask 32 -j REJECT –reject-with tcp-reset

它将拒绝来自一个源IP的15以上的连接 - 一个很好的规则来保护Web服务器。

此外,当与“hashlimit” 结合后在保护免受DDoS攻击时效果更好。

使用“limit”匹配,您可以限制每个时间间隔的数据包的全局速率,但是使用“hashlimit”,您可以限制每个IP,每个组合IP +端口等。

所以一个Web服务器的例子将是这样:

iptables -A INPUT -p tcp –dport 80 -m hashlimit –hashlimit 45/sec –hashlimit-burst 60 
–hashlimit-mode srcip–hashlimit-name DDOS
–hashlimit-htable-size 32768
–hashlimit-htable-max 32768
–hashlimit-htable-gcinterval 1000
–hashlimit-htable-expire 100000
-j ACCEPT

24. 端口转发

例:将来自422端口的流量全部转到22端口。

这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。

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 ACCEPTiptables -A OUTPUT 
-o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

25. 记录丢弃的数据表

iptables -N LOGGING   //1.新建名为LOGGING的链
iptables -A INPUT -j LOGGING  //2.将所有来自INPUT链中的数据包跳转到LOGGING链中
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7  
//3.为这些包自定义个前缀,命名为”IPTables Packet Dropped” iptables -A LOGGING -j DROP //4.丢弃这些数据包 

 

参考:

http://www.linuxidc.com/Linux/2014-03/99159p2.htm

http://blog.csdn.net/yeqihong/article/details/1489407

https://www.cnblogs.com/bill1015/p/6847841.html

 

posted @ 2018-01-24 01:54  EasonJim  阅读(11674)  评论(0编辑  收藏  举报