!!フォーワード設定 カーネルパラメータ net.ipv4.ip_forward = 1 にすればフォワードされる。方法は以下のどちらでもよい。 echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -w net.ipv4.ip_forward=1 上記設定をすれば、/etc/sysconfig/network に FORWARD_IPV4=yes を'''記述する必要はない'''。 (そもそもCentOS6以降は FORWARD_IPV4=yes は効かない) 恒久的に設定するには /etc/sysctl.conf に以下を記述する。 net.ipv4.ip_forward = 1 iptables -L -n -v iptables -L -n -v -t nat などのコマンドで設定した内容を確認できる。 !!iptables 設定 !IPv4 #!/bin/sh IPTABLES="/sbin/iptables" #/etc/init.d/iptables stop local0Dev="eno1" local0IP="192.168.0.0/24" local1Dev="enp13s0" local1IP="192.168.1.0/24" ppp0Dev="ppp0" ppp1Dev="ppp1" $IPTABLES -t filter -F #フィルター クリア $IPTABLES -t nat -F #NATクリア $IPTABLES -P FORWARD DROP #全てのフォワードをドロップ $IPTABLES -P INPUT DROP #全てのインバウンドをドロップ $IPTABLES -P OUTPUT ACCEPT #全てのアウトバウンドを許可 #指定ポートのインバウンドを許可 #$IPTABLES -A INPUT -i ${ppp0Dev} -p tcp --dport 2780 -j ACCEPT # $IPTABLES -A INPUT -i ${ppp0Dev} -p tcp --dport 2722 -j ACCEPT #$IPTABLES -A INPUT -i ${ppp0Dev} -p tcp --dport 2723 -j ACCEPT #ループバック(127.0.0.1)を許可 $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT # ICMP echo $IPTABLES -A INPUT -p icmp --icmp-type 8 -j ACCEPT # ICMP echo reply $IPTABLES -A INPUT -p icmp --icmp-type 0 -j ACCEPT #確立しているコネクションとそれに関連したインバウンドを許可 $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #フォワード、マスカレイド設定 $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ### ローカル #### #指定アドレスからのインバウンドを許可 $IPTABLES -A INPUT -i ${local0Dev} -s ${local0IP} -j ACCEPT #フォワード、NAT $IPTABLES -A FORWARD -s ${local0IP} -o ${ppp0Dev} -j ACCEPT $IPTABLES -A FORWARD -s ${local0IP} -o ${ppp1Dev} -j ACCEPT $IPTABLES -t nat -A POSTROUTING -o ${ppp0Dev} -s ${local0IP} -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -o ${ppp1Dev} -s ${local0IP} -j MASQUERADE # 無線からの Synergy を許可 # $IPTABLES -A FORWARD -s ${local1IP} -o ${local0Dev} -p tcp --dport 24800 -j ACCEPT ### 無線 ### #DNSの使用許可 $IPTABLES -A INPUT -p udp -i ${local1Dev} -s ${local1IP} --dport 53 -j ACCEPT # $IPTABLES -A INPUT -i ${local1Dev} -p tcp --dport 2723 -j ACCEPT $IPTABLES -A INPUT -p tcp -m state --state NEW -i ${local1Dev} -s ${local1IP} --dport 53 -j ACCEPT #フォワード、NAT #$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -d ${local1IP} -j ACCEPT $IPTABLES -A FORWARD -s ${local0IP} -o ${local1Dev} -j ACCEPT $IPTABLES -A FORWARD -s ${local1IP} -o ${ppp0Dev} -j ACCEPT $IPTABLES -t nat -A POSTROUTING -o ${ppp0Dev} -s ${local1IP} -j MASQUERADE #$IPTABLES -t nat -A POSTROUTING -o ${ppp1Dev} -s ${local1IP} -j MASQUERADE # interface port toHost toPort returnHost # eth0 8022 192.168.1.100 22 192.168.0.1 function setPortforward(){ #パケットの送信先変換 $IPTABLES -t nat -A PREROUTING -i $1 -p tcp --dport $2 -j DNAT --to $3:$4 #パケットフォワード $IPTABLES -A FORWARD -i $1 -p tcp -d $3 --dport $4 -j ACCEPT #パケットの送信元変換 $IPTABLES -t nat -A POSTROUTING -p tcp -d $3 --dport $4 -j SNAT --to $5 } #指定ポートへのアクセスをローカルPCのポートへ転送 # setPortforward ppp0 3000 192.168.0.2 80 192.168.0.1 ################################################ #Outgoing packet should be real internet Address ################################################ $IPTABLES -A OUTPUT -o ${ppp0Dev} -d 10.0.0.0/8 -j DROP $IPTABLES -A OUTPUT -o ${ppp0Dev} -d 176.16.0.0/12 -j DROP $IPTABLES -A OUTPUT -o ${ppp0Dev} -d 192.168.0.0/16 -j DROP $IPTABLES -A OUTPUT -o ${ppp0Dev} -d 127.0.0.0/8 -j DROP $IPTABLES -A OUTPUT -o ${ppp1Dev} -d 10.0.0.0/8 -j DROP $IPTABLES -A OUTPUT -o ${ppp1Dev} -d 176.16.0.0/12 -j DROP $IPTABLES -A OUTPUT -o ${ppp1Dev} -d 192.168.0.0/16 -j DROP $IPTABLES -A OUTPUT -o ${ppp1Dev} -d 127.0.0.0/8 -j DROP # カーネルパラメータの設定 #echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -w net.ipv4.ip_forward=1 !IPv6 とりあえず必要最低限 #!/bin/sh IPTABLES="/sbin/ip6tables" local0Dev="eno1" local0IP="192.168.0.0/24" local1Dev="enp13s0" local1IP="192.168.1.0/24" ppp0Dev="enp7s0" #ppp1Dev="ppp1" $IPTABLES -t filter -F #フィルター クリア $IPTABLES -t nat -F #NATクリア $IPTABLES -P FORWARD DROP #全てのフォワードをドロップ $IPTABLES -P INPUT DROP #全てのインバウンドをドロップ $IPTABLES -P OUTPUT ACCEPT #全てのアウトバウンドを許可 #ループバック(127.0.0.1)を許可 $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT $IPTABLES -A INPUT -p ipv6-icmp -j ACCEPT #確立しているコネクションとそれに関連したインバウンドを許可 $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #フォワード、マスカレイド設定 $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #sysctl -w net.ipv6.conf.all.forwarding=1 !!設定反映 !iptables service iptablesコマンドでルールを設定したあとで serivce iptables save で設定を保存できる。 保存先 /etc/sysconfig/iptables /etc/sysconfig/ip6tables また、iptables-save で設定を標準出力に表示できる。 iptables-save > iptables ip6tables-save > ip6tables 等で出力してから編集して、/etc/sysconfigにコピーしても良い。 !OS起動時にルールを設定するシェルを実行する(systemd) systemdのサービスを作成し、ネットワークやiptablesの起動後に設定用のシェルが実行されるようにする。 /etc/systemd/system/startup.service [Unit] Description=Funa startup service(oneshot) After=network-online.target iptables.service nss-lookup.target [Service] Type=oneshot ExecStart=/root/bin/startup.sh RemainAfterExit=no [Install] WantedBy=multi-user.target systemctl daemon-reload systemctl enable startup !OS起動時にルールを設定するシェルを実行する(rc.local) この方法場合、 +iptables起動 +/etc/sysconfig/iptables を参照 +rc.local で上記シェルの実行 となる。(rc.* の実行順序で rc.localの実行順序がiptablesより後ならば) なので、/etc/sysconfig/iptables の設定は全ての通信を遮断するか 上記シェルを実行後に /etc/init.d/iptables save を実行し、/etc/sysconfig/iptables と上記シェルと内容を合わせた方が無難。 !!!補足 !!SNATについて http://www.mazn.net/blog/2008/07/18/99.html ポートフォワード時以下の条件を満たす場合は、SNATの設定は不要。 *フォワード先のデフォルトゲートウェイが設定されている場合 *フォワード先からの戻りパケットがNATを行ったマシンを正しく経由する場合 フォワード先からの戻りパケットを正しく返すには、SNATにより送信元を変更する。 {{category2 OS,Linux}}