iptables笔记

平时我们在概念中称呼iptables为防火墙的近义词,何况又有/etc/init.d/iptables (start|stop)这样的启动和停止的命令,那么就感觉上似乎iptables一直在工作,它仿佛应该是一个daemon进程。但其实iptables是一个工具,用户通过iptables配置内核中的netfilter模块的规则。配置完之后iptables进程就退出了,内核中的netfilter模块持续使用它的规则表继续工作。所以平时在ps -ef命令中是不会看到iptables的进程的。

iptables中有链(chain)和规则的概念。
iptables中默认有5个chain,分别是PREROUTING,INPUT, FORWARD, OUTPUT, POSTROUTING。这5个chain的场景就如字面意思,比如input就是数据包流入。

每个chain下面可以有多个规则。规则是顺序敏感的,对数据包的处理由第一条规则开始匹配。
每个chain都有一个policy,这个policy指的是默认策略,即没有规则匹配到一个数据包时,应该如何处理。一般是DROP或者ACCEPT。

iptables命令:
 格式 : iptables [-t table] COMMAND chain CRETIRIA -j ACTION
 以下逐个解释:
-t 后边跟的是选择哪个规则表。 规则表可选的有: filter, nat和mangle。
COMMAND: 常用的command有:
    -P 设置policy。 例如: iptables -P INPUT DROP (设置INPUT chain的policy为DROP)
    -F 清空规则。
    -A 在chain的规则最后增加一条规则。
    -I {num} 插入为第num条规则。(num从1开始,不是从0开始)
    -D {num} 删除第num条规则。
    -R {num} 修改第n条规则。
    -L 查看规则列表。 通常增加-n子参数(代表显示端口号和ip地址,不反解为协议名或主机名)。
CRETIRIA: 匹配标准。常用的有:
    -s {ip}: 匹配源地址。
    -d {ip}: 匹配目标地址。
    -i {ethx}: 匹配从ethx网卡的流入数据。
    -o {ethx}: 匹配从ethx网卡的流出数据。
    扩展规则:
        -p tcp --dport 21 : 匹配tcp目标端口21. (也可用x1-x2表示配置从x1-x2的连续端口)
        -p tcp --sport {port} : 匹配tcp源端口为{port}。
        同理-p udp扩展下也有--dport和--sport可以匹配端口。
        -p icmp下有--icmp-type子扩展,8表示ping请求,0表示ping响应。
-j ACTION: 指定如何进行处理。常用的有:
    DROP: 丢弃。(不给任何响应)
    REJECT: 拒绝。(响应)
    ACCEPT: 接受。

注意, iptables的规则都是实时生效,所以操作一定要慎重。稍有不慎可能会直接导致无法连接远程主机,那么连改回去的机会都没有了。
规则会实时生效,但是并不会保存。 重启之后会恢复为之前的规则。 如需保存,需要指定/etc/init.d/iptables save。

示例:

iptables -L -n

查看当前iptables规则。

iptables -P INPUT ACCEPT

设置chain INPUT的policy为ACCEPT(当INPUT chain的数据包没有任何规则匹配时,默认采用accept策略)

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

允许80端口被访问。

iptables -I INPUT 5 -p tcp --dport 3306 -j ACCEPT

允许3306端口被访问。这条规则插入到INPUT链中,作为第5条规则。

iptables -D INPUT 6

删除INPUT链中的第6条规则。(序号从1开始)

iptables -R INPUT 6 -j DROP

修改INPUT链中的第6条规则,把处理方式改为DROP。

下面附上linode为用户推荐的一个iptables配置。可以在此基础上修改定制。

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

上述文件保存在 /etc/iptables.rules, 那么可以用 iptables-restore < /etc/iptables.rules 导入。

参考文章:

https://www.linode.com/docs/security/securing-your-server

http://blog.chinaunix.net/uid-22780578-id-3346350.html

http://www.cnblogs.com/jembai/archive/2009/03/19/1416364.html

(全文完)

《iptables笔记》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注