我没有路由器,所以我将 CentOS 6.4 Linux 系统做成了路由器,将公网流量转发到本地 LAN。它有两张网卡,一张用于公网 IP 地址(eth1),另一张用于私网 IP 地址(eth2)。
我有一个连接到本地局域网的服务器,假设为192.168.1.2
。
路由器
- eth1:
x.x.x.x
,公网 IP 地址 - eth2:,
192.168.1.1
内部路由器地址
当外部网络的某人在公共 IP 上运行 ssh 时,应该将其重定向到服务器:
ssh x.x.x.x
或使用油灰
我禁用了服务器上的 SELinux 和 iptables 防火墙。我尝试在 Linux 系统路由器上进行一些 iptables 修改,但 SSH 请求仍然没有重定向:
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -j DNAT --to-destination 192.168.1.2:22
我还想使用来自同一 Linux 系统路由器的 iptables 将所有 HTTP(80)流量转发到我的内部服务器。
答案1
首先确保内核中启用了数据包转发
# echo 1 > /proc/sys/net/ipv4/ip_forward
您还可以通过添加以下行使其永久生效/etc/sysctl.conf
net.ipv4.ip_forward = 1
您必须在充当路由器的 Linux 机器上执行此操作。您可以在路由器机器上尝试以下规则。
iptables -t nat -A PREROUTING -i eth1 -d x.x.x.x -p tcp --dport 22 -j DNAT --to-destination 192.168.1.2:22
另外,请让我们知道路由器盒的 NAT 规则的输出。
iptables -t nat -L -n -v
答案2
基于这一惊人的数字海洋关于如何转发端口的教程,我决定在这里重写它。
我花了很多时间研究它的工作原理。我是 Linux 新手,开始并不总是那么容易。这是我的服务器及其端口转发的示例:
防火墙服务器(2 张 NIC 卡)-网络详细信息:
- 公共 IP 地址:xx.xx.xx.xx
- 私有 IP 地址:年年年年年
- 公共接口:eth0
- 私有接口:eth1
内部的(例如 ssh、web)服务器(1 个 NIC 卡)- 网络详细信息:
- 私有 IP 地址:zz.zz.zz.zz
- 私有接口:eth0
解决方案:
在内核中启用数据包转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
定义变量:
# Admin IP address (e.g. public home ip)
ADMIN="aa.aa.aa.aa"
# IP addresses of servers (e.g. in cloud):
FW_eth0_ip="xx.xx.xx.xx"
FW_eth1_ip="yy.yy.yy.yy"
WEB_eth0_ip="zz.zz.zz.zz"
# Services:
SSH="22"
HTTP="80"
Iptables 端口转发(使用 -m conntrack):
iptables -t nat -A PREROUTING -i eth0 -s $ADMIN -d $FW_eth0_ip -p tcp --dport $SSH -j DNAT --to-destination $WEB_eth0_ip
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport $SSH -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport $SSH -d $WEB_eth0_ip -j SNAT --to-source $FW_eth1_ip
几点说明:
- “..-s $ADMIN -d $FW_eth0_ip..”(第一行)——仅出于安全原因添加——这意味着只有 ADMIN IP 可以访问 SSH(如果不需要,可以删除它)
- -m 连接跟踪是相同的-m 状态
- 我建议将 SSH 的默认端口更改为另一个端口,例如 1xxxx(在 /etc/ssh/sshd_config 中)
- 查看TCP 和 UDP 端口号列表
- 我使用端口 15xx1 访问防火墙服务器上的 SSH,使用端口 15xxx2 访问内部
终端:
# access firewall server
$ ssh [email protected] -p 15xx1
# access internal server
$ ssh [email protected] -p 15xx2
有关所用规则的更多细节已在上述教程中有完美描述。
这就是我要说的全部内容了,希望能够帮助到你。
答案3
虽然这个问题是关于 iptables 的,但是如果您还运行了 FirewallD,这里是如何访问内部网络的 HTTP。
首先在内部服务器 FirewallD 中允许 http 流量:
# firewall-cmd --permanent --add-service=http
然后将来自外部 ip 的 http 流量转发到内部 ip 的 80 端口:
# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.11
对 SSH 服务也可以做同样的事情。
答案4
首先,在Linux网关中启用路由:
echo 1 > /proc/sys/net/ipv4/ip_forward
然后使用您的网络接口(即 eth1)和所需端口添加以下规则:
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.2
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
使用 检查您的规则iptables -L -v
,pkts 和 bytes 列将显示哪些规则正在匹配。