iptables
对于任何一个操作系统,防止被攻击,被入侵,防火墙的作用是至关重要的。
下文将 iptables 的 关键用法讲解清楚。
基本概念
iptables 流程图
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
+
|
v
+-------------+ +------------------+
|table: filter| <---+ | table: nat |
|chain: INPUT | | | chain: PREROUTING|
+-----+-------+ | +--------+---------+
| | |
v | v
[local process] | **************** +--------------+
| +---------+ Routing decision +------> |table: filter |
v **************** |chain: FORWARD|
**************** +------+-------+
Routing decision |
**************** |
| |
v **************** |
+-------------+ +------> Routing decision <---------------+
|table: nat | | ****************
|chain: OUTPUT| | +
+-----+-------+ | |
| | v
v | +-------------------+
+--------------+ | | table: nat |
|table: filter | +----+ | chain: POSTROUTING|
|chain: OUTPUT | +--------+----------+
+--------------+ |
v
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
chains
默认链中包含:
- INPUT
- OUTPUT
- FORWARD
入站,出站,转发。这三个链的作用是在整个流程的哪个位置过滤数据包。
rules
规则可以是一个或多个,也可以是不同类型相互组合。
- -p (protocol)
- tcp
- udp
- icmp
- -i (input interface)
- like
eth0
- like
- -o (output interface)
- like
eth0
- like
- -s (source)
- ip_addr
- -d (destination)
- -ip_addr
- j (jump)
- ACCEPT
- DROP
- QUEUE
- RETURN
tables
iptables 包含 5个 表:
- raw > 用于配置数据包, raw 中的数据包不会被系统跟踪。
- filter (default) 是用于存放所有与防火墙相关操作的默认表。
- nat 用于 网络地址转换(例如:端口转发)。
- mangle 用于对特定数据包的修改。
- security 用于 Mandatory access control 网络规则。
一般情况下 filter 和 nat 更为常用,其他表用于更复杂的特殊目的。
- -t
- filter
- nat
运行和管理
一般来说 不会遇到安装iptables的需求,这已经被集成Llinux Kernel里了,并且是默认启用的。
重置规则
# 重置所有
iptables -F
# 重置 nat 表
iptables -t nat -F
可以使用 -X 替换 -F 参数,该方法可以删除非默认规则。
保存现有规则
注意 不同的Linux发行版 iptables的 配置文件路径是不一样的。
iptables-save > /etc/iptables
iptables 在启动的时候会从 /etc/iptables
载入规则,如果直接添加规则 是不会被保存的。下次重启这些规则将会丢失。
新建规则
在了解以上的 基础概念,我们就可以严谨的编辑防火墙规则了。
以下为一些示例,主要讲解 iptables 规则的语法和其背后的思想,而不是作为一种保护服务器的手段,如果想要提高系统的安全性,参考 Simple stateful firewall 来获得一个最低限度的 iptables 安全配置。
打开 9000 端口
iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
打开 2375 端口 并仅限 某个 IP 访问
iptables -A INPUT -p tcp -s 192.168.10.2 --dport 2375 -j ACCEPT
转发 80 端口 到 2020 端口
iptables -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 2020
TIPS
参考: