我正在尝试在服务器中设置 iptables 规则,以将其用作基于 Ubuntu 16.04 的防火墙。我对 Ubuntu 有一定的了解。我在 Ubuntu 帮助站点和 Askubuntu 上进行了一些搜索。我找到了以下规则,可以将其保存在文件中并以 root 身份执行(sudo sh 文件):
#!/bin/bash
WAN_IF="enp2s0"
WAN_IP=$(/sbin/ip addr show dev "$WAN_IF" | perl -lne 'if(/inet (\S+)/){print$1;last}');
LAN_IF="enp4s9"
LAN_IP=$(/sbin/ip addr show dev "$LAN_IF" | perl -lne 'if(/inet (\S+)/){print$1;last}');
##### Internal network address (in CIDR notation)
LAN_NET="192.168.17.0/24"
echo
echo "[WAN Interface: $WAN_IF] [WAN IP: $WAN_IP]"
echo "[LAN Interface: $LAN_IF] [LAN IP: $LAN_IP] [Network: $LAN_NET]"
echo
echo -n "Enabling IP Forwarding...\n"
##### Enabling IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
echo
echo -n "Loading Firewall Rules...\n"
echo -n "Enabling NAT Rewriting on IN/OUT Packets...\n"
/sbin/iptables-restore <<-EOF;
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
##### INPUT RULES
-A INPUT -i lo -j ACCEPT
-A INPUT -i $LAN_IF -j ACCEPT
-A INPUT -i $WAN_IF -s $LAN_NET -j DROP
-A INPUT -i $WAN_IF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
##### FORWARD RULES
-A FORWARD -i $LAN_IF -o $WAN_IF -j ACCEPT
-A FORWARD -i $WAN_IF -o $LAN_IF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
##### OUTPUT RULES
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o $WAN_IF -d $LAN_NET -j DROP
-A OUTPUT -o $LAN_IF -s $LAN_IP -d $LAN_NET -j ACCEPT
-A OUTPUT -o $WAN_IF -s $WAN_IP -j ACCEPT
##### All Other Requests are DROPPED
-A OUTPUT -j DROP
-A INPUT -j DROP
COMMIT
##### NAT Rewriting on IN/OUT Packets
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o $WAN_IF -j MASQUERADE
COMMIT
EOF
echo -n "Bloacking IP6...\n"
/sbin/ip6tables-restore <<-EOF;
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
EOF
echo
echo "Done!"
echo
我的问题是:
我有以下网络拓扑:
互联网 >>>>> [ WAN <<<>>> 服务器 <<<>>> LAN ] <<<<< 本地用户
在我的服务器上,我想阻止 WAN 上的所有传入流量(包括 ping 和其他发现和/或黑客请求),但允许服务器和 LAN 上的本地用户的互联网流量通过。上述代码是否符合此类规则?
我的服务器上有一些服务(如 MYSQL 和 SSH),我直接从服务器本身进行管理,我想阻止 LAN 上的本地用户和 WAN 上的 Internet 上的本地用户访问或连接服务器上的服务和所有内容。上述代码符合这样的规则吗?
上述规则是否存在什么注意事项或安全漏洞?
如果我使用以下规则,在 WAN 上打开到 Internet 的 SSH 端口是否安全?(注意:我将仅使用 ssh 公钥认证,不使用明文密码。)
-A INPUT -i $WAN_IF -m conntrack --ctstate NEW,ESTABLISHED,RELATED -p tcp -d $WAN_IP --dport 22 -j ACCEPT
非常感谢大家。