概要
你可以在这里找到一个更容易阅读的版本: 5dollarwhitebox.org
很多人被IPTables吓坏了,很难理解。 但是,一旦你掌握了它,基础很简单。 本文档将作为使用iptables的基本操作方式。 我绝对不是一个iptables大师,但是像这样一直在使用它。 如果我有任何错误,请随时给我发电子邮件。
系统
Debian Sarge 3.1 Vanilla 2.6.12.4 kernel from mirrors.kernel.org iptables管理实用程序版本1.2.11-10
制备
这个操作方法在Debian Sarge 3.1框中执行,尽管命令和语法应该适用于任何linux发行版。 在配置iptables之前,您首先必须确保已将其编译到内核中,并且您已安装正确的用户级实用程序。
你应该有一个从内核编译时的配置文件。 对于“CONFIG_IP_NF”,对于大多数线/选项应该产生'= y'或'= m'。 在这里,您看到“CONFIG_IP_NF_IPTABLES”被编译为内核模块。
CONFIG_IP_NF_CONNTRACK = m
CONFIG_IP_NF_FTP = m
CONFIG_IP_NF_AMANDA = m
CONFIG_IP_NF_TFTP = m
CONFIG_IP_NF_IRC = m
CONFIG_IP_NF_QUEUE = m
CONFIG_IP_NF_IPTABLES = m
CONFIG_IP_NF_MATCH_LIMIT = m
CONFIG_IP_NF_MATCH_MAC = m
CONFIG_IP_NF_MATCH_PKTTYPE = m
CONFIG_IP_NF_MATCH_MARK = m
CONFIG_IP_NF_MATCH_MULTIPORT = m
CONFIG_IP_NF_MATCH_TOS = m
CONFIG_IP_NF_MATCH_RECENT = m
CONFIG_IP_NF_MATCH_ECN = m
CONFIG_IP_NF_MATCH_DSCP = m
CONFIG_IP_NF_MATCH_AH_ESP = m
CONFIG_IP_NF_MATCH_LENGTH = m
CONFIG_IP_NF_MATCH_TTL = m
CONFIG_IP_NF_MATCH_TCPMSS = m
CONFIG_IP_NF_MATCH_HELPER = m
CONFIG_IP_NF_MATCH_STATE = m
CONFIG_IP_NF_MATCH_CONNTRACK = m
CONFIG_IP_NF_MATCH_UNCLEAN = m
CONFIG_IP_NF_MATCH_OWNER = m
CONFIG_IP_NF_FILTER = m
CONFIG_IP_NF_TARGET_REJECT = m
CONFIG_IP_NF_TARGET_MIRROR = m
CONFIG_IP_NF_NAT = m
CONFIG_IP_NF_NAT_NEEDED = y
CONFIG_IP_NF_TARGET_MASQUERADE = m
CONFIG_IP_NF_TARGET_REDIRECT = m
CONFIG_IP_NF_NAT_AMANDA = m
CONFIG_IP_NF_NAT_SNMP_BASIC = m
CONFIG_IP_NF_NAT_IRC = m
CONFIG_IP_NF_NAT_FTP = m
CONFIG_IP_NF_NAT_TFTP = m
CONFIG_IP_NF_MANGLE = m
CONFIG_IP_NF_TARGET_TOS = m
CONFIG_IP_NF_TARGET_ECN = m
CONFIG_IP_NF_TARGET_DSCP = m
CONFIG_IP_NF_TARGET_MARK = m
CONFIG_IP_NF_TARGET_LOG = m
CONFIG_IP_NF_TARGET_ULOG = m
CONFIG_IP_NF_TARGET_TCPMSS = m
CONFIG_IP_NF_ARPTABLES = m
CONFIG_IP_NF_ARPFILTER = m
CONFIG_IP_NF_ARP_MANGLE = m
CONFIG_IP_NF_COMPAT_IPCHAINS = m
CONFIG_IP_NF_NAT_NEEDED = y
CONFIG_IP_NF_COMPAT_IPFWADM = m
CONFIG_IP_NF_NAT_NEEDED = y
这不是必需的,因为一旦我们尝试添加一些规则,您会发现iptables是否正常工作。
您可以通过执行以下步骤来检查是否安装了iptables管理实用程序:
iptables 1.2.11-10 Linux内核2.4+ iptables管理
...或基于rpm的发行版:
...或者你可以看看二进制是否存在!
/ sbin / iptables
如果该实用程序丢失,您可以像这样安装它:
易于
#apt-get update && apt-get install iptables
RPM
准备############################## [100%]
主文件
Debian
- /etc/init.d/iptables - INIT脚本启动|停止|重新启动服务(并保存规则集)。 这个文件不再是Sarge的默认值,但你仍然可以得到它(我会告诉你)。
- / var / lib / iptables - Debian的“active”和“inactive”iptables - 保存计数器文件(即保存的规则集)。 在RedHat上,您可以在“/ etc / sysconfig / iptables”中找到保存的规则。
- / var / lib / iptables / active - 活动计数器(稍后再说)
- / var / lib / iptables / inactive - 非活动计数器
- / sbin / iptables - 管理实用程序/二进制文件。
红帽
- /etc/init.d/iptables - INIT脚本启动|停止|重新启动服务(并保存规则集)。
- / etc / sysconfig / iptables - 用于iptables-save计数器文件的RedHat文件(即保存的规则集)。
- / sbin / iptables - 管理实用程序/二进制文件。
一点关于IPTables
要查看我们目前所使用的规则集,执行:
链INPUT(政策接受)
目标保护源目的地
链条向前(政策接受)
目标保护源目的地
链输出(政策接受)
目标保护源目的地
当没有规则集到位时,这将是你会看到的。 看这个,我们看到3'链'。
- INPUT - 保留针对此服务器的流量的规则。
- FORWARD - 保留将转发到此服务器后面的IP的流量规则(即,如果此框用作其他服务器的防火墙)。
- OUTPUT - 将来自此服务器的流量的规则保留到互联网。
主要是处理针对此服务器的流量,并将为INPUT链发布规则。 当流量通过内核时,它决定了一个“TARGET” 基于分组是否匹配规则。 一般目标是:
- 接受 - 交通接受交货。
- 拒绝 - 流量被拒绝,将数据包发送回发送主机。
- DROP - 流量被丢弃。 没有任何东西发送回发送主机。
配置规则集
所以,让我们来吧。 重要的是要注意附加规则的顺序是非常重要的。 例如,如果你的第一条规则是拒绝所有的事情,那么无论你明确允许什么,都会被拒绝。
还要注意的是,只有执行“iptables-save”(或使用init脚本保存),您所做的任何操作都将保存在磁盘上。 所有计数器/规则集都在内存中。 一旦服务器重新启动,或者执行'iptables --flush',您所做的一切都已经消失了。 我个人使用一个名为'iptables-rules.sh'的bash脚本文件,这样我就可以保存所有内容并进行评论。 如果我犯了一个错误,我不用担心,如果我只是想把所有的规则冲出来,我只是回到我的bash脚本,再次开始编辑,保存并执行脚本(但是这不会在启动时运行...将在下一节中介绍)。
非常重要的是,如果您通过ssh远程处理此服务器,那么您尽全力不要锁定自己。 因此,我们的第一条规则是确保无论什么,我仍然可以从我的IP地址访问ssh。
让我们断断续续:
- -A =>告诉iptables将这条规则附加到INPUT链
- -s =>源地址。 此规则仅适用于来自此IP的流量。 用您正在SSHing的IP地址替换。
- -d =>目的地址。 此规则仅适用于要访问此IP的流量。 用该服务器的IP替代。
- -p =>协议。 指定TCP的流量。
- --dport =>目的端口。 指定用于TCP端口22(SSH)的流量
- -j =>跳。 如果此规则中的所有内容都匹配,则跳转到ACCEPT
接下来,我们将为一般网络流量使用一些标准规则。 这超出了基本的东西,但是iptables可以确定数据包所在的“状态”。这与标准的TCP通信有关。 例如,传输数据时两台主机之间的3路握手。
- NEW => Server1连接到发出SYN(Synchronize)数据包的Server2。
- 服务器2接收到SYN数据包,然后用SYN-ACK(同步确认)数据包进行响应。
- ESTABLISHED =>服务器1接收SYN-ACK包,然后用最后的ACK(确认)包进行响应。
此3次握手完成后,流量现已建立。 为了这种类型的TCP通信,需要与这三个规则类似的东西:
#iptables -A FORWARD -i eth0 -m state --state相关,ESTABLISHED -j接受
#iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
最后一条规则显然允许任何流量离开服务器。
现在我们已经将基础设置到位,让我们看看我们的规则集中的iptables列表:
链INPUT(政策接受)
目标保护源目的地
ACCEPT tcp - 192.168.1.10 10.1.15.1 tcp dpt:ssh
接受任何地方的任何地方相关,ESTABLISHED
链条向前(政策接受)
目标保护源目的地
接受任何地方的任何地方相关,ESTABLISHED
链输出(政策接受)
目标保护源目的地
接受任何地方的任何地方,新的,相关的,已建立
从这里你可以添加你喜欢的任何规则。 如果你运行一个基本的Web服务器,你可能需要类似的东西:
首例:
-------------------------------------------------- ---------------------
BAD GUYS(阻止源IP地址):
#iptables -A INPUT -s 172.34.5.8 -j DROP
没有垃圾邮件(注意使用FQDN):
#iptables -A INPUT -s mail.spammer.org -d 10.1.15.1 -p tcp --dport 25 -j REJECT
-------------------------------------------------- ---------------------
然后打开它: --------------------------------------------- --------------------------
MYSQL(允许远程访问特定IP):
#iptables -A INPUT -s 172.50.3.45 -d 10.1.15.1 -p tcp --dport 3306 -j ACCEPT
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 22 -j ACCEPT
Sendmail / Postfix:
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 25 -j ACCEPT
FTP:(注意如何指定端口范围20-21)
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 20:21 -j ACCEPT
被动FTP端口也许(再一次,在一个规则中指定端口50000到50050)
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 50000:50050 -j ACCEPT
HTTP / Apache
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 80 -j ACCEPT
SSL / Apache
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 443 -j ACCEPT
IMAP
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 143 -j ACCEPT
IMAPS
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 993 -j ACCEPT
POP3
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 110 -j ACCEPT
POP3S
#iptables -A INPUT -d 10.1.15.1 -p tcp --dport 995 -j ACCEPT
从本地主机的任何流量:
#iptables -A INPUT -d 10.1.15.1 -s 127.0.0.1 -j ACCEPT
ICMP / Ping:
#iptables -A INPUT -d 10.1.15.1 -p icmp -j ACCEPT ---------------------------------- -------------------------------------
全球拒绝最后:
-------------------------------------------------- ---------------------
拒绝所有其他的IP:
或者,拒绝任何IP地址通过任何IP:
#iptables -A INPUT -j REJECT
#iptables -A FORWARD -j REJECT ------------------------------------------ -----------------------------
注意我们做最后的全球REJECT行! 这些必须是最后的。
保存规则集
使用init脚本,保存规则集非常简单。 一旦您对配置感到满意,只需执行以下操作之一:
Debian方式
默认情况下,旧样式的初始化脚本不再位于Sarge中,但它仍然在遗留使用。 我相信新的方式是为iptables脚本使用'/etc/network/if-up.d'和'/etc/network/if-down.d'(但我不喜欢这样)。
您可以通过以下方式获取遗留的INIT脚本:
#chmod + x /etc/init.d/iptables
#mkdir / var / lib / iptables
#chmod 700 / var / lib / iptables
现在你有脚本到位,你可以做需要的。
主动规则
活动规则是启动iptables时加载的规则:
#/etc/init.d/iptables保存活动保存iptables规则集:用计数器保存“活动”。
这将您的规则保存在/ var / lib / iptables / active中
非活动规则
您还可以配置第二组规则,以便在停止称为“非活动”的iptables时。 Iptables实际上并没有“停止”,它只是刷出已经存在的规则集,然后加载“非活动”规则。
加载iptables规则集:加载“不活动”
因此,您可以设置“不活动”规则,然后使用以下命令保存:
保存iptables规则集:用计数器保存“inactive”。
RedHat路
RedHat INIT脚本非常相似。 您可以使用它来启动和停止iptables,以及保存规则集。
要保存活动规则,请执行以下操作:
这将保存您的规则到'/ etc / sysconfig / iptables'。
当您启动iptables时,规则将从“/ etc / sysconfig / iptables”读取:
启动iptables [OK]
当你停止iptables时,所有的规则都会刷新:
停止iptables [OK]
手动保存并恢复
您还可以手动使用iptables-save和iptables-restore实用程序,如下所示:
将规则保存到文件
#iptables-save> /root/iptables-save.out恢复规则
#iptables-restore -c /root/iptables-save.out-c告诉iptables-restore这个文件是使用iptables-save创建的,它将规则输出为“counters”。
结论
在那里你去,iptables在它非常基本。 iptables的用途太多,甚至不能真正做到这一点。 但是,为了基本的安全性和IPTables的理解,希望这可能有助于您。 如果有什么我可以添加,请随时给我发电子邮件。
--- ---
BJ Dierkes,RHCE4-LPIC1
wdierkes [at] 5dollarwhitebox [dot] org
德州,美国
资源
- Netfilter / Iptables: http : //www.netfilter.org/
- 传输控制协议: http : //www.rhyshaden.com/tcp.htm