Iptables

我的 iptables 規則有什麼問題,導致它無法路由到 openvpn?

  • June 22, 2022

相反,firewalld將通過簡單的設置來進行路由masquerade。所以我確信其餘的設置都是正確的。這是一般的想法:

$$ App -> tun0(10.0.0.2) -> Openvpn Client $$—->$$ Openvpn Server(10.0.0.1) -> eth0->Public IP $$—->$$ some IP’s on www $$

為了實現它,這裡是客戶端的 openvpn 配置(簡要):

daemon
dev tun
remote 70.34.22.247
rport 1100
lport 1100
proto udp
ifconfig 10.0.0.2 10.0.0.1
writepid /run/tunpid
verb 4
route 209.51.188.116 255.255.255.255 vpn_gateway #gnu.org for debug test

顯然,在 IP 209.51.188.116/32 上添加的路由規則確保它會自動要求 openvpn 伺服器(位於 10.0.0.1)為它路由請求。curl 209.51.188.116將測試openvpn是否可以完成工作。我已經確認打開這個 openvpn 隧道,它卡住了,但是沒有隧道,它可以工作。我還發現登錄 openvpn 伺服器站點,所以隧道內的流量確實發生了。儘管“tcpdump”沒有顯示流量conntrack -E,但確實顯示了流量。以下是伺服器的配置,其日誌級別為 7,以便記錄隧道內的任何數據包:

dev tun0
lport 1100
proto udp
ifconfig 10.0.0.1 10.0.0.2
verb 7

CentOS 7 的路由功能明顯上:

# cat /proc/sys/net/ipv4/ip_forward
1

而對於 iptables,我使用的是 iptables 服務,這意味著它會使用 自動載入設置systemctl restart iptables,並且載入成功,否則會發生錯誤並systemctl status iptables顯示錯誤狀態。這是關於的配置/etc/sysconfig/iptables

# Generated by iptables-save v1.4.21 on Thu Jun  9 14:12:50 2022
*nat
:PREROUTING ACCEPT [27:1704]  
:INPUT ACCEPT [12:648]
:OUTPUT ACCEPT [3:216]
:POSTROUTING ACCEPT [3:216]
#-A POSTROUTING -s 10.0.0.0/8 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/8 -j SNAT --to-source 70.34.22.247
COMMIT
# Completed on Thu Jun  9 14:12:50 2022
# Generated by iptables-save v1.4.21 on Thu Jun  9 14:12:50 2022
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [160:19179]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp --dport 1100 -j ACCEPT  
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -s 10.0.0.0/8 -j ACCEPT 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

我懷疑是否-j MASQUERADE不起作用,所以我將其更改為直接 SNAT 到 eth0 的地址。但這也行不通。當然,相比之下,如果我禁用iptables,並firwalld改用,並設置接受1100/udpadd-masquerade一切正常。所以問題一定出在上面的配置上。

你知道iptables的配置有什麼問題嗎?

看起來前鋒在一個方向上是允許的,但在另一個方向上是不允許的。我建議使用介面名稱而不是 IP 地址。

例子:

-A FORWARD -i eth0 -o tun0 -j ACCEPT
-A FORWARD -i tun0 -o eth0 -j ACCEPT

引用自:https://serverfault.com/questions/1103836