Ubuntu系统iptables安全防护整改计划
端口开放
默认防火墙是开放所有端口的,如果拿来做应用服务器,就很危险,所以要把防火墙用起来,只将需要的端口开放,ubuntu用的是iptables防火墙。
iptables处理流程
iptables 由多个 table 组成,每个 table 分多个 chain ,每个 chain 分多个 rule 。 网络packet 按内置的顺序通过 table 和 chain 。 table 有4个, filter nat mangle raw ,默认是 filter , filter 有 INPUT FORWARD OUTPUT 三个 chain 。可以自定义 chain ,但是这里不讲。看下图理解 网络packet 通过它们的顺序:

table 的顺序其实并不十分重要,特定的功能只能在特定的 table 中完成, chain 通常只关心 INPUT 是进入流量, output 是外出流量即可。 chain 内 rule 的顺序是用户自己控制的。 rule 由两部分组成 match 和 target , match 指定了匹配条件,例如: -p tcp --dport 6379 -m connlimit --connlimit-above 5 。 target 指定了 packet 匹配时的操作,常用的有 ACCEPT REJECT DROP LOG 等,有的 target 会终止 chain 匹配后面的 rule ,有的则不会。例如目标是 ACCEPT 会终止 , LOG 则不会。
- 对于请求,传入Filter,首先区分是INPUT(从外部主机访问本机)、还是OUTPUT(反之)、FORWARD
- 查看相应的Chain规则,从上到下开始匹配,访问的端口的状态
- ACCEPT则放行,并退出Chain,DROP则禁止改请求访问
- 若访问的规则不在chain的端口规则中,则进行默认的规则处理
iptables 命令
- 在设置默认的规则处理之前,先把22号端口SSH打开,防止禁止后断开服务器链接
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 设置默认的端口处理规则,这里将不在Chain规则中的端口禁止其请求。也即打开防火墙
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT DROP
- 放行所有端口访问,关闭防火墙
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
- 查看iptables,列出所有的规则。
sudo iptables -L -v -n --line-number
-v输出详细信息-n用IP和端口而不是主机名和服务名--line-number列出了rule对应的编号,用于插入、修改、删除rule。
Chain INPUT (policy DROP 4 packets, 941 bytes)
num pkts bytes target prot opt in out source destination
1 2042 109K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
4 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379
5 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5000
- 清空iptables,重置规则
sudo iptables -F
- 保存和恢复iptables
sudo iptables-save > iptables.cfg 保存
sudo iptables-restore < iptables.cfg 恢复
- 增删改iptables规则
-A在chain的尾部添加rule
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -j ACCEPT
-I在首部或者指定位置前添加rule
iptables -I INPUT -p tcp --dport 6378 -j DROP 在链首插入
-R替换指定的 `rule```
iptables -R INPUT 3 -p tcp --dport 22 -j DROP 发现1中 222端口 写错了,要改成 22端口 。 3 是 rule 的num
-D删除rule
sudo iptables -D INPUT -p tcp --dport 22 -j DROP
sudo iptables -D INPUT 3
删除第三(num)条规则,对应的num在sudo iptables -L -v -n --line-number中查看
相应端口对应功能
| 端口号 | 功能 |
|---|---|
| 22 | SSH |
| 3306 | Mysql |
| 6379 | Redis |
| 5000 | Flask |
- 查看详细指令规则
sudo man iptables
PING命令无法通行问题
ping的运作原理是向目标主机传出一个ICMP echo@要求数据包,并等待接收echo回应数据包。
因此iptables需要对icmp规则进行设置,允许相应的ICMP数据包通行,则可以ping通相应的主机
- 允许本机ping其他机器的设置(需要root权限)
sudo su # 切换root权限
sudo iptables -A INPUT -p icmp --icmp 0 -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp 0 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp 8 -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp 8 -j ACCEPT
0:回显应答,表示回显自己对别人的请求 8:回显请求,表示回显别人对自己的请求
本机ping外机时,通过output icmp 0,会回显自己对别人的请求 , 当处理完毕后,外机将数据返回, 通过 input icmp 8回显返回的数据
- ping 域名
ping www.baidu.com 的流程是,首先主机发出 icmp 请求,,对于www.baidu.com 进行DNS转换,将域名转换成IP地址
DNS协议运行在UDP协议之上,使用端口号53,因此在此之前iptables还需要先对53号端口放行
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
保存iptables设置及重启自动恢复
iptables设定的规则,掉电重启会清空。若需要保存,最好是使用iptables-save/restore配合重定向,示例如下( 需要切换到root ):
iptables-save > /etc/network/iptables-config
iptables-restore < /etc/network/iptables-config
最后编辑/etc/network/interfaces文件,在最后插入
pre-up iptables-restore < /etc/network/iptables-config
重启计算机以后,会自动重启恢复防火墙规则
参考资料:

浙公网安备 33010602011771号