linux防火墙
概述
linux的防火墙有ufw和iptables两套命令,都是ip、url、端口的匹配规则
- iptables:不仅仅能当防火墙,还能做端口转发、nat;但需要第三方软件 iptables-persistent 才能实现持久化规则
- ufw:全称
ubuntuuncomplicated firewall,是Debian下的简化版iptables,ufw的规则会被记录到iptables中;自动持久化规则。
二者关系详见:参考
ufw
- 查看防火墙状态,会显示
<规则的编号>
sudo ufw status numbered
- 打开防火墙:刚配的诸规则立即生效,重启系统仍然开着服务器,规则都还在,即各规则均已自动持续化。
sudo ufw enable
- 关闭防火墙:重启系统仍然关闭
sudo ufw disable
- 服务器重启:等价于先disable后enable
sudo ufw reload
- 删除规则
sudo ufw delete <规则的编号>
iptables
参考:iptables常用命令及持久化 iptables原理及常用命令
基础命令
- 开放端口出入
sudo iptables -A INPUT -p tcp --dport <端口> -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport <端口> -j ACCEPT
- 查看规则列表
sudo iptables -L -n --line-number
输出
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:59828
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:59828
3 sshguard all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:42038
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:42038
...
- 查看规则命令
sudo iptables -S
输出例如
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N sshguard
-A INPUT -p udp -m state --state NEW -m udp --dport 59828 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 59828 -j ACCEPT
-A INPUT -j sshguard
-A INPUT -p tcp -m tcp --dport 42038 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 42038 -j ACCEPT
-A sshguard -s 77.81.229.207/32 -j DROP
-A sshguard -s 142.44.184.79/32 -j DROP
-A sshguard -s 211.159.150.10/32 -j DROP
...
- 删除规则:
sudo iptables -L -n --line-number
输出某个<Chain>
的第<行号>
行 的规则,删除之
sudo iptables -D <Chain> <行号>
例如 sudo iptables -D INPUT 2
删掉的是
...
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:59828
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:59828 # 删掉此规则
3 sshguard all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:42038
...
规则的持久化
使用iptables-save
iptables-restore
手动保存、加载规则;使用 iptables-persistent
来自动关闭保存、开机加载规则 【推荐】。
iptables-save
系统重启后 iptables不再有原来的规则。重启前可用使用iptables-save
保存规则到文件,重启用iptables-restore
加载文件中的规则。
- 保存规则到文件
iptablbes-save
只是把当前iptables的规则,都以字符串形式输出到屏幕(标准输出)。需要手动重定向到任意自定文件,如 /etc/iptables.conf
。
sudo iptables-save | sudo tee /etc/iptables.conf
- 加载文件中的规则
iptables-restore
只是从标准输入读取规则,故需手动将自定文件重定向到此命令。
sudo iptables-restore < /etc/iptables.conf
- 开机自动加载规则:可以自己写systemd service去执行上述加载命令,但不方便。推荐用iptables-persistent。
iptables-persistent 【推荐】
安装iptables-persistent,并开启其开机自启服务,可以实现持久化iptables的当前规则,并且重启后仍然保留。以下是详细介绍:
- 安装iptables-persistent
sudo apt install iptables-persistent
- 手动保存、加载规则
Ubuntu 14.04
sudo /etc/init.d/iptables-persistent save
sudo /etc/init.d/iptables-persistent reload
Ubuntu >=16.04
sudo netfilter-persistent save
sudo netfilter-persistent reload
保存、加载的规则的文件为
/etc/iptables/rules.v4 # ipv4的规则,对应iptables命令
/etc/iptables/rules.v6 # ipv6的规则,对应ip6tables命令
上述手动保存规则的命令等价于 iptables-save > /etc/iptables/rules.v4; ip6tables-save > /etc/iptables/rules.v6
上述手动加载规则的命令等价于 iptables-restore < /etc/iptables/rules.v4; ip6tables-restore < /etc/iptables/rules.v6
- 开启开机项,以实现关机自动保存规则、开机自动加载规则,无需手动保存、加载了。
Ubuntu 14.04
sudo systemctl enable iptables-persistent.service
Ubuntu >=16.04
sudo systemctl enable netfilter-persistent.service
同样是加载、保存 /etc/iptables/rules.v{4,6}
文件。
防火墙的测试
- 测试能否访问外部ip-端口
telnet <ip> <port>
- 测试本地端口是否开放
telnet localhost <port>
上二命令,若能访问/本地端口开放,则返回
Trying <ip>...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
否则返回
Trying <ip>...
telnet: Unable to connect to remote host: Connection refused