我是 iptables 新手,想将我的 linux 服务器设置为其他计算机的网关。所以很自然地,我正在使用 iptables,需要一些帮助
我的服务器有 2 张 NIC 卡,eth0(广域网)和eth1(局域网)
我的目标是:
- 为了让我能够通过 ssh 访问 Linux 服务器
- 将进入 eth1(LAN)的所有 http(80)和 https(443)流量转发到 eth0 并进行 IP 伪装
- 进入 eth1 的所有其他流量(主要是来自 LAN 客户端的 DHCP 请求)不应转发到 eth0
- 不允许 LAN 客户端运行任何服务,即只能访问网络(tcp:80/443)
我目前制定的规则是:
#To clear all IPTables Rules
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
#allow me to ssh into the server + access the web server on it
#ssh
iptables --table FILTER -A INPUT -p tcp --dport 22 -j ACCEPT
#webserver
iptables --table FILTER -A INPUT -p tcp --dport 80 -j ACCEPT
#drop everything else
iptables --table FILTER -A INPUT -j DROP
#enable IP Masquerading on eth0
iptables --table NAT -A POSTROUTING --out-interface eth0 -j MASQUERADE
#accept incoming traffic from eth1
#http
iptables --table FILTER -A INPUT -p tcp -dport 80 --in-interface eth1 -j ACCEPT
#https
iptables --table FILTER -A INPUT -p tcp -dport 443 --in-interface eth1 -j ACCEPT
#drop everything else
iptables --table FILTER -A INPUT --in-interface eth1 -j DROP
所以此时,我已经有了从 eth1 传入的 http/https 流量(iptables 允许传入),并且我的 eth0 线路已准备好进行伪装。
我的问题是我如何将此流量从 eth1 转发到 eth0?
任何帮助都将不胜感激,
ankit
答案1
首先,需要进行一些更正:表名区分大小写,命令行开关也是如此:您需要--table filter -A INPUT
。此外,https 的 dport 是 443(可能是打字错误,但值得指出)
接下来您需要做的是将 INPUT 规则放在脚本的底部。该INPUT
链仅供绑定到服务器本身上的本地进程的数据包使用。因此,这些规则将允许 LAN 上的客户端直接连接到服务器上侦听端口 80+443 的服务。这对于您的初始 SSH 和 HTTP 规则是正确的,但对于数据包转发则不正确。请改用链FORWARD
:
#http
iptables --table filter -A FORWARD -p tcp -dport 80 --in-interface eth1 -j ACCEPT
#https
iptables --table filter -A FORWARD -p tcp -dport 443 --in-interface eth1 -j ACCEPT
除此之外,您还需要在内核中启用 IP 转发。将其添加到脚本顶部:
echo 1 > /proc/sys/net/ipv4/ip_forward
附加建议:不要使用在链末端丢弃数据包的规则,而要考虑使用以下策略设置:
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
为了进一步参考,这里有一张数据包通过 netfilter 的详细图表:http://www.shorewall.net/NetfilterOverview.html