iptables 使用简介

1. 常用语法

 iptables [-t <table>] [-I|-D|-A|-C|-R|-L] <chain> -p <protocol> --dport <port> -j DROP
 
 # 追加、检查、删除规则
 iptables [-t table] {-A|-C|-D} <chain> <rule-specification>
 # 插入规则
 iptables [-t table] -I <chain> [<rulenum>] <rule-specification>
 # 替换规则
 iptables [-t table] -R <chain> <rulenum> <rule-specification>
 # 删除规则
 iptables [-t table] -D <chain> <rulenum>
 # 持久化规则
 iptables [-t table] -S [<chain> [<rulenum>]]
 # 列举规则
 iptables [-t table] -L [<chain> [<rulenum>]] [options...]
 
 rule-specification = [matches...] [target]
 match = -m <matchname> [per-match-options]
 target = -j <targetname> [per-target-options]

其中:

  • -t <table>table 默认值为 filter,包含三种内建的 chainINPUTFORWARDOUTPUT

  • -A|-C|-D|-I|-R|-S|-L-A 追加规则,-C 检查规则,-D 表示删除规则,-I 表示插入规则,-R 替换规则,-S 持久化规则, -L 列举规则。

关于 rule-specification 的部分:

  • -p <protocol>:表示协议,比如 tcpudp

  • -s <address>[/<mask>][,...]:指定来源。

  • --dport <port>:目标端口。

  • -j <targetname>:包含ACCEPTDROPRETURN

2. 使用的简单示例

通常在设计分布式的模块时,都要考虑网络或者服务器故障时的降级与异常处理。因此使用 iptables 模拟网络故障就非常必要,下面给出一个简单的例子。

 # 首先启动一个 HTTP Server
 $ python -m SimpleHTTPServer
 Serving HTTP on 0.0.0.0 port 8000 ...
 
 # 列举所有 chain 
 $ sudo iptables -L
 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination
 
 Chain FORWARD (policy ACCEPT)
 target     prot opt source               destination
 
 Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination
 
 # curl 一下
 $ curl localhost:8000
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
 <title>Directory listing for /</title>
 <body>
 <h2>Directory listing for /</h2>
 <hr>
 <ul>
 <li><a href=".bash_logout">.bash_logout</a>
 <li><a href=".bashrc">.bashrc</a>
 <li><a href=".lesshst">.lesshst</a>
 <li><a href=".profile">.profile</a>
 <li><a href=".ssh">.ssh</a>
 </ul>
 <hr>
 </body>
 </html>
 
 # 禁止 8000 端口入流量
 $ sudo iptables -I INPUT -p tcp --dport 8000 -j DROP
 
 # 再列举一下所有 chain
 $ sudo iptables -L
 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination
 DROP       tcp  --  anywhere             anywhere             tcp dpt:8000
 
 Chain FORWARD (policy ACCEPT)
 target     prot opt source               destination
 
 Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination
 
 # 再次 curl 一下
 $ curl localhost:8000
 curl: (7) Failed to connect to localhost port 8000: Connection timed out
 
 # 删除禁用规则
 $ sudo iptables -D INPUT -p tcp --dport 2554 -j DROP

3. 参考资料

发表评论