前言

iptables详解跳转blog:iptables介绍

iptables策略跳转blog:iptables策略

iptables文档:iptables(8) - Linux man page

iptables指南:iptables-tutorial

命令图文表示

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]

  1. Table 指定表名,可以不用特意指定表,默认使用filter表执行所有命令

    filter(包过滤)、nat(网路地址转换)、mangle(包重构、修改)、raw(数据跟踪处理)

  2. command 告诉程序做什么,比如插入规则,删除规则

    -A 在指定链的末尾添加(append)一条新的规则
    
    -D  删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
    
    -I  在指定链中插入(insert)一条新的规则,默认在第一行添加
    
    -R  修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
    
    -L  列出(list)指定链中所有的规则进行查看
    
    -E  重命名用户定义的链,不改变链本身
    
    -F  清空(flush)
    
    -N  新建(new-chain)一条用户自己定义的规则链
    
    -X  删除指定表中用户自定义的规则链(delete-chain)
    
    -P  设置指定链的默认策略(policy)
    
    -Z 将所有表的所有链的字节和数据包计数器清零
    
    -n  使用数字形式(numeric)显示输出结果
    
    -v  查看规则表详细信息(verbose)的信息
    
    -V  查看版本(version)
    
    -h  获取帮助(help)
    
  3. 选择规则链

  4. 选择参数

    -p   匹配协议,如TCP、UDP、ICMP
    -s   匹配来源地址 IP/MASK,加!表示除去这个ip
    -d   匹配目标地址
    -i 网卡名称  匹配从这块网卡流入的数据   
    -o 网卡名称  匹配从这块网卡流出的数据
    -dport num  匹配目标端口号
    -sport num  匹配来源端口号
    
  5. target目标动作,选择处理数据包的方式。(target必须在最后)


规则链:

  1. INPUT——进来的数据包应用此规则链中的策略
  2. OUTPUT——外出的数据包应用此规则链中的策略
  3. FORWARD——转发数据包时应用此规则链中的策略
  4. PREROUTING——对数据包作路由选择前应用此链中的规则

(所有的数据包进来的时侯都先由这个链处理)

  1. POSTROUTING——对数据包作路由选择后应用此链中的规则

(所有的数据包出来的时侯都先由这个链处理)


防火墙处理数据包的方式

ACCEPT : 允许数据包通过

DROP : 直接丢弃数据包,不给任何回应信息

REJECT : 拒绝数据包通过,必要时会给数据发送端一个响应的信息。

LOG : 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

规则保存与恢复

iptables-save > /etc/sysconfig/iptables
service iptables save
# 将规则保存在/etc/sysconfig/iptables

删除规则举例

# 删除input链的第一条规则
iptables -D INPUT 1

常用的Linux iptables规则

以下规则看一下熟悉就好了,忘记了直接用iptables --help查看

删除所有现有规则

iptables -F

设置默认的 chain 策略

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

阻止某个特定的 IP 地址

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

允许全部进来的(incoming)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

只允许某个特定网络进来的 SSH

iptables -A INPUT -i eth0 -p tcp -s 192.168.200.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

允许进来的(incoming)HTTP

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

多端口(允许进来的 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

允许出去的(outgoing)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

允许外出的(outgoing)SSH,但仅访问某个特定的网络

iptables -A OUTPUT -o eth0 -p tcp -d 192.168.101.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

允许外出的(outgoing) HTTPS

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

对进来的 HTTPS 流量做负载均衡

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

从内部向外部 Ping

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

从外部向内部 Ping

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

允许环回(loopback)访问

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

允许 packets 从内网访问外网

if eth1 is connected to external network (internet)
if eth0 is connected to internal network (192.168.1.x)
iptables -A FORWARD -i eth0 -o eth1 -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 连接

rpcinfo -p | grep ypbind ; This port is 853 and 850

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

允许某个特定网络 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

仅允许来自某个特定网络的 MySQL 的链接

iptables -A INPUT -i eth0 -p tcp -s 192.168.200.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

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

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

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

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

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

设置 422 端口转发到 22 端口

iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
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

为丢弃的包做日志(Log)

iptables -N LOGGING

iptables -A INPUT -j LOGGING

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

iptables -A LOGGING -j DROP

参考链接

iptables规则

iptables官方文档说明

iptables(8) - Linux man page

iptables-tutorial

评论