Iptables传输数据包的过程
- 若数据包是发送到本机,则经过PREROUTING->INPUT;
- 如数据包是需要本机转发,则经过PREROUTING->FORWORD->POSTROUTING
- 若数据包是本机发出的,则要经过OUTPUT->POSTROUTING
Iptables的规则表
- filter用户包过滤
- nat表用于网络地址转换
- mangle表用于包重构
- raw表用于数据跟踪处理
Iptables链
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
规则表与链的关系
1.filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw
表的一般顺序:Raw——mangle——nat——filter。
语法
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数
-P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-F 清空规则链
-L 查看规则链
-A 在规则链末尾追加新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,icmp
--dport num 匹配目标端口号
--sport num 匹配来源端口号`
示例:
- 删除现有规则
在开始建立新的规则之前,您可能需要清理所有默认规则和现有规则。使用iptables如下所示的命令来做这个。
iptables -F #警告:当前命令后将切断linux对外的一切端口请求,请确保你还能连接到vnc或主机上
(or)
iptables --flush
- 设置默认链策略
默认的iptables默认策略是ACCEPT。将此更改为如下所示。
iptables -P INPUT DROP #-P更改默认策略
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
当将INPUT和OUTPUT默认策略作为DROP时,对于每一个防火墙规则要求都应该定义两条规则。即一个INPUT和一个OUTPUT。
如果信任内部用户,则可以忽略上面OUTPUT的设置。默认情况下,不要丢弃所有OUTPUT的数据包。在这种情况下,对于每一个防火墙规则的要求,你只需要定义一个规则。即定义规则传入,因为传出是接受所有数据包。
- 阻止一个特定的IP地址
在我们做其他规则前,如果你想阻止一个特定的IP地址,你应该先做如下所示。当您在日志文件中找到特定的IP地址时发现一些奇怪的活动,并希望在进一步研究时暂时阻止该IP地址,这将很有帮助。
BLOCK_THIS_IP="192.168.1.108"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
#你也可以使用下面的一种规则。
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP //规则禁止这个IP地址对我们服务器eth0网卡的所有连接
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP //规则只禁止这个IP地址对我们服务器eth0网卡的tcp协议的连接
- 允许所有传入SSH
以下规则允许eth0接口上的所有传入的SSH连接。
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
下面的规则只允许从网络192.168.100.X传入SSH连接。
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
- 允许传入的HTTP和HTTPS
以下规则允许所有传入的网络流量。即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
# 下面的规则允许所有传入安全的网络流量。即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
- 相结合多个规则使用多端口
当你不是写为每个端口单独的规则,而是从外面的世界多个端口传入的连接,可以在一起使用多端口扩展。
下面的示例允许所有传入SSH,HTTP和HTTPS流量。
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
- 允许OUTPUT SSH
以下规则允许传出ssh连接。也就是说当你从内ssh到外部服务器。
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT //允许双方新建立的OUTPUT链通信
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT //只允许双方已经建立的INPUT链通信
- 允许拨出SSH到特定网络
下面的规则只允许特定的网络传出的ssh连接。即你的SSH只有从内部网络192.168.100.0/24。
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
- 允许拨出HTTPS
以下规则允许传出安全的Web流量。当你想允许互联网流量的用户,这是很有帮助。在服务器上,当你想使用wget从外部下载一些文件,这些规则也有帮助。
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 Web流量,增加两个额外的规则就像上面,并改变443 80。
- 负载均衡传入的Web流量
您也可以加载使用iptables防火墙规则平衡传入的网络流量。
This uses the iptables nth extension. The following example load balances the HTTPS traffic to three different ip-address.
For every 3th packet, it is load balanced to the appropriate server (using the counter 0).
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
- 允许从外部到内部Ping
以下规则允许外部用户能够ping您的服务器。
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
- 允许从内部到外部ping
以下规则允许您从内部ping到任何外部服务器。
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
- 允许环回访问
您应该允许在服务器上进行完全环回访问。即使用127.0.0.1访问
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
- 允许内部网络到外部网络
在防火墙服务器上,一个以太网卡连接到外部网络,另一个以太网卡连接到内部服务器,请使用以下规则允许内部网络与外部网络通信。
//在此示例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
- 允许出站DNS
以下规则允许传出DNS连接。
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启动时,它分配端口。(ypbind是定义NIS服务器的客户端进程。)
//首先做一个rpcinfo -p如下所示并获取端口号。在此示例中,它使用端口853和850。
rpcinfo -p | grep ypbind
//现在允许到端口111的入站连接,以及ypbind使用的端口。
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)使用静态ip地址为您的NIS,或2)使用一些聪明的shell脚本技术来自动抓取动态端口号从“rpcinfo -p”命令输出,并使用上述iptables规则。
- 允许Rsync来自特定网络
以下规则仅允许来自特定网络的rsync。
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,通常你不想允许从外部直接连接。在大多数情况下,您可能在运行MySQL数据库的同一服务器上运行Web服务器。
但是DBA和开发人员可能需要使用MySQL客户端从他们的笔记本电脑和桌面直接登录到MySQL。在这种情况下,您可能希望允许内部网络直接与MySQL通信,如下所示。
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流量
以下规则允许邮件通信。它可以是sendmail或postfix。
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
以下规则允许IMAP / IMAP2流量。
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流量。
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
以下规则允许POP3访问。
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访问。
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攻击
以下iptables规则将帮助您防止对您的Web服务器的拒绝服务(DoS)攻击。
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
在上面的例子中:
-m limit:这使用限制iptables扩展
-limit 25 /分钟:每分钟最多只能连接25个请求包。根据您的具体要求更改此值
-limit-burst 100:此值指示仅在连接的总数达到limit之后才实施限制/分钟
注意“-m limit”只匹配数据包而不是连接,所以上方例子中你将匹配25包每分钟。
如果是想限制每分钟下connect次数呢。限制连接数的解决方案是使用connlimit匹配。
iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 15 –connlimit-mask 32 -j REJECT –reject-with tcp-reset
它将拒绝来自一个源IP的15以上的连接 - 一个很好的规则来保护Web服务器。
此外,当与“hashlimit” 结合后在保护免受DDoS攻击时效果更好。
使用“limit”匹配,您可以限制每个时间间隔的数据包的全局速率,但是使用“hashlimit”,您可以限制每个IP,每个组合IP +端口等。
所以一个Web服务器的例子将是这样:
iptables -A INPUT -p tcp –dport 80 -m hashlimit –hashlimit 45/sec –hashlimit-burst 60
–hashlimit-mode srcip–hashlimit-name DDOS
–hashlimit-htable-size 32768
–hashlimit-htable-max 32768
–hashlimit-htable-gcinterval 1000
–hashlimit-htable-expire 100000
-j ACCEPT
- 端口转发
例:将来自422端口的流量全部转到22端口。
这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
除此之外,还需要允许连接到422端口的请求
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT
-o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
- 记录丢弃的数据表
iptables -N LOGGING //1.新建名为LOGGING的链
iptables -A INPUT -j LOGGING //2.将所有来自INPUT链中的数据包跳转到LOGGING链中
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7 //3.为这些包自定义个前缀,命名为”IPTables Packet Dropped”
iptables -A LOGGING -j DROP //4.丢弃这些数据包