「インターネット共有」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「http://xyne.archlinux.ca/」を「https://xyne.archlinux.ca/」に置換) |
(英語版と同期) |
||
19行目: | 19行目: | ||
== 要件 == |
== 要件 == |
||
− | + | サーバーとして機能するマシンにはネットワークデバイスを別に設定する必要があります。このネットワークデバイスにはインターネットアクセスにアクセスするマシンへの正常な [[Wikipedia:ja:データリンク層|w:データリンク層]] が必要です: |
|
− | * |
+ | * 複数のマシンにインターネットを共有するために [[Wikipedia:ja:スイッチングハブ|スイッチ]] がデータリンク層を提供できます |
+ | * ワイヤレスデバイスも同様に複数のマシンへ接続を共有できます。[[Wikipedia:ja:ソフトウェアアクセスポイント|ソフトウェアアクセスポイント]] を参照して下さい。 |
||
− | |||
− | + | * 一つのマシンで共有する場合は、[[Wikipedia:ja:イーサネット・クロスオーバー・ケーブル|クロスオーバーケーブル]] で十分です。2台のコンピュータのイーサネットカードが [[w:Medium Dependent Interface#Auto_MDI-X|MDI-X]] 機能を持つ場合、クロスオーバーケーブルは不要で通常のイーサネットケーブルが使えます。rootで {{ic|ethtool ''interface'' <nowiki>|</nowiki> grep MDI}} を実行すると判別し易くなります。 |
|
== 設定 == |
== 設定 == |
||
29行目: | 29行目: | ||
{{Tip|[[Udev#固定デバイス名の設定]]を使ってデバイスの名前は変更することができます。}} |
{{Tip|[[Udev#固定デバイス名の設定]]を使ってデバイスの名前は変更することができます。}} |
||
+ | |||
+ | サーバーコンピュータには、最後の [[#クライアント PC に IP アドレスを割り当てる]] ステップを除くすべての設定がされています。 |
||
=== 固定 IP アドレス === |
=== 固定 IP アドレス === |
||
− | 他のマシンに接続したインターフェイスに固定 IPv4 アドレスを割り当てます。アドレスの頭3バイトは |
+ | サーバーコンピュータ上で、他のマシンに接続したインターフェイスに固定 IPv4 アドレスを割り当てます。他のインターフェイスのネットマスクが /24 より大きい場合を除き、アドレスの頭3バイトは両インターフェイスのアドレスの頭3バイトと違っている必要があります。 |
# ip link set up dev net0 |
# ip link set up dev net0 |
||
− | # ip addr add 192.168.123.100/24 dev net0 # |
+ | # ip addr add 192.168.123.100/24 dev net0 # 任意のアドレス |
− | 起動時に固定 ip を割り当てたい場合、[[ |
+ | 起動時に固定 ip を割り当てたい場合、[[ネットワークマネージャ]] を使います。 |
=== パケット転送の有効化 === |
=== パケット転送の有効化 === |
||
42行目: | 44行目: | ||
現在のパケット転送の設定をチェック: |
現在のパケット転送の設定をチェック: |
||
# sysctl -a | grep forward |
# sysctl -a | grep forward |
||
+ | |||
+ | インターフェース毎に別々の IPv4/IPv6 オプションがあるように、デフォルト毎、インターフェース毎に転送を制御するオプションが存在することに注意して下さい。 |
||
次のコマンドを実行して一時的にパケット転送を有効化: |
次のコマンドを実行して一時的にパケット転送を有効化: |
||
47行目: | 51行目: | ||
{{Tip|特定のインターフェイスでのみパケット転送を有効にしたい場合は {{ic|1=sysctl net.ipv4.conf.''interface_name''.forwarding=1}} を使ってください。}} |
{{Tip|特定のインターフェイスでのみパケット転送を有効にしたい場合は {{ic|1=sysctl net.ipv4.conf.''interface_name''.forwarding=1}} を使ってください。}} |
||
+ | |||
+ | {{Warning|システムがネットワークインターフェースの制御に [[systemd-networkd]] を使っている場合、インターフェース毎の IPv4 設定は不可能です。すなわち、systemd のロジックはどのような転送設定も(全インターフェース用の)IPv4 のグローバル設定へ伝搬します。推奨される回避策は firewall を使って特定のインターフェースに対して転送を禁止することです。詳しくは {{man|5|systemd.network}} マニュアルページを参照して下さい。以前の systemd リリース 220/221 に導入されたカーネルの設定を優先する {{ic|1=IPForward=kernel}} セマンティクスはもはや適用されません。[https://github.com/poettering/systemd/commit/765afd5c4dbc71940d6dd6007ecc3eaa5a0b2aa1] [https://github.com/systemd/systemd/blob/a2088fd025deb90839c909829e27eece40f7fce4/NEWS]}} |
||
再起動した後も設定が残るようにするには {{ic|/etc/sysctl.d/30-ipforward.conf}} を編集: |
再起動した後も設定が残るようにするには {{ic|/etc/sysctl.d/30-ipforward.conf}} を編集: |
||
56行目: | 62行目: | ||
設定した後は、再起動してから転送が有効になっているか確認するのを推奨します。 |
設定した後は、再起動してから転送が有効になっているか確認するのを推奨します。 |
||
− | |||
− | {{Note|[[systemd-networkd]] はバージョン 220/221 から新しいフォワーディングセマンティクスを導入しています [https://github.com/systemd/systemd/blob/a2088fd025deb90839c909829e27eece40f7fce4/NEWS]。systemd-networkd を使ってネットワークインターフェイスを制御している場合、デフォルトで、systemd-networkd が {{ic|net.*.ip_forward}} の設定を上書きして、転送をオフにしてしまいます。systemd-networkd で上記の設定を使うには systemd-networkd のインターフェイス設定ファイルで {{ic|1=IPForward=kernel}} と設定する必要があります (詳しくは {{ic|man 5 systemd.network}} を参照)。}} |
||
=== NAT の有効化 === |
=== NAT の有効化 === |
||
+ | ==== iptables を使う ==== |
||
− | |||
[[公式リポジトリ]]から {{Pkg|iptables}} パッケージを[[インストール]]してください。iptables を使って NAT を有効化: |
[[公式リポジトリ]]から {{Pkg|iptables}} パッケージを[[インストール]]してください。iptables を使って NAT を有効化: |
||
70行目: | 74行目: | ||
詳細は [[iptables]] の記事を読んで下さい (特に、ルールの保存と、起動時に自動的にルールを適用させる方法の項)。iptables については[[シンプルなステートフルファイアウォール]]のページでも詳しい解説をしています。 |
詳細は [[iptables]] の記事を読んで下さい (特に、ルールの保存と、起動時に自動的にルールを適用させる方法の項)。iptables については[[シンプルなステートフルファイアウォール]]のページでも詳しい解説をしています。 |
||
+ | |||
+ | ==== nftables を使う ==== |
||
+ | {{Pkg|nftables}} を [[インストール]] して下さい。[[nftables]] で NAT を有効にするには、新規/既存のテーブルに prerouting と postrouting チェインを作成する必要があります(両方のチェインが空の場合でも必要): |
||
+ | |||
+ | # nft add table ip nat |
||
+ | # nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; } |
||
+ | # nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; } |
||
+ | |||
+ | {{Note|IPv6 を使いたい場合、{{ic|ip}} を {{ic|ip6}} で置き換える必要があります。}} |
||
+ | その後、{{ic|internet0}} 用に {{ic|net0}} アドレスをマスカレードする必要があります: |
||
+ | # nft add rule nat postrouting oifname internet0 masquerade |
||
+ | |||
+ | 転送に対しさらにいくつかの firewall による制限を追加できます ( [[Nftables#シンプルな IPv4/IPv6 ファイアウォール]] で設定されているような、フィルターテーブルが存在することが前提です): |
||
+ | |||
+ | # nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop} |
||
+ | # nft add rule filter forward ct state related,established accept |
||
+ | # nft add rule filter forward iifname net0 oifname internet0 accept |
||
+ | |||
+ | nftables における NAT の詳細は [https://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT) nftables Wiki] を見て下さい。変更を永続化するには [[nftables]] に従って下さい。 |
||
=== クライアント PC に IP アドレスを割り当てる === |
=== クライアント PC に IP アドレスを割り当てる === |
||
− | 定期的に、複数のマシンで、設定したマシンのインターネット共有を使う場合、[[Wikipedia:ja:Dynamic Host Configuration Protocol|dhcp サーバー]]をインストールすると良いでしょう。 |
+ | 定期的に、複数のマシンで、設定したマシンのインターネット共有を使う場合、[[dhcpd]] や [[dnsmasq]] のような [[Wikipedia:ja:Dynamic Host Configuration Protocol|dhcp サーバー]]をインストールすると良いでしょう。その後、各クライアント PC で DHCP クライアント(例えば [[dhcpcd]])を設定してください。 |
+ | {{Style|This is not an iptables guide. Expanding the chain with {{ic|iptables -I}} might skip other important rules; if you need to script an ON/OFF switch for this, use custom chain with a jump placed carefully in the INPUT chain.}} |
||
− | [[dhcpd]] の wiki 記事を読んで dhcp サーバーを追加することができます。その後、クライアント pc に [[dhcpcd]] クライアントをインストールしてください。 |
||
+ | DHCP サーバでは UDP ポート 67 への着信を許可する必要があります。DNS リクエストのために UDP/TCP ポート 53 への着信も許可する必要があります。 |
||
− | 特に定期的に使うというわけではないのであれば、手動でクライアントに ip を追加する方法もあります。 |
||
+ | # iptables -I INPUT -p udp --dport 67 -i net0 -j ACCEPT |
||
+ | # iptables -I INPUT -p udp --dport 53 -s 192.168.123.0/24 -j ACCEPT |
||
+ | # iptables -I INPUT -p tcp --dport 53 -s 192.168.123.0/24 -j ACCEPT |
||
+ | |||
+ | 特に定期的に使うというわけではないのであれば、手動でクライアントに IP を追加する方法もあります。 |
||
==== 手動で IP を追加 ==== |
==== 手動で IP を追加 ==== |
||
+ | {{Style|Duplicates [[Network configuration#Static IP address]].}} |
||
− | dhcp を使わない場合、クライアント pc で、ip アドレスとデフォルトルートを追加: |
||
+ | |||
− | # ip addr add 192.168.123.201/24 dev eth0 # arbitrary address, first three blocks must match the address from above |
||
+ | DHCP を使う代わりに、クライアント PC で、IP アドレスとデフォルトルートを追加: |
||
+ | # ip addr add 192.168.123.201/24 dev eth0 # 任意のアドレス、最初の3ブロックは前述のアドレスと一致している必要があります |
||
# ip link set up dev eth0 |
# ip link set up dev eth0 |
||
− | # ip route add default via 192.168.123.100 dev eth0 # |
+ | # ip route add default via 192.168.123.100 dev eth0 # 最初と同じアドレス |
全てのクライアントで DNS サーバーを設定してください。詳しくは [[resolv.conf]] を参照。 |
全てのクライアントで DNS サーバーを設定してください。詳しくは [[resolv.conf]] を参照。 |
||
96行目: | 126行目: | ||
== 参照 == |
== 参照 == |
||
* [https://xyne.archlinux.ca/notes/network/dhcp_with_dns.html Xyne's guide and scripts for launching a subnet with DHCP and DNS] |
* [https://xyne.archlinux.ca/notes/network/dhcp_with_dns.html Xyne's guide and scripts for launching a subnet with DHCP and DNS] |
||
+ | * [[NetworkManager]] でインターネット共有を設定できます |
2018年12月1日 (土) 23:12時点における版
関連記事
この記事ではあるマシンと他のマシンでインターネット接続を共有する方法を解説します。
目次
要件
サーバーとして機能するマシンにはネットワークデバイスを別に設定する必要があります。このネットワークデバイスにはインターネットアクセスにアクセスするマシンへの正常な w:データリンク層 が必要です:
- 複数のマシンにインターネットを共有するために スイッチ がデータリンク層を提供できます
- ワイヤレスデバイスも同様に複数のマシンへ接続を共有できます。ソフトウェアアクセスポイント を参照して下さい。
- 一つのマシンで共有する場合は、クロスオーバーケーブル で十分です。2台のコンピュータのイーサネットカードが MDI-X 機能を持つ場合、クロスオーバーケーブルは不要で通常のイーサネットケーブルが使えます。rootで
ethtool interface | grep MDI
を実行すると判別し易くなります。
設定
このセクションでは、クライアントのコンピュータに接続するネットワークデバイスの名前は net0、インターネットに接続するネットワークデバイスの名前は internet0 としています。
サーバーコンピュータには、最後の #クライアント PC に IP アドレスを割り当てる ステップを除くすべての設定がされています。
固定 IP アドレス
サーバーコンピュータ上で、他のマシンに接続したインターフェイスに固定 IPv4 アドレスを割り当てます。他のインターフェイスのネットマスクが /24 より大きい場合を除き、アドレスの頭3バイトは両インターフェイスのアドレスの頭3バイトと違っている必要があります。
# ip link set up dev net0 # ip addr add 192.168.123.100/24 dev net0 # 任意のアドレス
起動時に固定 ip を割り当てたい場合、ネットワークマネージャ を使います。
パケット転送の有効化
現在のパケット転送の設定をチェック:
# sysctl -a | grep forward
インターフェース毎に別々の IPv4/IPv6 オプションがあるように、デフォルト毎、インターフェース毎に転送を制御するオプションが存在することに注意して下さい。
次のコマンドを実行して一時的にパケット転送を有効化:
# sysctl net.ipv4.ip_forward=1
再起動した後も設定が残るようにするには /etc/sysctl.d/30-ipforward.conf
を編集:
/etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1 net.ipv6.conf.default.forwarding=1 net.ipv6.conf.all.forwarding=1
設定した後は、再起動してから転送が有効になっているか確認するのを推奨します。
NAT の有効化
iptables を使う
公式リポジトリから iptables パッケージをインストールしてください。iptables を使って NAT を有効化:
# iptables -t nat -A POSTROUTING -o internet0 -j MASQUERADE # iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # iptables -A FORWARD -i net0 -o internet0 -j ACCEPT
詳細は iptables の記事を読んで下さい (特に、ルールの保存と、起動時に自動的にルールを適用させる方法の項)。iptables についてはシンプルなステートフルファイアウォールのページでも詳しい解説をしています。
nftables を使う
nftables を インストール して下さい。nftables で NAT を有効にするには、新規/既存のテーブルに prerouting と postrouting チェインを作成する必要があります(両方のチェインが空の場合でも必要):
# nft add table ip nat # nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; } # nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
その後、internet0
用に net0
アドレスをマスカレードする必要があります:
# nft add rule nat postrouting oifname internet0 masquerade
転送に対しさらにいくつかの firewall による制限を追加できます ( Nftables#シンプルな IPv4/IPv6 ファイアウォール で設定されているような、フィルターテーブルが存在することが前提です):
# nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop} # nft add rule filter forward ct state related,established accept # nft add rule filter forward iifname net0 oifname internet0 accept
nftables における NAT の詳細は nftables Wiki を見て下さい。変更を永続化するには nftables に従って下さい。
クライアント PC に IP アドレスを割り当てる
定期的に、複数のマシンで、設定したマシンのインターネット共有を使う場合、dhcpd や dnsmasq のような dhcp サーバーをインストールすると良いでしょう。その後、各クライアント PC で DHCP クライアント(例えば dhcpcd)を設定してください。
DHCP サーバでは UDP ポート 67 への着信を許可する必要があります。DNS リクエストのために UDP/TCP ポート 53 への着信も許可する必要があります。
# iptables -I INPUT -p udp --dport 67 -i net0 -j ACCEPT # iptables -I INPUT -p udp --dport 53 -s 192.168.123.0/24 -j ACCEPT # iptables -I INPUT -p tcp --dport 53 -s 192.168.123.0/24 -j ACCEPT
特に定期的に使うというわけではないのであれば、手動でクライアントに IP を追加する方法もあります。
手動で IP を追加
DHCP を使う代わりに、クライアント PC で、IP アドレスとデフォルトルートを追加:
# ip addr add 192.168.123.201/24 dev eth0 # 任意のアドレス、最初の3ブロックは前述のアドレスと一致している必要があります # ip link set up dev eth0 # ip route add default via 192.168.123.100 dev eth0 # 最初と同じアドレス
全てのクライアントで DNS サーバーを設定してください。詳しくは resolv.conf を参照。
これでクライアント PC はインターネットに接続されるはずです。
トラブルシューティング
PC に接続することはできながら、データを送信することはできない場合 (例えば、クライアント PC がサーバー PC に DHCP リクエストを送った場合、サーバー PC はリクエストを受け取ってクライアントに IP を返すが、クライアントがそれを受け取れずに、タイムアウトしてしまう等)、干渉する Iptables ルールが設定されていないか確認してください。