前言
iptables详解跳转blog:iptables介绍
iptables策略跳转blog:iptables策略
iptables文档:iptables(8) - Linux man page
iptables指南:iptables-tutorial
命令图文表示
1
| iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
|
Table 指定表名,可以不用特意指定表,默认使用filter表执行所有命令
filter(包过滤)、nat(网路地址转换)、mangle(包重构、修改)、raw(数据跟踪处理)
command 告诉程序做什么,比如插入规则,删除规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| -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)
|
选择规则链
选择参数
1 2 3 4 5 6 7
| -p 匹配协议,如TCP、UDP、ICMP -s 匹配来源地址 IP/MASK,加!表示除去这个ip -d 匹配目标地址 -i 网卡名称 匹配从这块网卡流入的数据 -o 网卡名称 匹配从这块网卡流出的数据 -dport num 匹配目标端口号 -sport num 匹配来源端口号
|
target目标动作,选择处理数据包的方式。(target必须在最后)
规则链:
- INPUT——进来的数据包应用此规则链中的策略
- OUTPUT——外出的数据包应用此规则链中的策略
- FORWARD——转发数据包时应用此规则链中的策略
- PREROUTING——对数据包作路由选择前应用此链中的规则
(所有的数据包进来的时侯都先由这个链处理)
- POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)
防火墙处理数据包的方式
ACCEPT : 允许数据包通过
DROP : 直接丢弃数据包,不给任何回应信息
REJECT : 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG : 在/var/log/messages
文件中记录日志信息,然后将数据包传递给下一条规则
规则保存与恢复
1
| iptables-save > /etc/sysconfig/iptables
|
1 2
| service iptables save # 将规则保存在/etc/sysconfig/iptables
|
删除规则举例
1 2
| # 删除input链的第一条规则 iptables -D INPUT 1
|
常用的Linux iptables规则
以下规则看一下熟悉就好了,忘记了直接用iptables --help
查看
删除所有现有规则
设置默认的 chain 策略
阻止某个特定的 IP 地址
1
| iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
|
允许全部进来的(incoming)SSH
1
| iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
|
只允许某个特定网络进来的 SSH
1
| iptables -A INPUT -i eth0 -p tcp -s 192.168.200.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
|
允许进来的(incoming)HTTP
1
| iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
|
多端口(允许进来的 SSH、HTTP 和 HTTPS)
1
| iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
|
允许出去的(outgoing)SSH
1
| iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
|
允许外出的(outgoing)SSH,但仅访问某个特定的网络
1
| iptables -A OUTPUT -o eth0 -p tcp -d 192.168.101.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
|
允许外出的(outgoing) HTTPS
1
| iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
|
对进来的 HTTPS 流量做负载均衡
1
| 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
|
1
| 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
|
1
| 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
1
| iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
|
1
| iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
|
从外部向内部 Ping
1
| iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
|
1
| iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
|
允许环回(loopback)访问
1
| iptables -A INPUT -i lo -j ACCEPT
|
1
| iptables -A OUTPUT -o lo -j ACCEPT
|
允许 packets 从内网访问外网
1
| if eth1 is connected to external network (internet)
|
1
| if eth0 is connected to internal network (192.168.1.x)
|
1
| iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
|
允许外出的 DNS
1
| iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
|
1
| iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
|
允许 NIS 连接
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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 进入本机
1
| iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
|
仅允许来自某个特定网络的 MySQL 的链接
1
| iptables -A INPUT -i eth0 -p tcp -s 192.168.200.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
|
允许 Sendmail 或 Postfix
1
| iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
|
允许 IMAP 和 IMAPS
1 2 3 4 5 6 7
| 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
1 2 3 4 5 6 7
| 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 攻击
1
| iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
|
设置 422 端口转发到 22 端口
1
| iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
|
1
| iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
|
1
| iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
|
为丢弃的包做日志(Log)
1 2 3 4 5 6 7
| 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