我正在尝试从我们的产品中删除一个路由器,并使用 iptables 替换其所有功能。
该系统需要执行一般流量控制以及将数据转发到 LAN 后面的特定服务器。当前设置是 -
- eth0——外部
- eth1——内部
- eth2——内部
- eth3——内部
eth0 通过 DHCP 获取 IP。
eth1、eth2 和 eth3 构成桥接器 (br0) 的一部分,其静态地址为 10.0.1.1。
10.0.1.2 上有一台服务器,需要处理 HTTP 和 MySQL 流量。无法保证这台服务器将插入哪里(eth1/2/3),但 IP 是静态的。
我曾尝试设置 iptables 规则,这些规则似乎仅使用一个 eth 设备就很容易遵循,但是当需要转发时,我就会陷入困境。
这是我迄今为止尝试过的:
# clear and flush everything
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
iptables -t security -F
iptables -t security -X
# DROP packets unless covered by rules
iptables -P FORWARD DROP
iptables -P INPUT DROP
# No intention of filtering any outgoing traffic
iptables -P OUTPUT ACCEPT
# Handle our routing
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.1.2:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3306 -j DNAT --to 10.0.1.2:3306
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Input Chain
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # ssh
iptables -A INPUT -s 10.0.1.2 -p tcp --dport 3306 -j ACCEPT # ssh
# Forward Chain
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 10.0.1.2 -j ACCEPT
iptables -A FORWARD -i eth0 -p tcp --dport 3306 -d 10.0.1.2 -j ACCEPT
# enable ipv4 forwardning for the system
echo 1 > /proc/sys/net/ipv4/ip_forward
这给了我最终的链/规则设置 -
Chain INPUT (policy DROP 1 packets, 49948 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 10.0.1.2 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 10.0.1.2 tcp dpt:80
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 10.0.1.2 tcp dpt:3306
Chain OUTPUT (policy ACCEPT 1 packets, 196 bytes)
pkts bytes target prot opt in out source destination
但是,我无法通过经外部接口(防火墙外)连接的客户端登录到我的内部 MySQL 服务器。
我读到过数据包只通过每个链(输入/转发/输出),但这里还是这种情况吗?我的转发数据包是否会在单独的接口上再次作为输入处理?
上述配置中有什么明显的错误吗?
配置详细信息 -
输出netstat -rn
来自一位客户能从...连接
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.0.0.139 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br0
Telnet 按预期连接。
来自一位客户不能从...连接
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.0.0.139 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlan0
Telnet 只是显示Trying 10.0.0.17...
并且实际上从未成功......
网络描述 -
10.0.0.0是一般办公网络,防火墙盒子上的eth0接口接在这里,它的IP地址目前是10.0.0.17……
10.0.1.0 是位于防火墙 eth1/2/3 后面的网络。
我想使用分配给 eth0 (10.0.0.17) 的 IP 地址访问防火墙后面的服务器。
答案1
由于您列出了可以连接的客户端,因此您的设置没有任何问题iptables
。然而,这并不是全部:客户端必须有一条路由才能到达服务器的转发地址,而服务器必须有一条返回路由,这样数据包才能到达转发地址。
正常工作的客户端在 10.0.1.0/24 网络上具有一些物理存在,因此有到该网络的路由:
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
客户端不仅没有到 10.0.1.0/24 的路由,而且还有到 10.0.0.0/16 的更通用路由,可以从其无线网卡发送流量。
现在你还没有告诉我们这一切发生所在的网络的几何形状;从重叠空间的 /24 和 /16 网络掩码之间的混淆来看,我猜这一切都有点混乱(这不能保证;这样做有正当的理由,但他们通常比愚蠢的人多)。此外,您的网络细节只对您有趣。
但结果是,任何想要到达那里的客户端10.0.1.2
首先必须知道如何到达 10.0.1.0/24,而且这必须是一个正确的想法。
以与您的网络几何相一致的方式修复客户端上的路由表,一切都会得到改善。