感谢此文原作者
转自:http://lesca.me/archives/iptables-examples.html
一、iptables:从这里开始
删除现有规则
1
2
3
|
iptables -F (OR) iptables --flush |
设置默认链策略
iptables的filter表中有三种链:INPUT, FORWARD和OUTPUT。默认的链策略是ACCEPT,你可以将它们设置成DROP。
1
2
3
|
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP #一般出站连接设置为ACEEPT,看需求
|
你需要明白,这样做会屏蔽所有输入、输出网卡的数据包,除非你明确指定哪些数据包可以通过网卡。
屏蔽指定的IP地址
以下规则将屏蔽BLOCK_THIS_IP所指定的IP地址访问本地主机:
1
2
3
4
|
BLOCK_THIS_IP= "x.x.x.x"
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
(或者仅屏蔽来自该IP的TCP数据包) iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
|
允许来自外部的ping测试
1
2
|
iptables -A INPUT -p icmp --icmp- type echo -request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp- type echo -reply -j ACCEPT
|
允许从本机ping外部主机
1
2
|
iptables -A OUTPUT -p icmp --icmp- type echo -request -j ACCEPT
iptables -A INPUT -p icmp --icmp- type echo -reply -j ACCEPT
|
允许环回(loopback)访问
1
2
|
iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT |
二、iptables:协议与端口设定
允许所有SSH连接请求
本规则允许所有来自外部的SSH连接请求,也就是说,只允许进入eth0接口,并且目的端口为22的数据包
1
2
|
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT |
允许从本地发起的SSH连接
本规则和上述规则有所不同,本规则意在允许本机发起SSH连接,上面的规则与此正好相反。
1
2
|
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT |
仅允许来自指定网络的SSH连接请求
以下规则仅允许来自192.168.100.0/24的网络:
1
2
|
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0 /24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT |
上例中,你也可以使用-s 192.168.100.0/255.255.255.0作为网络地址。当然使用上面的CIDR地址更容易让人明白。
仅允许从本地发起到指定网络的SSH连接请求
以下规则仅允许从本地主机连接到192.168.100.0/24的网络:
1
2
|
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0 /24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT |
允许HTTP/HTTPS连接请求
1
2
3
4
5
6
7
|
# 1.允许HTTP连接:80端口 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # 2.允许HTTPS连接:443端口 iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT |
允许从本地发起HTTPS连接
本规则可以允许用户从本地主机发起HTTPS连接,从而访问Internet。
1
2
|
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT |
类似的,你可以设置允许HTTP协议(80端口)。
-m multiport:指定多个端口
通过指定-m multiport选项,可以在一条规则中同时允许SSH、HTTP、HTTPS连接:
1
2
|
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT |
允许出站DNS连接
1
2
|
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT |
允许NIS连接
如果你在使用NIS管理你的用户账户,你需要允许NIS连接。即使你已允许SSH连接,你仍需允许NIS相关的ypbind连接,否则用户将无法登陆。NIS端口是动态的,当ypbind启动的时候,它会自动分配端口。因此,首先我们需要获取端口号,本例中使用的端口是853和850:
rpcinfo -p | grep ypbind
然后,允许连接到111端口的请求数据包,以及ypbind使用到的端口:
1
2
3
4
5
6
|
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 |
以上做法在你重启系统后将失效,因为ypbind会重新指派端口。我们有两种解决方法:
1.为NIS使用静态IP地址
2.每次系统启动时调用脚本获得NIS相关端口,并根据上述iptables规则添加到filter表中去。
允许来自指定网络的rsync连接请求
你可能启用了rsync服务,但是又不想让rsync暴露在外,只希望能够从内部网络(192.168.101.0/24)访问即可:
1
2
|
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0 /24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT |
允许来自指定网络的MySQL连接请求
你可能启用了MySQL服务,但只希望DBA与相关开发人员能够从内部网络(192.168.100.0/24)直接登录数据库:
1
2
|
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0 /24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT |
允许Sendmail, Postfix邮件服务
邮件服务都使用了25端口,我们只需要允许来自25端口的连接请求即可。
1
2
|
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT |
允许IMAP与IMAPS
1
2
3
4
5
6
7
|
# IMAP:143 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 # IMAPS:993 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
|
# POP3:110 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 # POP3S:995 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
|
-m limit: 启用limit扩展
--limit 25/minute: 允许最多每分钟25个连接
--limit-burst 100: 当达到100个连接后,才启用上述25/minute限制
三、转发与NAT
允许路由
如果本地主机有两块网卡,一块连接内网(eth0),一块连接外网(eth1),那么可以使用下面的规则将eth0的数据路由到eht1:
1
|
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT |
DNAT与端口转发
以下规则将会把来自422端口的流量转发到22端口。这意味着来自422端口的SSH连接请求与来自22端口的请求等效。
1
2
3
4
5
6
|
# 1.启用DNAT转发 iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to-destination 192.168.102.37:22 # 2.允许连接到422端口的请求 iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT |
假设现在外网网关是xxx.xxx.xxx.xxx,那么如果我们希望把HTTP请求转发到内部的某一台计算机,应该怎么做呢?
1
2
|
iptables -t nat -A PREROUTING -p tcp -i eth0 -d xxx.xxx.xxx.xxx --dport 8888 -j DNAT --to 192.168.0.2:80 iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT |
当该数据包到达xxx.xxx.xxx.xxx后,需要将该数据包转发给192.168.0.2的80端口,事实上NAT所做的是修改该数据包的目的地址和目的端口号。然后再将该数据包路由给对应的主机。
但是iptables会接受这样的需要路由的包么?这就由FORWARD链决定。我们通过第二条命令告诉iptables可以转发目的地址为192.168.0.2:80的数据包。再看一下上例中422端口转22端口,这是同一IP,因此不需要设置FORWARD链。
SNAT与MASQUERADE
如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去:
1
|
iptables -t nat -A POSTROUTING -s 10.8.0.0 /24 -o eth0 -j snat --to- source 192.168.5.3
|
对于snat,不管是几个地址,必须明确的指定要snat的IP。假如我们的计算机使用ADSL拨号方式上网,那么外网IP是动态的,这时候我们可以考虑使用MASQUERADE
1
|
iptables -t nat -A POSTROUTING -s 10.8.0.0 /255 .255.255.0 -o eth0 -j MASQUERADE
|
负载平衡
可以利用iptables的-m nth扩展,及其参数(--counter 0 --every 3 --packet x),进行DNAT路由设置(-A PREROUTING -j DNAT --to-destination),从而将负载平均分配给3台服务器:
1
2
3
|
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 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 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 |
自定义的链
记录丢弃的数据包
1
2
3
4
5
6
7
8
9
10
11
|
# 1.新建名为LOGGING的链 iptables -N LOGGING # 2.将所有来自INPUT链中的数据包跳转到LOGGING链中 iptables -A INPUT -j LOGGING # 3.指定自定义的日志前缀"IPTables Packet Dropped: " iptables -A LOGGING -m limit --limit 2 /min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
# 4.丢弃这些数据包 iptables -A LOGGING -j DROP |
相关推荐
考查内容:iptables 的规则管理操作;iptables 常用的通用匹配条件和扩展匹配条件;添加、修 改、删除自定义链的方法。 实验内容:1)使用 iptables 制定规则,包括添加、修改、保存和删除规则等。 2)使用通用匹配...
### CentOS 6 iptables 常用操作及规则配置 #### 概述 在Linux系统中,`iptables`是一款强大的工具,用于管理网络流量并控制数据包过滤规则。CentOS 6作为一款广泛使用的服务器操作系统,其内置的`iptables`功能...
* iptables -X 清除 iptables 自定义规则 * 设定默认规则在 iptables 规则中没有匹配到规则则使用默认规则进行处理 * iptables -P INPUT DROP * iptables -P OUTPUT ACCEPT * iptables -P FORWARD DROP * 配置 SSH ...
#### 二、iptables:协议与端口设定 ##### 允许所有SSH连接请求 为了允许所有SSH连接请求,我们需要创建两条规则。一条规则用于处理新连接的建立,另一条用于处理现有连接的后续数据包。 ```bash iptables -A INPUT...
Linux下的网络地址转换(Network ...总之,Linux下的NAT数据包转发是一个涉及网络底层原理和`iptables`规则设置的重要话题,对于网络管理员和开发者来说,掌握这项技术对于构建和管理复杂的网络环境具有重要意义。
"利用Linux下的NAT功能实现多机共用一个IP地址" 本文主要介绍了如何利用Linux下的NAT功能实现多机共用一个IP地址。NAT(Network Address Translation,网络地址转换)是一种使多台计算机共用一个公网IP地址的技术。...
`iptables`是Linux系统下常用的网络管理工具之一,主要用于实现包过滤、网络地址转换(NAT)等功能。通过配置iptables规则,我们可以对进出系统的数据包进行精细控制,从而达到网络安全防护的目的。 #### 二、...
在Linux内核上,netfilter是负责数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪等功能的一个子系统,这个子系统包含一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables是一个...
Linux防火墙:iptables禁IP与解封IP常用命令.docx
### iptables常用命令详解 #### 一、iptables简介 **iptables** 是一款强大的包过滤防火墙工具,它允许用户通过定义一系列复杂的规则来控制进出主机的数据包。此工具需要Linux内核版本至少为2.4及以上,对于2.6及...
iptables是一个Linux下优秀的nat+防火墙工具
Linux 屏蔽恶意 IP 地址使用 IPset 和 iptables 在 Linux 中,屏蔽恶意 IP 地址是一项重要的安全任务。特别是当你需要屏蔽成百上千个 IP 地址时,使用传统的 iptables 规则可能变得非常困难。幸运的是,我们可以...
本文档主要介绍了 Linux 中的iptables 命令的实例,涵盖了 iptables 的基本用法、规则设定、端口控制、NAT 转发等方面的知识点。 一、iptables 的基本概念 iptables 是 Linux 系统中的一个防火墙工具,用于控制...
PREROUTING链是在路由之前要过的链,负责改变目的地址和(或端口),通常用在端口转发或者nat到内网的DMZ区。例如,我们的公网IP是60.1.1.1/24,位于Linux中的eth0,内网IP是10.1.1.1/24,位于Linux中的eth1,我们的...
- `iptables -t nat -X`: 删除nat表中的用户自定义链。 - 对于Red Hat或Fedora用户,还可以使用服务命令 `service iptables stop` 来停止iptables服务。 - **设置默认策略**: 默认策略定义了当数据包不匹配任何...
Android 流量防火墙 Iptables 原理详解 Android 流量防火墙是...由于 Iptables 已经有了完善的防火墙规则,我们只需要设计一个基于 Iptables 的 Android 前台即可,通过运行脚本,调用 iptables 设置防火墙规则即可。
显示所有链的所有规则,并以数字形式显示IP地址。 4. **创建新链**: ```bash iptables -N MYCHAIN ``` 创建一个新的自定义链`MYCHAIN`。 5. **设置默认策略**: ```bash iptables -P INPUT DROP ``` ...
脚本内置了自动安装iptables和ipset,无需手动安装,只需bash执行脚本即可全自动屏蔽好,如果测试屏蔽国外ip完毕,执行bash iprct.sh stop 即可删除创建的屏蔽国外ip访问国内规则,文件,合集等一系列直接删除,且...
传统的做法是通过`iptables`命令逐个添加规则来屏蔽单个IP地址,例如: ```bash sudo iptables -A INPUT -s 1.1.1.1 -p TCP -j DROP ``` 这种方式简单直观,但当需要屏蔽大量独立IP地址时(例如1000个),手动添加上...