iptables命令可用于配置Linux的包过滤规则,常用于实现防火墙、NAT。咋一看iptables的配置很复杂,掌握规律后,其实用iptables完成指定任务并不难,下面我们通过具体实例,学习iptables的详细用法。
删除已有规则
在新设定iptables
规则时,我们一般先确保旧规则被清除,用以下命令清除旧规则:
1 | iptables -F |
设置chain策略
对于filter table,默认的chain策略为ACCEPT,我们可以通过以下命令修改chain的策略:
1 | iptables -P INPUT DROP |
以上命令配置将接收、转发和发出包均丢弃,施行比较严格的包管理。由于接收和发包均被设置为丢弃,当进一步配置其他规则的时候,需要注意针对INPUT
和OUTPUT
分别配置。当然,如果信任本机器往外发包,以上第三条规则可不必配置。
配置屏蔽指定ip
有时候我们发现某个ip
不停的往服务器发包,这时我们可以使用以下命令,将指定ip
发来的包丢弃:
1 | BLOCK_THIS_IP="x.x.x.x" |
以上命令设置将由x.x.x.x
ip
发往eth0
网口的tcp
包丢弃。
配置服务项
利用iptables
,我们可以对日常用到的服务项进行安全管理,比如设定只能通过指定网段、由指定网口通过SSH
连接本机:
1 | iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT |
若要支持由本机通过SSH
连接其他机器,由于在本机端口建立连接,因而还需要设置以下规则:
1 | iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state ESTABLESHED -j ACCEPT |
类似的,对于HTTP/HTTPS(80/443)
、pop3(110)
、rsync(873)
、MySQL(3306)
等基于tcp连接
的服务,也可以参照上述命令配置。
对于基于udp
的dns服务
,使用以下命令开启端口服务
:
1 | iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT |
配置网口转发
对于用作防火墙或网关的服务器,一个网口连接到公网,其他网口的包转发到该网口实现内网向公网通信,假设eth0
连接内网,eth1
连接公网,配置规则如下:
1 | iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT |
配置端口转发
对于端口,我们也可以运用iptables
完成转发配置:
1 | iptables -t nat -A PREROUTING -p tcp -d 172.16.12.37 --dport 40022 -j DNAT --to 172.16.12.37:22 |
以上命令将40022
端口的包转发到22
端口,因而通过40022
端口也可进行SSH
连接,当然对于40022
端口,我们也需要像以上“4.配置服务项”
一节一样,配置其支持连接建立的规则。
配置DoS攻击防范
利用扩展模块limit
,我们还可以配置iptables
规则,实现DoS攻击防范
:
1 | iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT |
--litmit 25/minute
指示每分钟限制最大连接数为25
--litmit-burst 100
指示当总连接数超过100
时,启动litmit/minute
限制
配置web流量均衡
我们可以将一台服务器作为前端服务器,利用iptables
进行流量分发
,配置方法如下:
1 | iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80 |
以上配置规则用到nth扩展模块
,将80端口
的流量均衡
到三台服务器。
配置日志记录
使用LOG目标
和syslog服务
,我们可以记录某协议某端口下的收发包情况。拿记录丢包情况举例,可以通过以下方式实现。
首先自定义一个chain:
1 | iptables -N LOGGING |
其次将所有接收包导入LOGGING chain
中:
1 | iptables -A INPUT -j LOGGING |
然后设置日志前缀、日志级别:
1 | iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7 |
最后将包导向DROP
,将包丢弃:
1 | iptables -A LOGGING -j DROP |