iptables – 转发+伪装

我是新来的iptables,并尝试将我的Linux服务器设置为我的其他计算机的网关。所以自然我玩iptables,需要一些帮助

我的服务器有2个NIC卡, eth0(WAN)eth1(LAN)

我的目标是:

  1. 对于我来说,有SSH访问到Linux服务器
  2. 将所有进入eth1(LAN)的http(80)和https(443)通信转发到eth0,并进行ip伪装
  3. 进入eth1的所有其他stream量(主要是来自LAN客户端的DHCP请求)不应该转发到eth0
  4. 不允许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(这是允许进来的iptables)和我的eth0行准备伪装的HTTP / HTTPSstream量。

我的问题是我如何转发这个stream量从eth1到eth0

任何帮助将非常感激,
ANKIT

首先,几个更正:表名是区分大小写的,就像命令行开关一样:你需要--table filter -A INPUT 。 此外,HTTPS为443(可能是一个错字,但值得指出)

接下来你需要做的是在脚本底部放置INPUT规则。 INPUT链只用于在服务器本身绑定本地进程的数据包。 所以这些规则将允许局域网上的客户端直接连接到监听服务器端口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 

另外一个build议:不要在链的末端丢弃数据包的规则,请考虑使用策略设置:

 iptables -t filter -P INPUT DROP iptables -t filter -P OUTPUT DROP iptables -t filter -P FORWARD DROP 

为了进一步的参考,有一个很好的netfilter数据包stream图,在这里: http : //www.shorewall.net/NetfilterOverview.html