我正在尝试使用 iptables 在 Ubuntu 14.04 服务器 (IP=192.168.36.217) 上完成简单的数据包转发。我想接收发往特定端口上的服务器的传入数据包,并将其重写到新目的地,并使用指定端口 (HTTPS) 和设置为此服务器的源 IP 以及使用 NAT 设置源端口,以便可以在返回数据包时进行反转。
表 mangle、raw 和 security 为空。所有表的所有规则都默认为 ACCEPT。我在 PREROUTING 中有 1 条 DNAT 规则,在 POSTROUTING 中有 1 条 SNAT 规则。然后我添加了一些 LOG 规则,只是为了检查发生了什么。以下是表 nat 和 filter 的样子:
过滤表
Chain INPUT (policy ACCEPT 249 packets, 15888 bytes)
num pkts bytes target prot opt in out source destination
1 143 8348 LOG tcp -- * * 10.15.4.115 0.0.0.0/0 LOG flags 0 level 4 prefix "l++: INP of interest: "
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 169 packets, 12148 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 LOG tcp -- * * 0.0.0.0/0 45.45.45.45 LOG flags 0 level 4 prefix "l++: filter\OUTPUT : "
nat 表
Chain PREROUTING (policy ACCEPT 2762 packets, 279K bytes)
num pkts bytes target prot opt in out source destination
1 33 1672 LOG tcp -- * * 10.15.4.115 0.0.0.0/0 tcp dpt:65001 LOG flags 0 level 4 prefix "l++: nat PRE "
2 15 760 DNAT tcp -- * * 10.15.4.115 0.0.0.0/0 tcp dpt:65001 to:45.45.45.45:45001
3 0 0 LOG tcp -- * * 10.15.4.115 0.0.0.0/0 LOG flags 0 level 4 prefix "l++: nat PRE BOT"
Chain INPUT (policy ACCEPT 263 packets, 46239 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 LOG all -- * * 10.15.4.115 0.0.0.0/0 LOG flags 0 level 4 prefix "l++: nat INP: "
Chain OUTPUT (policy ACCEPT 60 packets, 4285 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 60 packets, 4285 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 LOG tcp -- * * 10.15.4.115 0.0.0.0/0 LOG flags 0 level 4 prefix "l++: nat POST end: "
2 0 0 SNAT tcp -- * em1 10.15.4.115 0.0.0.0/0 to:192.168.36.217
3 0 0 LOG tcp -- * em1 192.168.36.217 0.0.0.0/0 LOG flags 0 level 4 prefix "l++: nat POST after SNAT: "
4 0 0 LOG tcp -- * em1 10.15.4.115 0.0.0.0/0 LOG flags 0 level 4 prefix "l++: nat POST after SNAT what"
当我测试时(从 10.15.4.115:telnet 192.168.36.217 65001),这是我在系统消息日志中看到的全部内容:
May 19 15:20:40 LDAP-Proxy kernel: [1891508.926283] l++: nat PRE IN=em1 OUT=
MAC=<omitted> SRC=10.15.4.115 DST=192.168.36.217 LEN=52 TOS=0x00 PREC=0x00
TTL=127 ID=21164 DF PROTO=TCP SPT=59394 DPT=65001 WINDOW=64512 RES=0x00 SYN
URGP=0
我相信我已经将 PREROUTING 规则与 LOG 规则绑定在一起。数据包进入,到达 DNAT 规则,然后立即消失。
我很乐意接受任何关于此不当行为的建议、想法和猜测。谢谢!
答案1
除了设置正确的 iptables 规则外,还需要在内核中启用转发。检查当前设置(默认为禁用):
cat /proc/sys/net/ipv4/ip_forward
如果它已禁用(0),那么可以通过以下方式启用它(非持久性):
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
或(仍然非持久性)通过:
sudo sysctl -w net.ipv4.ip_forward=1
对于持久设置(下次重新启动后),以 sudo 身份编辑文件/etc/sysctl.conf
并更改此行:
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
对此:
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1