2 つのネットワーク インターフェイス (Wi-Fi とサイト間 VPN (zerotier)) を備えたホストがあります。
root@host:~# ifconfig wlp0s20f3
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.38 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a098:2166:78af:d78d prefixlen 64 scopeid 0x20<link>
ether ac:12:03:ab:6e:31 txqueuelen 1000 (Ethernet)
RX packets 1071869 bytes 1035656551 (1.0 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 911450 bytes 134092251 (134.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@host:~# ifconfig ztklh3tu4b
ztklh3tu4b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 2800
inet 10.147.18.192 netmask 255.255.255.0 broadcast 10.147.18.255
inet6 fe80::f8f6:d1ff:fe3d:4f09 prefixlen 64 scopeid 0x20<link>
ether fa:f6:d1:3d:4f:09 txqueuelen 1000 (Ethernet)
RX packets 8836 bytes 1146994 (1.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 667 bytes 281732 (281.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
VPN の背後にある IP を除き、このホストへのすべてのトラフィック (受信と送信の両方) をブロックしたいので、次の iptable ルールを追加しました。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT
この 10.147.18.80 に ping しても、成功しません。ping の結果は次のとおりです。
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3067ms
root@host:~# ping 10.147.18.80
PING 10.147.18.80 (10.147.18.80) 56(84) bytes of data.
^C
--- 10.147.18.80 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5097ms
iptables ルールの IP を 8.8.8.8 など他のものに変更すると、すべてが期待どおりに動作します。つまり、8.8.8.8 以外とは通信できません。
編集 iptables -nvL の次の出力はチェーンを示しています。
root@host:~# iptables -nvL
Chain INPUT (policy DROP 23 packets, 4560 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 10.147.18.80 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 330 packets, 25776 bytes)
pkts bytes target prot opt in out source destination
8 672 ACCEPT all -- * * 0.0.0.0/0 10.147.18.80
上記の iptables の出力は、ルールが適用されている場合、パケットは IP に送信されるものの応答が受信されないことを示しています。
私のホスト上の Tcpdump は同じ動作を示します:
tcpdump: data link type LINUX_SLL2
tcpdump: listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
13:28:32.323064 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17342, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 1, length 64
13:28:33.330145 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17567, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 2, length 64
13:28:34.354178 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17694, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 3, length 64
13:28:35.378135 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17714, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 4, length 64
10.147.18.80 の Tcpdump では、10.147.18.192 からの着信 ICMP エコー要求が表示されません。何が問題なのでしょうか?
答え1
このホストでVPNクライアントを使用して2番目のインターフェースを作成する場合は、次のことも忘れないでください。VPNサーバーへの接続を許可するそうしないと、ローカル IP10.147.18.192
にアクセスできなくなります。
少なくとも、インターフェースで VPN サーバーとの間の送信トラフィックと受信トラフィックを許可する必要がありますwlp0s20f3
。
iptables -I OUTPUT -d $vpn_server_ip -p $proto --dport $vpn_port -j ACCEPT
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$proto
または、およびudp
: VPNサーバーのIPアドレスまたは範囲とポートtcp
$vpn_server_ip
$vpn_port
これらの値を推測するのにはあまり役立ちませんが、VPN ドキュメント、または VPN トンネルへの接続が確立されている tcpdump/wireguard からこれらの情報が得られるはずです。
答え2
質問で言及されている次の 2 つのコマンド:
iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT
これらのルールはチェーンの末尾に追加されます。
-A
オプションはルールを末尾に追加します。-I
オプションを使用すると、ルールはチェーンの先頭に配置されます。
DROP
ここでの問題は、チェーンの終わりに到達する前にトラフィックをドロップするルールREJECT
が、チェーンの 1 つにすでに または ルールとして設定されている可能性があることですACCEPT
。たとえば、IP 10.147.18.80 を含むサブネット全体との間のトラフィックをドロップするルールなどです。
ACCEPT ルールの前に、INPUT チェーンか OUTPUT チェーンかに応じて、その IP へのトラフィックまたはその IP からのトラフィックをドロップ/拒否するルールがチェーン内に存在する場合、そのルールでその IP のみが指定されているかサブネット全体が指定されているかに関係なく、トラフィックはドロップされ、チェーン内の他のすべてのルールは処理されなくなります。
DROP
、REJECT
はACCEPT
終了ターゲットであり、iptables がそのルールに一致すると、チェーン内の他のルールの処理を停止し、次のルールに進みません。
試す
iptables -I INPUT -s 10.147.18.80 -j ACCEPT
iptables -I OUTPUT -d 10.147.18.80 -j ACCEPT
これにより、これらのルールがチェーンの最上位に配置され、最初に適用されるルールとなり、これらのチェーン内のトラフィックに対して他のルールは処理されなくなります。
チェーン内のすべてのルールを次のようにリストすることができます。
iptables -nvL
特定のチェーンだけを表示したい場合
iptables -nvL INPUT
iptables -nvL OUTPUT
編集
貼り付けた出力と、デフォルトのアクションをACCEPT
これに変更すると ping を実行できるという事実を考慮すると、問題はないようです。
tcpdump などを使用して、トラフィックが送信され、返されるかどうかを確認できます。
このコマンドは、マシンによって送信または受信されるすべてのICMPパケットを取得します。
tcpdump -nnvvi any icmp
出力にこのようなものが表示された場合
10:13:48.866598 IP (tos 0x0, ttl 255, id 30625, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 26621, seq 4, length 64
10:13:48.867771 IP (tos 0x0, ttl 53, id 0, offset 0, flags [none], proto ICMP (1), length 84)
10.147.18.80 > 10.147.18.192: ICMP echo reply, id 26621, seq 4, length 64
その後、ping パケットは送信され、返されますが、他のルールによって拒否されます。
nat テーブルや mingle テーブルなどの他のテーブルに他のルールがあるかどうか、また、そのルールの一部がトラフィックと競合していないかどうかを確認できます。
iptables -t nat -nvL
iptables -t mingle -nvL
また、リストの下の番号で、パケットが OUTPUT チェーンの ACCEPT ルールを通過しているかどうかを確認することもできますpkts
。ping を試みた後にその番号が増加しているのに、INPUT チェーンの番号が 0 のままである場合は、着信トラフィック ルールに問題があります。
また、コマンドまたは同様のものを使用してルートを確認してください。ip r
トラフィックが同じサブネット内のインターフェースから出ていない可能性があるため、途中で NAT ルールにより返されるパケットの送信元 IP が変更されている可能性があります。