我尝试在我的 CentOS-7-Router 上使用firewalld 设置 SNAT,如下所述这里,补充自卡尔·鲁普斯的解释,但我最终喜欢埃里克。我还阅读了一些其他文档,但我无法让它工作,因此我的客户端 IP 被转换为另一个源 IP。
两个都
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -p tcp -o enp1s0 -d 192.168.15.105 -j SNAT --to-source 192.168.25.121
或者
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -p tcp -s 192.168.15.105/32 -j SNAT --to-source 192.168.25.121
给出“成功”。我firewall-cmd --reload
事后做一个。但是,如果我尝试检查该表,则iptables -t nat -nvL POSTROUTING
未列出该规则。
但是,如果我再次应用上述规则之一,firewalld 会警告我,例如Warning: ALREADY_ENABLED: rule '['-p', 'tcp', '-o', 'enp1s0', '-d', '192.168.15.105', '-j', 'SNAT', '--to-source', '192.168.25.121']' already is in 'ipv4:nat:POSTROUTING'
- 但没有将源 IP 192.168.15.105 伪装成 192.168.45.121 的 SNAT 功能正在工作。
也许有人可以解释我做错了什么?
经过几个小时的挣扎,我仍然坚持 DNAT/SNAT。我现在只使用 iptables:
1.)
iptables -t nat -A PREROUTING -p tcp --dport 1433 -i enp1s0 -d 192.168.25.121 -j DNAT --to-destination 192.168.15.105
和
2.)
iptables -t nat -A POSTROUTING -p tcp --sport 1433 -o enp1s0 -s 192.168.15.105/32 -j SNAT --to-source 192.168.25.121
所以iptables -t nat -nvL PREROUTING
显示:
pkts bytes target prot opt in out source destination
129 12089 PREROUTING_direct all -- * * 0.0.0.0/0 0.0.0.0/0
129 12089 PREROUTING_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0
129 12089 PREROUTING_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- enp1s0 * 0.0.0.0/0 192.168.25.121 tcp dpt:1433 to:192.168.15.105
和
iptables -t nat -nvL POSTROUTING
显示:
pkts bytes target prot opt in out source destination
97 7442 POSTROUTING_direct all -- * * 0.0.0.0/0 0.0.0.0/0
97 7442 POSTROUTING_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0
97 7442 POSTROUTING_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 SNAT tcp -- * enp1s0 192.168.15.105 0.0.0.0/0 tcp spt:1433 to:192.168.25.121
一切都完成了,这里有一些更好的解释:
-https://wiki.ubuntuusers.de/iptables2
-https://netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html
-https://serverfault.com/questions/667731/centos-7-firewalld-remove-direct-rule
PREROUTING(或 POSTROUTING)不是在从内部接口到外部接口的 ip_forwarding 之前(或之后)完成的吗?
答案1
#!/bin/bash
# Assuming that your Linux box has two NICs; eth0 attached to WAN and eth1 attached to LAN
# eth0 = outside
# eth1 = inside
# [LAN]----> eth1[GATEWAY]eth0 ---->WAN
# Run the following commands on LINUX box that will act as a firewall or NAT gateway
firewall-cmd --query-interface=eth0
firewall-cmd --query-interface=eth1
firewall-cmd --get-active-zone
firewall-cmd --add-interface=eth0 --zone=external
firewall-cmd --add-interface=eth1 --zone=internal
firewall-cmd --zone=external --add-masquerade --permanent
firewall-cmd --reload
firewall-cmd --zone=external --query-masquerade
# ip_forward is activated automatically if masquerading is enabled.
# To verify:
cat /proc/sys/net/ipv4/ip_forward
# set masquerading to internal zone
firewall-cmd --zone=internal --add-masquerade --permanent
firewall-cmd --reload
firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o eth1 -j ACCEPT
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
firewall-cmd --reload
答案2
这里有一个类似的答案:
https://www.server-world.info/en/note?os=CentOS_7&p=firewalld&f=2
使用 nmcli 设置内部/外部:
nmcli c mod ens224 connection.zone internal
nmcli c mod ens192 connection.zone external
但@布鲁斯·马劳兹的答案内容更丰富。我还不习惯firewalld所以我开始使用default/iptables建议:如何使用 Linux 作为网关? Firewalld 默认设置以不同方式使用 IP 链,因此最好始终使用 Firewalld。
感谢 iptraf-ng 预览@jochen-gebsattel这是一个很棒的小程序。